diff --git a/.circleci/config.yml b/.circleci/config.yml index b06735da..7589e3c9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,6 +1,6 @@ version: 2 jobs: - build: + test: docker: - image: circleci/node:lts working_directory: ~/repo @@ -14,14 +14,15 @@ jobs: paths: - node_modules key: v1-dependencies-{{ checksum "yarn.lock" }} - - run: cd giraffe && yarn run lint - - run: cd giraffe && yarn run typecheck - - run: cd giraffe && yarn run test --collectCoverage - - run: cd giraffe && yarn run build - - run: cd stories && yarn run lint - - run: cd stories && yarn run typecheck + - run: yarn lint + - run: yarn --cwd giraffe test --collectCoverage + - run: yarn --cwd giraffe build + # todo: stories-test runs lint too (lint runs two multiple times) + - run: yarn --cwd stories test - store_artifacts: path: giraffe/coverage + - store_artifacts: + path: stories/cypress/snapshots/**/__diff_output__ # See: https://github.com/influxdata/giraffe/issues/129 # - run: # name: chromatic @@ -34,3 +35,26 @@ jobs: # else \ # yarn run chromatic -- --auto-accept-changes # fi + update-snapshots: + docker: + - image: circleci/node:lts + working_directory: ~/repo + steps: + - checkout + - restore_cache: + keys: + - v1-dependencies-{{ checksum "yarn.lock" }} + - run: yarn install --frozen-lockfile + - run: yarn --cwd stories cy:update + + +workflows: + version: 2 + test: + jobs: + - test + - update-snapshots: + type: approval + requires: + - test + diff --git a/.gitignore b/.gitignore index 1889071e..8eec7a47 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,7 @@ dist .env .vscode coverage + +__diff_output__ +videos +screenshots diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e131514e..28d8fd8f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -61,3 +61,7 @@ Then from the root of the repo, run the publish script: InfluxData takes security and our user's trust very seriously. If you believe you have found a security issue in any of our open source projects, please responsibly disclose it by contacting security@influxdata.com. More details about security vulnerability reporting, including our GPG key, [can be found here](https://www.influxdata.com/how-to-report-security-vulnerabilities/). + +## Cypress + + - TODO diff --git a/giraffe/package.json b/giraffe/package.json index 893415bc..0d95ffb9 100644 --- a/giraffe/package.json +++ b/giraffe/package.json @@ -6,14 +6,17 @@ "license": "MIT", "scripts": { "build": "rm -rf dist && NODE_ENV=production webpack --config webpack.config.js", - "lint": "eslint '{src,../stories/src}/**/*.{ts,tsx}'", - "prettier": "prettier --config ../.prettierrc.json --check '{src,../stories/src}/**/*.{ts,tsx}'", - "prettier:fix": "prettier --config ../.prettierrc.json --write '{src,../stories/src}/**/*.{ts,tsx}'", + "lint": "run-s typecheck eslint prettier", + "lint:fix": "run-s typecheck eslint:fix prettier:fix", + "typecheck": "tsc --noEmit --pretty", + "eslint": "eslint \"{,../stories}/{src,cypress}/**/*.{ts,tsx}\"", + "eslint:fix": "eslint \"{,../stories}/{src,cypress}/**/*.{ts,tsx}\" --fix", + "prettier": "prettier --config ../.prettierrc.json --check \"{,../stories}/{src,cypress}/**/*.{ts,tsx}\"", + "prettier:fix": "prettier --config ../.prettierrc.json --write \"{,../stories}/{src,cypress}/**/*.{ts,tsx}\"", "publish": "echo 'To publish giraffe, run ./publish $version'", "start": "webpack --config webpack.config.js --watch --progress", "test": "jest --collectCoverage --maxWorkers=2", - "test:watch": "jest --collectCoverage --watch --verbose false", - "typecheck": "tsc --noEmit --pretty" + "test:watch": "jest --collectCoverage --watch --verbose false" }, "keywords": [ "band", diff --git a/package.json b/package.json index 6bfbf0ba..21024d86 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,13 @@ "private": true, "workspaces": ["giraffe", "stories"], "scripts": { - "lint": "eslint '{giraffe,stories}/src/**/*.{ts,tsx}'", - "prettier": "prettier --config .prettierrc.json --check '{giraffe,stories}/**/*.{ts,tsx}'", - "prettier:fix": "prettier --config .prettierrc.json --write '{giraffe,stories}/**/*.{ts,tsx}'", - "publish": "echo 'To publish giraffe, run ./giraffe/publish $version'" + "lint": "run-s typecheck eslint prettier", + "lint:fix": "run-s typecheck eslint:fix prettier:fix", + "typecheck": "tsc --noEmit --pretty", + "eslint": "eslint \"{giraffe,stories}/{src,cypress}/**/*.{ts,tsx}\"", + "eslint:fix": "eslint \"{giraffe,stories}/{src,cypress}/**/*.{ts,tsx}\" --fix", + "prettier": "prettier --config .prettierrc.json --check \"{giraffe,stories}/{src,cypress}/**/*.{ts,tsx}\"", + "prettier:fix": "prettier --config .prettierrc.json --write \"{giraffe,stories}/{src,cypress}/**/*.{ts,tsx}\"", + "publish": "echo \"To publish giraffe, run ./giraffe/publish $version\"" } } diff --git a/stories/cypress.json b/stories/cypress.json new file mode 100644 index 00000000..40812548 --- /dev/null +++ b/stories/cypress.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://on.cypress.io/cypress.schema.json", + "baseUrl": "http://localhost:50000/?path=/story/" +} \ No newline at end of file diff --git a/stories/cypress/index.d.ts b/stories/cypress/index.d.ts new file mode 100644 index 00000000..67c65552 --- /dev/null +++ b/stories/cypress/index.d.ts @@ -0,0 +1,29 @@ +/* eslint @typescript-eslint/no-unused-vars: "off" */ +import 'jest' + +import { + getByTestID, + getByInputName, + getByInputValue, + getByTitle, + getByTestIDSubStr, + visitTest, + snapshotComponent, + inputKnobs, +} from './support/commands' + +declare global { + namespace Cypress { + interface Chainable { + + getByTestID: typeof getByTestID + getByInputName: typeof getByInputName + getByInputValue: typeof getByInputValue + getByTitle: typeof getByTitle + getByTestIDSubStr: typeof getByTestIDSubStr + visitTest: typeof visitTest + snapshotComponent: typeof snapshotComponent + inputKnobs: typeof inputKnobs + } + } +} diff --git a/stories/cypress/integration/test.test.ts b/stories/cypress/integration/test.test.ts new file mode 100644 index 00000000..2bcf818d --- /dev/null +++ b/stories/cypress/integration/test.test.ts @@ -0,0 +1,62 @@ + +describe('testing test', () => { + it('should make Gauge snapshot', () => { + cy.visitTest('Gauge', 'Gauge') + cy.inputKnobs('Fixed data', true, 'boolean') + }) + + it('should make snapshot of gauge', () => { + cy.visitTest('Gauge', 'Gauge') + cy.inputKnobs('Fixed data', true, 'boolean') + cy.inputKnobs('Gauge Lines', 12, 'number') + cy.wait(4000) + cy.inputKnobs('Ticks between lines', 3, 'number') + + cy.snapshotComponent('gauge-test-3-ticks-between-lines-12-gauge-lines') + + cy.inputKnobs('Gauge Min', 10, 'number') + + cy.inputKnobs('Prefix', 'haf ', 'text') + cy.wait(2000) + + cy.snapshotComponent('gauge-test-Haf-prefix-10-gauge-min') + }) + + it('should make snapshot of gauge', () => { + cy.visitTest('Gauge', 'Gauge') + cy.inputKnobs('Fixed data', true, 'boolean') + + cy.inputKnobs('Ticks between lines', 3, 'number') + + cy.snapshotComponent('gauge-test-3-ticks-between-lines') + cy.wait(2000) + + cy.inputKnobs('Gauge Max', 23, 'number') + cy.inputKnobs('Suffix', 'HKS', 'text') + cy.wait(2000) + cy.inputKnobs('Suffix', 'halsper ', 'text') + + cy.snapshotComponent('gauge-test-suffix-prefix-type') + + + }) + + it('should make snapchot of gauge', () => { + cy.visitTest('Gauge', 'Gauge') + cy.inputKnobs('Fixed data', true, 'boolean') + + cy.inputKnobs('Decimal Places', 1, 'number') + cy.wait(3000) + + cy.inputKnobs('Gauge Lines', 1, 'number') + cy.inputKnobs('Ticks between lines', 39, 'number') + + cy.inputKnobs('TickPrefix', 'kdfakdhj', 'text') + cy.snapshotComponent('gauge-test-tick-prefix') + + cy.inputKnobs('TickPrefix', ' ', 'text') + cy.inputKnobs('TickSuffix', 'kdkdhj', 'text') + cy.snapshotComponent('gaure-test-ticksSuffix') + } + ) +}) \ No newline at end of file diff --git a/stories/cypress/plugins/index.js b/stories/cypress/plugins/index.js new file mode 100644 index 00000000..1625c0d0 --- /dev/null +++ b/stories/cypress/plugins/index.js @@ -0,0 +1,24 @@ +/// +// *********************************************************** +// 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) + +const {addMatchImageSnapshotPlugin} = require('cypress-image-snapshot/plugin') + +/** + * @type {Cypress.PluginConfig} + */ +module.exports = (on, config) => { + // `on` is used to hook into various events Cypress emits + // `config` is the resolved Cypress config + addMatchImageSnapshotPlugin(on, config) +} diff --git a/stories/cypress/snapshots/test.test.ts/gauge-test-1.snap.png b/stories/cypress/snapshots/test.test.ts/gauge-test-1.snap.png new file mode 100644 index 00000000..b7322ed7 Binary files /dev/null and b/stories/cypress/snapshots/test.test.ts/gauge-test-1.snap.png differ diff --git a/stories/cypress/support/commands.ts b/stories/cypress/support/commands.ts new file mode 100644 index 00000000..a92ae24f --- /dev/null +++ b/stories/cypress/support/commands.ts @@ -0,0 +1,139 @@ +import {addMatchImageSnapshotCommand} from 'cypress-image-snapshot/command' +import {Options as ImageSnapshotOptions} from 'cypress-image-snapshot' + +addMatchImageSnapshotCommand() + +// DOM node getters +export const getByTestID = ( + dataTest: string, + options?: Partial< + Cypress.Loggable & Cypress.Timeoutable & Cypress.Withinable & Cypress.Shadow + > +): Cypress.Chainable => { + return cy.get(`[data-testid="${dataTest}"]`, options) +} + +export const getByTestIDSubStr = (dataTest: string): Cypress.Chainable => { + return cy.get(`[data-testid*="${dataTest}"]`) +} + +export const getByInputName = (name: string): Cypress.Chainable => { + return cy.get(`input[name=${name}]`) +} + +export const getByInputValue = (value: string): Cypress.Chainable => { + return cy.get(`input[value='${value}']`) +} + +export const getByTitle = (name: string): Cypress.Chainable => { + return cy.get(`[title="${name}"]`) +} + +/** + * name is tab group name, storiname is tab name. + */ +export const visitTest = (name: string, storyname: string) => { + /** format string to stories url format */ + const f = (str: string) => + str + .replace(/ /g, '-') + .replace(/:/g, '') + .toLowerCase() + cy.visit(`${f(name)}--${f(storyname)}`) +} + +// todo: replace waitings with reasonable checks(of iframe) +/** + * check snapshot of component with existing + */ +export const snapshotComponent = ( + snapshotName: string, + options: ImageSnapshotOptions = {} +) => { + // cy.get("iframe").its("0.contentDocument").should('exist') + // .its('body').should('not.be.undefined') + // .its(`p[content*='placeholder for']`).contains + + // enter full screen component + cy.wait(1_000) + // todo: better selector for zoom button + cy.get('.css-pvky73 > span > button').click() + + cy.wait(1_000) + cy.matchImageSnapshot(snapshotName, options) + + // exit full screen component + cy.get('.css-pvky73 > span > button').click() + cy.wait(1_000) +} + +export const inputKnobs: { + (label: string, value: string): void + (label: string, value: string, type: 'text'): void + (label: string, value: string, type: 'select'): void + (label: string, value: number, type: 'number'): void + (label: string, value: boolean, type: 'boolean'): void +} = ( + label: string, + value: number | string | boolean, + type: 'range' | 'select' | 'number' | 'text' | 'boolean' = 'text' +) => { + const escapeSpaces = (str: string) => str.replace(/ /, '\\ ') + const selector = `#${escapeSpaces(label)}, [name='${label}']` + switch (type) { + case 'text': + const valueStr = value as string + cy.get(selector) + .clear({force: true}) + .type(valueStr, {force: true}) + break + case 'number': + cy.get(selector) + .clear({force: true}) + .type((value as number).toString(), {force: true}) + break + case 'select': + cy.get(selector).select(value as string) + break + case 'boolean': + cy.get(selector + ' input')[value ? 'check' : 'uncheck']() + break + case 'range': + throw new Error(`Input knobs of type ${type} not implemented`) + // todo: input - range + // cy.get(`[name='${escapeSpaces(label)}']`) + // // .then(x => { + // // x.first().trigger("change", {value}) + // // }) + // // .invoke('val', value) + // // .invoke('attr', 'value', value) + // // .trigger('input', { force: true, data: value }) + // // .trigger('change', { force: true, value }) + // // .invoke('mouseup') + // // .trigger('blur') + // // .type(100) + // // .trigger('mousedown', { which: 1 }) + // // .trigger('mousemove', { clientX: 0, clientY: 100 }) + // // .trigger('mouseup', {force: true}) + // cy.wait(1000) + // break + default: + throw new Error(`Input knobs of type ${type} not implemented`) + } +} + +/* eslint-disable */ + +// getters +Cypress.Commands.add('getByTestID', getByTestID) +Cypress.Commands.add('getByInputName', getByInputName) +Cypress.Commands.add('getByInputValue', getByInputValue) +Cypress.Commands.add('getByTitle', getByTitle) +Cypress.Commands.add('getByTestIDSubStr', getByTestIDSubStr) + +// storybook helpers +Cypress.Commands.add('visitTest', visitTest) +Cypress.Commands.add('snapshotComponent', snapshotComponent) +Cypress.Commands.add('inputKnobs', inputKnobs) + +/* eslint-enable */ diff --git a/stories/cypress/support/index.js b/stories/cypress/support/index.js new file mode 100644 index 00000000..811b152d --- /dev/null +++ b/stories/cypress/support/index.js @@ -0,0 +1,30 @@ +// *********************************************************** +// 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') + +const resizeObserverLoopErrRe = /> ResizeObserver loop limit exceeded/ + +Cypress.on('uncaught:exception', err => { + if (resizeObserverLoopErrRe.test(err.message)) { + // returning false here prevents Cypress from + // failing the test + return false + } +}) diff --git a/stories/cypress/tsconfig.json b/stories/cypress/tsconfig.json new file mode 100644 index 00000000..bbb2c160 --- /dev/null +++ b/stories/cypress/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "strict": true, + "baseUrl": "../node_modules", + "target": "es5", + "lib": ["es2017", "dom"], + "types": ["cypress", "mocha", "node"], + "jsx": "react", + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true + }, + "include": ["**/*.ts","../../node_modules/cypress"] +} diff --git a/stories/package.json b/stories/package.json index b6f60ed1..5c771a60 100644 --- a/stories/package.json +++ b/stories/package.json @@ -3,14 +3,23 @@ "version": "1.0.0", "license": "MIT", "scripts": { - "lint": "eslint '{src,../giraffe/src}/**/*.{ts,tsx}'", - "prettier": "prettier --config ../.prettierrc.json --check '{src,../giraffe/src}/**/*.{ts,tsx}'", - "prettier:fix": "prettier --config ../.prettierrc.json --write '{src,../giraffe/src}/**/*.{ts,tsx}'", + "test": "npm-run-all lint --parallel -r start:ci cy:ci", + "lint": "run-s typecheck eslint prettier", + "lint:fix": "run-s typecheck eslint:fix prettier:fix", "typecheck": "tsc --noEmit --pretty", + "eslint": "eslint \"{,../giraffe}/{src,cypress}/**/*.{ts,tsx}\"", + "eslint:fix": "eslint \"{,../giraffe}/{src,cypress}/**/*.{ts,tsx}\" --fix", + "prettier": "prettier --config ../.prettierrc.json --check \"{,../giraffe}/{src,cypress}/**/*.{ts,tsx}\"", + "prettier:fix": "prettier --config ../.prettierrc.json --write \"{,../giraffe}/{src,cypress}/**/*.{ts,tsx}\"", "start": "yarn -s run prettier:fix && yarn -s run storybook", + "start:ci": "yarn storybook --ci", "storybook": "start-storybook -p 50000", "publish": "storybook-to-ghpages --out=.out", - "chromatic": "chromatic test" + "chromatic": "chromatic test", + "cy": "cypress open --env failOnSnapshotDiff=false", + "cy:ci": "wait-on http://localhost:50000/ && cypress run", + "cy:update": "cypress run --env updateSnapshots=true", + "cy:gen-diff": "cypress run --env failOnSnapshotDiff=false" }, "devDependencies": { "@babel/core": "^7.4.3", @@ -18,6 +27,7 @@ "@storybook/core": "5", "@storybook/react": "^5.0.10", "@storybook/storybook-deployer": "^2.8.1", + "@types/cypress-image-snapshot": "^3.1.5", "@types/memoize-one": "^4.1.1", "@types/node-sass": "^4.11.0", "@types/react": "^16.8.3", @@ -26,8 +36,11 @@ "@typescript-eslint/eslint-plugin": "^1.5.0", "@typescript-eslint/parser": "^1.5.0", "babel-loader": "^8.0.5", + "cross-env": "^7.0.3", "css-loader": "^3.6.0", "css-modules-typescript-loader": "4.0.0", + "cypress": "^6.5.0", + "cypress-image-snapshot": "^4.0.1", "eslint": "^5.15.3", "eslint-config-prettier": "^5.0.0", "eslint-plugin-prettier": "^3.0.1", @@ -35,7 +48,9 @@ "file-loader": "^3.0.1", "intl-dateformat": "^0.1.1", "memoize-one": "^5.0.2", + "npm-run-all": "^4.1.5", "prettier": "^1.19.1", + "process": "^0.11.10", "react-virtualized-auto-sizer": "^1.0.2", "resolve-url-loader": "^3.0.1", "sass": "^1.22.7", @@ -44,6 +59,7 @@ "ts-loader": "^6.0.4", "typescript": "3.8.3", "version-bump-prompt": "^5.0.0", + "wait-on": "^5.2.1", "webpack": "^4.35.3" }, "dependencies": { @@ -53,4 +69,4 @@ "react-dev-utils": "11.0.1", "react-dom": "^16.9.0" } -} +} \ No newline at end of file diff --git a/stories/src/annotation.stories.tsx b/stories/src/annotation.stories.tsx index 542ea71d..74a4dece 100644 --- a/stories/src/annotation.stories.tsx +++ b/stories/src/annotation.stories.tsx @@ -22,12 +22,12 @@ import { annotationPinKnob, } from './helpers' -import {annotationsTable, matchAnnotationsToTable} from './data/annotation' +import {matchAnnotationsToTable, getAnnotationsTable} from './data/annotation' storiesOf('Annotations', module) .addDecorator(withKnobs) .add('Annotations: mark at every point', () => { - const table = annotationsTable + const table = getAnnotationsTable(boolean('Fixed data', false)) const includeLineLayer = boolean('Line Layer', false) const annotationColor = text('Annotation color string', 'green') const annotationDimension = select( @@ -145,7 +145,7 @@ storiesOf('Annotations', module) ) }) .add('Annotations: overridden double click behavior', () => { - const table = annotationsTable + const table = getAnnotationsTable(boolean('Fixed data', false)) const includeLineLayer = boolean('Line Layer', false) const annotationColor = text('Annotation color string', 'green') const annotationDimension = select( @@ -280,7 +280,7 @@ storiesOf('Annotations', module) ) }) .add('Annotations: selectable marks', () => { - const table = annotationsTable + const table = getAnnotationsTable(boolean('Fixed data', false)) const includeLineLayer = boolean('Line Layer', true) const annotationColor = text('Annotation color string', 'green') const annotationDimension = select( @@ -415,7 +415,7 @@ storiesOf('Annotations', module) ) }) .add('Annotations: add your own marks', () => { - const table = annotationsTable + const table = getAnnotationsTable(boolean('Fixed data', false)) const includeLineLayer = boolean('Line Layer', true) const annotationColor = text('Annotation color string', 'green') const annotationDimension = select( diff --git a/stories/src/customLayer.stories.tsx b/stories/src/customLayer.stories.tsx index 4d3bd8af..c3eca75e 100644 --- a/stories/src/customLayer.stories.tsx +++ b/stories/src/customLayer.stories.tsx @@ -27,7 +27,7 @@ import { } from './helpers' import {CPU} from './data/cpu' -import {singleStatTable} from './data/singleStatLayer' +import {getSingleStatTable} from './data/singleStatLayer' storiesOf('Custom Layer', module) .addDecorator(withKnobs) @@ -68,6 +68,8 @@ storiesOf('Custom Layer', module) ) }) .add('Single Stat', () => { + const fixed = boolean('Fixed data', false) + const singleStatTable = getSingleStatTable(fixed) const decimalPlaces = Number(text('Decimal Places', '4')) const textOpacity = number('Single Stat Opacity', 1, { range: true, @@ -123,6 +125,8 @@ storiesOf('Custom Layer', module) ) }) .add('Single Stat on top of Line Layer', () => { + const fixed = boolean('Fixed data', false) + const singleStatTable = getSingleStatTable(fixed) const includeSingleStatLayer = boolean('Single Stat', true) const decimalPlaces = Number(text('Decimal Places', '2')) const textOpacity = number('Single Stat Opacity', 1, { diff --git a/stories/src/data/annotation.ts b/stories/src/data/annotation.ts index 63dba6fa..fda38f09 100644 --- a/stories/src/data/annotation.ts +++ b/stories/src/data/annotation.ts @@ -5,32 +5,31 @@ import { Table, } from '../../../giraffe/src/types' import {newTable} from '../../../giraffe/src' +import {getRandomOrFixed, nowOrFixed} from './utils' -const now = Date.now() const numberOfRecords = 20 const recordsPerLine = 20 const maxValue = 10 -const TIME_COL = [] -const VALUE_COL = [] -const CPU_COL = [] - const DEFAULT_COLOR = 'green' -function getRandomNumber(max) { - return Math.random() * Math.floor(max) -} -for (let i = 0; i < numberOfRecords; i += 1) { - VALUE_COL.push(getRandomNumber(maxValue)) - CPU_COL.push(`cpu${Math.floor(i / recordsPerLine)}`) - TIME_COL.push(now + (i % recordsPerLine) * 1000 * 60) +export const getAnnotationsTable = (fixed: boolean) => { + const TIME_COL = [] + const VALUE_COL = [] + const CPU_COL = [] + + for (let i = 0; i < numberOfRecords; i += 1) { + VALUE_COL.push(getRandomOrFixed(fixed, i, maxValue)) + CPU_COL.push(`cpu${Math.floor(i / recordsPerLine)}`) + TIME_COL.push(nowOrFixed(fixed) + (i % recordsPerLine) * 1000 * 60) + } + + return newTable(numberOfRecords) + .addColumn('_time', 'dateTime:RFC3339', 'time', TIME_COL) + .addColumn('_value', 'system', 'number', VALUE_COL) + .addColumn('cpu', 'string', 'string', CPU_COL) } -export const annotationsTable = newTable(numberOfRecords) - .addColumn('_time', 'dateTime:RFC3339', 'time', TIME_COL) - .addColumn('_value', 'system', 'number', VALUE_COL) - .addColumn('cpu', 'string', 'string', CPU_COL) - interface SampleAnnotationsCreatorOptions { color: string dimension: AnnotationDimension diff --git a/stories/src/data/bandLayer.ts b/stories/src/data/bandLayer.ts index d6165b53..ce8eab58 100644 --- a/stories/src/data/bandLayer.ts +++ b/stories/src/data/bandLayer.ts @@ -1,33 +1,32 @@ import {newTable} from '../../../giraffe/src' +import {getRandomOrFixed, nowOrFixed} from './utils' -const now = Date.now() const numberOfRecords = 40 const recordsPerLine = 20 const maxValue = 100 -const TIME_COL = [] -const VALUE_COL = [] -const CPU_COL = [] -const FIELD_COL = [] -const MEASUREMENT_COL = [] - const fieldName = 'usage_system' const measurementName = 'cpu' -function getRandomNumber(max) { - return Math.random() * Math.floor(max) -} -for (let i = 0; i < numberOfRecords; i += 1) { - FIELD_COL.push(fieldName) - MEASUREMENT_COL.push(measurementName) - VALUE_COL.push(getRandomNumber(maxValue)) - CPU_COL.push(`cpu${Math.floor(i / recordsPerLine)}`) - TIME_COL.push(now + (i % recordsPerLine) * 1000 * 60) -} +export const getBandTable = (fixed: boolean) => { + const TIME_COL = [] + const VALUE_COL = [] + const CPU_COL = [] + const FIELD_COL = [] + const MEASUREMENT_COL = [] -export const bandTable = newTable(numberOfRecords) - .addColumn('_field', 'string', 'string', FIELD_COL) - .addColumn('_measurement', 'string', 'string', MEASUREMENT_COL) - .addColumn('_time', 'dateTime:RFC3339', 'time', TIME_COL) - .addColumn('_value', 'system', 'number', VALUE_COL) - .addColumn('cpu', 'string', 'string', CPU_COL) + for (let i = 0; i < numberOfRecords; i += 1) { + FIELD_COL.push(fieldName) + MEASUREMENT_COL.push(measurementName) + VALUE_COL.push(getRandomOrFixed(fixed, i, maxValue)) + CPU_COL.push(`cpu${Math.floor(i / recordsPerLine)}`) + TIME_COL.push(nowOrFixed(fixed) + (i % recordsPerLine) * 1000 * 60) + } + + return newTable(numberOfRecords) + .addColumn('_field', 'string', 'string', FIELD_COL) + .addColumn('_measurement', 'string', 'string', MEASUREMENT_COL) + .addColumn('_time', 'dateTime:RFC3339', 'time', TIME_COL) + .addColumn('_value', 'system', 'number', VALUE_COL) + .addColumn('cpu', 'string', 'string', CPU_COL) +} diff --git a/stories/src/data/gaugeLayer.ts b/stories/src/data/gaugeLayer.ts index f69f1cde..03414a15 100644 --- a/stories/src/data/gaugeLayer.ts +++ b/stories/src/data/gaugeLayer.ts @@ -1,30 +1,23 @@ -import {newTable, Table} from '../../../giraffe/src' -import memoizeOne from 'memoize-one' +import {newTable} from '../../../giraffe/src' +import {getRandomOrFixed, nowOrFixed} from './utils' -const now = Date.now() const numberOfRecords = 20 const recordsPerLine = 20 -let TIME_COL: Array -let VALUE_COL: Array +export const getGaugeTable = ( + fixed: boolean, + minValue: number, + maxValue: number +) => { + const TIME_COL: Array = [] + const VALUE_COL: Array = [] -function getRandomNumber(min: number, max: number) { - return Math.random() * (max - min) + min -} -const createColumns = (minValue: number, maxValue: number) => { - TIME_COL = [] - VALUE_COL = [] for (let i = 0; i < numberOfRecords; i += 1) { - VALUE_COL.push(getRandomNumber(minValue, maxValue)) - TIME_COL.push(now + (i % recordsPerLine) * 1000 * 60) + VALUE_COL.push(getRandomOrFixed(fixed, i, minValue, maxValue)) + TIME_COL.push(nowOrFixed(fixed) + (i % recordsPerLine) * 1000 * 60) } -} -export const gaugeTable = memoizeOne( - (minValue: number, maxValue: number): Table => { - createColumns(minValue, maxValue) - return newTable(numberOfRecords) - .addColumn('_time', 'dateTime:RFC3339', 'time', TIME_COL) - .addColumn('_value', 'system', 'number', VALUE_COL) - } -) + return newTable(numberOfRecords) + .addColumn('_time', 'dateTime:RFC3339', 'time', TIME_COL) + .addColumn('_value', 'system', 'number', VALUE_COL) +} diff --git a/stories/src/data/geoLayer.ts b/stories/src/data/geoLayer.ts index aa6530f4..3a4d1271 100644 --- a/stories/src/data/geoLayer.ts +++ b/stories/src/data/geoLayer.ts @@ -1,46 +1,35 @@ import {newTable, Table} from '../../../giraffe/src' import memoizeOne from 'memoize-one' +import {getRandomOrFixed, nowOrFixed} from './utils' -const now = Date.now() - -function getRandomNumber(center: number, spread: number) { - return center + (0.5 - Math.random()) * spread * 2 -} - -const createDataColumns = (numberOfRecords: number) => { +export const getGeoTable = (fixed: boolean, numberOfRecords = 200) => { const TIME_COL = [] const VALUE1_COL = [] const VALUE2_COL = [] const LAT_COL = [] const LON_COL = [] for (let i = 0; i < numberOfRecords; i += 1) { - VALUE1_COL.push(getRandomNumber(3.5, 3.5)) - VALUE2_COL.push(getRandomNumber(50, 30)) - LAT_COL.push(getRandomNumber(40, 3)) - LON_COL.push(getRandomNumber(-78, 3)) - TIME_COL.push(now + i * 1000 * 60) + VALUE1_COL.push(getRandomOrFixed(fixed, i, 0, 7)) + VALUE2_COL.push(getRandomOrFixed(fixed, i, 20, 80)) + LAT_COL.push(getRandomOrFixed(fixed, i, 37, 43)) + LON_COL.push(getRandomOrFixed(fixed, i, -81, -75)) + TIME_COL.push(nowOrFixed(fixed) + i * 1000 * 60) } - return {TIME_COL, VALUE1_COL, VALUE2_COL, LAT_COL, LON_COL} -} -export const geoTable = memoizeOne( - (numberOfRecords = 200): Table => { - const columns = createDataColumns(numberOfRecords) - return newTable(numberOfRecords) - .addColumn('_time', 'dateTime:RFC3339', 'time', columns.TIME_COL) - .addColumn('magnitude', 'double', 'number', columns.VALUE1_COL) - .addColumn('duration', 'double', 'number', columns.VALUE2_COL) - .addColumn('lat', 'double', 'number', columns.LAT_COL) - .addColumn('lon', 'double', 'number', columns.LON_COL) - } -) + return newTable(numberOfRecords) + .addColumn('_time', 'dateTime:RFC3339', 'time', TIME_COL) + .addColumn('magnitude', 'double', 'number', VALUE1_COL) + .addColumn('duration', 'double', 'number', VALUE2_COL) + .addColumn('lat', 'double', 'number', LAT_COL) + .addColumn('lon', 'double', 'number', LON_COL) +} -const addTrack = (data, startLat: number, startLon: number) => { +const addTrack = (fixed: boolean, data, startLat: number, startLon: number) => { const tid = Math.floor(Math.random() * 1000) let lat = startLat, lon = startLon for (let i = 0; i < 10; i++) { - const time = now + i * 1000 * 60 + const time = nowOrFixed(fixed) + i * 1000 * 60 lat += Math.random() * 1.5 lon += Math.random() * 1.5 data.push({time, lat, lon, tid}) @@ -48,10 +37,10 @@ const addTrack = (data, startLat: number, startLon: number) => { } export const geoTracks = memoizeOne( - (lon: number, lat: number, count = 1): Table => { + (fixed: boolean, lon: number, lat: number, count = 1): Table => { const data = [] for (let i = 0; i < count; i++) { - addTrack(data, lat - 4, lon - 6) + addTrack(fixed, data, lat - 4, lon - 6) } return newTable(data.length) .addColumn( diff --git a/stories/src/data/randomTable.ts b/stories/src/data/randomTable.ts index 6adf6f55..bcf70c12 100644 --- a/stories/src/data/randomTable.ts +++ b/stories/src/data/randomTable.ts @@ -1,17 +1,14 @@ import {newTable} from '../../../giraffe/src/utils/newTable' import memoizeOne from 'memoize-one' +import {getRandomOrFixed, nowOrFixed} from './utils' -const now = Date.now() const defaultNumberOfRecords = 80 const defaultRecordsPerLine = 20 -function getRandomNumber(max) { - return Math.random() * Math.floor(max) - max / 2 -} - export const getRandomTable = memoizeOne( ( - maxValue: number, + fixed: boolean, + maxValue: number = 200, numberOfRecords: number = defaultNumberOfRecords, recordsPerLine: number = defaultRecordsPerLine ) => { @@ -20,9 +17,9 @@ export const getRandomTable = memoizeOne( const cpuColumn = [] for (let i = 0; i < numberOfRecords; i += 1) { - valueColumn.push(getRandomNumber(maxValue)) + valueColumn.push(getRandomOrFixed(fixed, i, maxValue)) cpuColumn.push(`cpu${Math.floor(i / recordsPerLine)}`) - timeColumn.push(now + (i % recordsPerLine) * 1000 * 60) + timeColumn.push(nowOrFixed(fixed) + (i % recordsPerLine) * 1000 * 60) } return newTable(numberOfRecords) diff --git a/stories/src/data/singleStatLayer.ts b/stories/src/data/singleStatLayer.ts index 3418f4f8..2a7a6a2f 100644 --- a/stories/src/data/singleStatLayer.ts +++ b/stories/src/data/singleStatLayer.ts @@ -1,24 +1,23 @@ import {newTable} from '../../../giraffe/src' +import {getRandomOrFixed, nowOrFixed} from './utils' -const now = Date.now() const numberOfRecords = 20 const recordsPerLine = 20 const maxValue = 10 -const TIME_COL = [] -const VALUE_COL = [] -const CPU_COL = [] +export const getSingleStatTable = (fixed: boolean) => { + const TIME_COL = [] + const VALUE_COL = [] + const CPU_COL = [] -function getRandomNumber(max) { - return Math.random() * Math.floor(max) -} -for (let i = 0; i < numberOfRecords; i += 1) { - VALUE_COL.push(getRandomNumber(maxValue)) - CPU_COL.push(`cpu${Math.floor(i / recordsPerLine)}`) - TIME_COL.push(now + (i % recordsPerLine) * 1000 * 60) -} + for (let i = 0; i < numberOfRecords; i += 1) { + VALUE_COL.push(getRandomOrFixed(fixed, i, maxValue)) + CPU_COL.push(`cpu${Math.floor(i / recordsPerLine)}`) + TIME_COL.push(nowOrFixed(fixed) + (i % recordsPerLine) * 1000 * 60) + } -export const singleStatTable = newTable(numberOfRecords) - .addColumn('_time', 'dateTime:RFC3339', 'time', TIME_COL) - .addColumn('_value', 'system', 'number', VALUE_COL) - .addColumn('cpu', 'string', 'string', CPU_COL) + return newTable(numberOfRecords) + .addColumn('_time', 'dateTime:RFC3339', 'time', TIME_COL) + .addColumn('_value', 'system', 'number', VALUE_COL) + .addColumn('cpu', 'string', 'string', CPU_COL) +} diff --git a/stories/src/data/stackedLineLayer.ts b/stories/src/data/stackedLineLayer.ts index 9b9a8be8..3ab50374 100644 --- a/stories/src/data/stackedLineLayer.ts +++ b/stories/src/data/stackedLineLayer.ts @@ -1,6 +1,6 @@ import {newTable} from '../../../giraffe/src' +import {getRandomOrFixed, nowOrFixed} from './utils' -const now = Date.now() const numberOfRecords = 80 const recordsPerLine = 20 const maxValue = 100 @@ -35,49 +35,49 @@ const alphabet = [ 'z', ] -const TIME_COL = [] -const VALUE_COL = [] -const CPU_COL = [] -const TEST_COL_A = [] -const TEST_COL_B = [] -const TEST_COL_C = [] -const TEST_COL_D = [] - -function getRandomNumber(max) { - return Math.random() * Math.floor(max) -} - -function getRandomAlphabetChar() { - const index = Math.floor(Math.random() * (alphabet.length - 1)) - return alphabet[index] -} +function getRandomString(fixed: boolean, i: number) { + function getRandomAlphabetChar(ii: number) { + const index = Math.floor( + getRandomOrFixed(fixed, ii + i, alphabet.length - 1) + ) + return alphabet[index] + } -function getRandomString() { - const stringLength = getRandomNumber(maxStringLength) + const stringLength = getRandomOrFixed(fixed, i, maxStringLength) let randomString = '' for (let i = 0; i <= stringLength; i++) { - randomString += getRandomAlphabetChar() + randomString += getRandomAlphabetChar(i) } return randomString } -for (let i = 0; i < numberOfRecords; i += 1) { - VALUE_COL.push(getRandomNumber(maxValue)) - CPU_COL.push(`cpu${Math.floor(i / recordsPerLine)}`) - TIME_COL.push(now + (i % recordsPerLine) * 1000 * 60) - TEST_COL_A.push(getRandomString()) - TEST_COL_B.push(getRandomString()) - TEST_COL_C.push(getRandomString()) - TEST_COL_D.push(getRandomString()) -} +export const getStackedLineTable = (fixed: boolean) => { + const TIME_COL = [] + const VALUE_COL = [] + const CPU_COL = [] + const TEST_COL_A = [] + const TEST_COL_B = [] + const TEST_COL_C = [] + const TEST_COL_D = [] + + for (let i = 0; i < numberOfRecords; i += 1) { + VALUE_COL.push(getRandomOrFixed(fixed, i, maxValue)) + CPU_COL.push(`cpu${Math.floor(i / recordsPerLine)}`) + TIME_COL.push(nowOrFixed(fixed) + (i % recordsPerLine) * 1000 * 60) + TEST_COL_A.push(getRandomString(fixed, i * 4 + 0)) + TEST_COL_B.push(getRandomString(fixed, i * 4 + 1)) + TEST_COL_C.push(getRandomString(fixed, i * 4 + 2)) + TEST_COL_D.push(getRandomString(fixed, i * 4 + 3)) + } -export const stackedLineTable = newTable(numberOfRecords) - .addColumn('_time', 'dateTime:RFC3339', 'time', TIME_COL) - .addColumn('_value', 'system', 'number', VALUE_COL) - .addColumn('cpu', 'string', 'string', CPU_COL) - .addColumn('test_col_a', 'string', 'string', TEST_COL_A) - .addColumn('test_col_b', 'string', 'string', TEST_COL_B) - .addColumn('test_col_c', 'string', 'string', TEST_COL_C) - .addColumn('test_col_d', 'string', 'string', TEST_COL_D) + return newTable(numberOfRecords) + .addColumn('_time', 'dateTime:RFC3339', 'time', TIME_COL) + .addColumn('_value', 'system', 'number', VALUE_COL) + .addColumn('cpu', 'string', 'string', CPU_COL) + .addColumn('test_col_a', 'string', 'string', TEST_COL_A) + .addColumn('test_col_b', 'string', 'string', TEST_COL_B) + .addColumn('test_col_c', 'string', 'string', TEST_COL_C) + .addColumn('test_col_d', 'string', 'string', TEST_COL_D) +} diff --git a/stories/src/data/utils.ts b/stories/src/data/utils.ts new file mode 100644 index 00000000..f5d62f15 --- /dev/null +++ b/stories/src/data/utils.ts @@ -0,0 +1,20 @@ +// utilities for fixing data sources of stories for regression testing + +export const getRandomOrFixed: { + (fixed: boolean, index: number, minValue: number, maxValue: number): number + (fixed: boolean, index: number, maxValue: number): number +} = (fixed: boolean, index: number, minValue: number, maxValue?: number) => { + if (maxValue === undefined) { + return getRandomOrFixed(fixed, index, 0, minValue) + } + + if (fixed) { + return ((Math.sin(index) + 1) / 2) * (maxValue - minValue) + minValue + } else { + return Math.random() * (maxValue - minValue) + minValue + } +} + +export const nowOrFixed = (fixed: boolean) => { + return fixed ? 0 : Date.now() +} diff --git a/stories/src/gauge.stories.tsx b/stories/src/gauge.stories.tsx index 73c65016..1a5a721f 100644 --- a/stories/src/gauge.stories.tsx +++ b/stories/src/gauge.stories.tsx @@ -1,15 +1,16 @@ import * as React from 'react' import {storiesOf} from '@storybook/react' -import {withKnobs, number, text} from '@storybook/addon-knobs' +import {withKnobs, number, text, boolean} from '@storybook/addon-knobs' import {Config, Plot, GaugeTheme} from '../../giraffe/src' import {DEFAULT_GAUGE_COLORS} from '../../giraffe/src' import {PlotContainer} from './helpers' -import {gaugeTable} from './data/gaugeLayer' +import {getGaugeTable} from './data/gaugeLayer' storiesOf('Gauge', module) .addDecorator(withKnobs) .add('Gauge', () => { + const fixed = boolean('Fixed data', false) const decimalPlaces = Number(text('Decimal Places', '4')) const lineCount = Number(text('Gauge Lines', '6')) const smallLineCount = Number(text('Ticks between lines', '10')) @@ -37,7 +38,7 @@ storiesOf('Gauge', module) max: 200, step: 1, }) - const gaugeMin = Number(text('Gauge Min', '0')) + const gaugeMin = number('Gauge Min', 0) const gaugeMax = Number(text('Gauge Max', '100')) const prefix = text('Prefix', '') const suffix = text('Suffix', '') @@ -45,7 +46,7 @@ storiesOf('Gauge', module) const tickSuffix = text('TickSuffix', '') const config: Config = { - table: gaugeTable(gaugeMin, gaugeMax), + table: getGaugeTable(fixed, gaugeMin, gaugeMax), layers: [ { type: 'gauge', diff --git a/stories/src/geo.stories.tsx b/stories/src/geo.stories.tsx index 9d280ceb..12069741 100644 --- a/stories/src/geo.stories.tsx +++ b/stories/src/geo.stories.tsx @@ -3,7 +3,7 @@ import {storiesOf} from '@storybook/react' import {Config, Plot} from '../../giraffe/src' import {PlotContainer} from './helpers' -import {geoTable, geoTracks} from './data/geoLayer' +import {getGeoTable, geoTracks} from './data/geoLayer' import { boolean, color, @@ -53,6 +53,7 @@ const genericKnobs = () => { } const buildCircleMapStory = tileServerConfiguration => () => { + const fixed = boolean('Fixed data', false) const numberOfRecords = number('Circle count', 26, { range: true, min: 0, @@ -61,7 +62,7 @@ const buildCircleMapStory = tileServerConfiguration => () => { }) const {allowPanAndZoom, latitude, longitude, zoom} = genericKnobs() const config: Config = { - table: geoTable(numberOfRecords), + table: getGeoTable(fixed, numberOfRecords), showAxes: false, layers: [ { @@ -99,6 +100,7 @@ const buildCircleMapStory = tileServerConfiguration => () => { geo.add('Circle Markers', buildCircleMapStory(osmTileServerConfiguration)) geo.add('Map Markers Static', () => { + const fixed = boolean('Fixed data', false) const numberOfRecords = number('Marker count', 20, { range: true, min: 0, @@ -107,7 +109,7 @@ geo.add('Map Markers Static', () => { }) const {allowPanAndZoom, latitude, longitude, zoom} = genericKnobs() const config: Config = { - table: geoTable(numberOfRecords), + table: getGeoTable(fixed, numberOfRecords), showAxes: false, layers: [ { @@ -182,6 +184,7 @@ geo.add('Map Markers Custom CSV', () => { }) geo.add('Marker Clustering', () => { + const fixed = boolean('Fixed data', false) const {allowPanAndZoom, latitude, longitude, zoom} = genericKnobs() const maxClusterRadius = number('Maximum Cluster Radius', 50, { range: true, @@ -201,7 +204,7 @@ geo.add('Marker Clustering', () => { ClusterAggregation.mean ) const config: Config = { - table: geoTable(200), + table: getGeoTable(fixed, 200), showAxes: false, layers: [ { @@ -256,6 +259,7 @@ const heatmapKnobs = () => { } geo.add('Heatmap', () => { + const fixed = boolean('Fixed data', false) const numberOfPoints = number('Data point count', 200, { range: true, min: 0, @@ -265,7 +269,7 @@ geo.add('Heatmap', () => { const {allowPanAndZoom, latitude, longitude, zoom} = genericKnobs() const {radius, blur} = heatmapKnobs() const config: Config = { - table: geoTable(numberOfPoints), + table: getGeoTable(fixed, numberOfPoints), showAxes: false, layers: [ { @@ -333,6 +337,7 @@ const trackKnobs = () => { } geo.add('Tracks', () => { + const fixed = boolean('Fixed data', false) const numberOfTracks = number('Track count', 3, { range: true, min: 0, @@ -350,7 +355,7 @@ geo.add('Tracks', () => { endStopMarkerRadius, } = trackKnobs() const config: Config = { - table: geoTracks(-74, 40, numberOfTracks), + table: geoTracks(fixed, -74, 40, numberOfTracks), showAxes: false, layers: [ { @@ -388,6 +393,7 @@ geo.add('Tracks', () => { }) geo.add('Layering visualizations', () => { + const fixed = boolean('Fixed data', false) const {allowPanAndZoom, latitude, longitude, zoom} = genericKnobs() const { speed, @@ -398,7 +404,7 @@ geo.add('Layering visualizations', () => { endStopMarkerRadius, } = trackKnobs() const config: Config = { - table: geoTracks(-74, 40), + table: geoTracks(fixed, -74, 40), showAxes: false, layers: [ { diff --git a/stories/src/index.stories.tsx b/stories/src/index.stories.tsx index 7dd651e1..c0640e16 100644 --- a/stories/src/index.stories.tsx +++ b/stories/src/index.stories.tsx @@ -3,7 +3,7 @@ import {storiesOf} from '@storybook/react' import {withKnobs, number, select, boolean, text} from '@storybook/addon-knobs' import {Config, Plot, MAGMA, timeFormatter} from '../../giraffe/src' -import {stackedLineTable} from './data/stackedLineLayer' +import {getStackedLineTable} from './data/stackedLineLayer' import { PlotContainer, @@ -27,7 +27,8 @@ import { storiesOf('XY Plot', module) .addDecorator(withKnobs) .add('Stacked Line Layer', () => { - const table = tableKnob(stackedLineTable) + const baseTable = getStackedLineTable(boolean('Fixed data', false)) + const table = tableKnob(baseTable) const colors = colorSchemeKnob() const legendFont = legendFontKnob() const tickFont = tickFontKnob() diff --git a/stories/src/linegraph.stories.tsx b/stories/src/linegraph.stories.tsx index b1282fb5..f9c6e0b6 100644 --- a/stories/src/linegraph.stories.tsx +++ b/stories/src/linegraph.stories.tsx @@ -25,12 +25,10 @@ import { import {tooltipFalsyValues} from './data/fluxCSV' -const maxValue = Math.random() * Math.floor(200) - storiesOf('Line Graph', module) .addDecorator(withKnobs) .add('User defined ticks', () => { - let table = getRandomTable(maxValue) + let table = getRandomTable(boolean('Fixed data', false)) const xTickStart = number('xTickStart', new Date().getTime()) const xTickStep = number('xTickStep', 200_000) const xTotalTicks = number('xTotalTicks', 5) diff --git a/stories/src/utilities.stories.tsx b/stories/src/utilities.stories.tsx index c280f69e..0142f75a 100644 --- a/stories/src/utilities.stories.tsx +++ b/stories/src/utilities.stories.tsx @@ -10,7 +10,7 @@ import { fromFlux, timeFormatter, } from '../../giraffe/src' -import {stackedLineTable} from './data/stackedLineLayer' +import {getStackedLineTable} from './data/stackedLineLayer' import {PlotEnv} from '../../giraffe/src/utils/PlotEnv' @@ -51,7 +51,8 @@ import { storiesOf('Utilities', module) .addDecorator(withKnobs) .add('Screenshot A Stacked Line Layer', () => { - const table = tableKnob(stackedLineTable) + const baseTable = getStackedLineTable(boolean('fixed data', false)) + const table = tableKnob(baseTable) const colors = colorSchemeKnob() const legendFont = legendFontKnob() const tickFont = tickFontKnob() diff --git a/tsconfig.json b/tsconfig.json index 5e85b2af..68f07d65 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,15 @@ "compilerOptions": { "target": "es5", "module": "es2015", - "lib": ["es5", "es2015", "es2016", "es2017", "es2018", "esnext", "dom"], + "lib": [ + "es5", + "es2015", + "es2016", + "es2017", + "es2018", + "esnext", + "dom" + ], "sourceMap": true, "allowJs": false, "jsx": "react", @@ -16,5 +24,8 @@ "strictNullChecks": false, "downlevelIteration": true, "skipLibCheck": true - } + }, + "exclude": [ + "./stories/cypress" + ] } diff --git a/yarn.lock b/yarn.lock index cb33fed4..6a07f0c7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1272,6 +1272,50 @@ exec-sh "^0.3.2" minimist "^1.2.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/request@^2.88.5": + version "2.88.5" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.5.tgz#8d7ecd17b53a849cfd5ab06d5abe7d84976375d7" + integrity sha512-TzEC1XMi1hJkywWpRfD2clreTa/Z+lOrXDCxxBTBPEcY5azdPi56A6Xw+O4tWJnaJH3iIE7G5aDXZC6JgRZLcA== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.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" + "@discoveryjs/json-ext@^0.5.0": version "0.5.2" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz#8f03a22a04de437254e8ce8cc84ba39689288752" @@ -1425,6 +1469,18 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.2.tgz#63985d3d8b02530e0869962f4da09142ee8e200e" integrity sha512-n/VQ4mbfr81aqkx/XmVicOLjviMuy02eenSdJY33SVA7S2J42EU0P1H0mOogfYedb3wXA0d/LVtBrgTSm04WEA== +"@hapi/hoek@^9.0.0": + version "9.1.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.1.1.tgz#9daf5745156fd84b8e9889a2dc721f0c58e894aa" + integrity sha512-CAEbWH7OIur6jEOzaai83jq3FmKmv4PmX1JYfs9IrYcGEVI/lyL1EXJGCj7eFVJ0bg5QR8LMxBlEtA+xKiLpFw== + +"@hapi/topo@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.0.0.tgz#c19af8577fa393a06e9c77b60995af959be721e7" + integrity sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@icons/material@^0.2.4": version "0.2.4" resolved "https://registry.yarnpkg.com/@icons/material/-/material-0.2.4.tgz#e90c9f71768b3736e76d7dd6783fc6c2afa88bc8" @@ -1778,6 +1834,23 @@ dependencies: any-observable "^0.3.0" +"@sideway/address@^4.1.0": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.1.tgz#9e321e74310963fdf8eebfbee09c7bd69972de4d" + integrity sha512-+I5aaQr3m0OAmMr7RQ3fR9zx55sejEYR2BFJaxL+zT3VM2611X0SHvPWIbAUBZVTn/YzYKbV8gJ2oT/QELknfQ== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" + integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + "@sindresorhus/is@^0.7.0": version "0.7.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" @@ -2294,6 +2367,11 @@ dependencies: "@babel/types" "^7.3.0" +"@types/cypress-image-snapshot@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@types/cypress-image-snapshot/-/cypress-image-snapshot-3.1.5.tgz#03d5b8e089e96a493da31bdb9aef16f34c0000c1" + integrity sha512-PoYmfojdRxrAi5kXi60NKSw3f9tmP7wGtyoRpMMcV4rlEOUzpyO6zmE9G0Z42u7i9erlyrwLVqFpbsN+uLq1Kg== + "@types/d3-array@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-2.0.0.tgz#a0d63a296a2d8435a9ec59393dcac746c6174a96" @@ -2487,6 +2565,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.10.tgz#51babf9c7deadd5343620055fc8aff7995c8b031" integrity sha512-LcsGbPomWsad6wmMNv7nBLw7YYYyfdYcz6xryKYQhx89c3XXan+8Q6AJ43G5XDIaklaVkK3mE4fCb0SBvMiPSQ== +"@types/node@12.12.50": + version "12.12.50" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.50.tgz#e9b2e85fafc15f2a8aa8fdd41091b983da5fd6ee" + integrity sha512-5ImO01Fb8YsEOYpV+aeyGYztcYcjGsBvN4D7G5r1ef2cuQOpymjWNQi5V0rKHE6PC2ru3HkoUr/Br2/8GUA84w== + "@types/node@>= 8": version "14.14.20" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.20.tgz#f7974863edd21d1f8a494a73e8e2b3658615c340" @@ -2527,6 +2610,16 @@ "@types/prop-types" "*" csstype "^2.2.0" +"@types/sinonjs__fake-timers@^6.0.1": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz#3a84cf5ec3249439015e14049bd3161419bf9eae" + integrity sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg== + +"@types/sizzle@^2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.2.tgz#a811b8c18e2babab7d542b3365887ae2e4d9de47" + integrity sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg== + "@types/source-list-map@*": version "0.1.2" resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" @@ -3203,6 +3296,13 @@ ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== +ansi-escapes@^4.1.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + ansi-escapes@^4.2.1: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" @@ -3275,6 +3375,13 @@ anymatch@^3.0.3, anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" +app-path@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/app-path/-/app-path-3.2.0.tgz#06d426e0c988885264e0aa0a766dfa2723491633" + integrity sha512-PQPaKXi64FZuofJkrtaO3I5RZESm9Yjv7tkeJaDz4EZMeBBfGtr5MyQ3m5AC7F0HVrISBLatPxAAAgvbe418fQ== + dependencies: + execa "^1.0.0" + app-root-dir@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/app-root-dir/-/app-root-dir-1.0.2.tgz#38187ec2dea7577fff033ffcb12172692ff6e118" @@ -3285,6 +3392,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.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + are-we-there-yet@~1.1.2: version "1.1.5" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" @@ -3501,6 +3613,11 @@ async@^2.1.4: dependencies: lodash "^4.17.11" +async@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" + integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -3561,6 +3678,13 @@ axios@0.19.0: follow-redirects "1.5.10" is-buffer "^2.0.2" +axios@^0.21.1: + version "0.21.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" + integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== + dependencies: + follow-redirects "^1.10.0" + babel-code-frame@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -3973,6 +4097,11 @@ base64-js@^1.0.2: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== +base64-js@^1.2.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" @@ -4013,6 +4142,11 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== +blob-util@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" + integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== + block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" @@ -4025,6 +4159,11 @@ bluebird@^3.3.5, bluebird@^3.5.5: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== +bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.9" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" @@ -4223,6 +4362,11 @@ bser@^2.0.0: dependencies: node-int64 "^0.4.0" +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + buffer-from@1.x, buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -4300,6 +4444,11 @@ cacheable-request@^2.1.1: normalize-url "2.0.1" responselike "1.0.2" +cachedir@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" + integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== + 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" @@ -4518,6 +4667,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= + "chokidar@>=2.0.0 <4.0.0": version "3.4.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" @@ -4655,6 +4809,13 @@ cli-boxes@^2.2.0: resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d" integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w== +cli-cursor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc= + dependencies: + restore-cursor "^1.0.1" + cli-cursor@^2.0.0, cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" @@ -4679,6 +4840,16 @@ cli-table3@0.5.1: optionalDependencies: colors "^1.1.2" +cli-table3@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.0.tgz#b7b1bc65ca8e7b5cef9124e13dc2b21e2ce4faee" + integrity sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ== + dependencies: + object-assign "^4.1.0" + string-width "^4.2.0" + optionalDependencies: + colors "^1.1.2" + cli-truncate@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" @@ -4868,6 +5039,11 @@ commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + commander@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.1.0.tgz#f2eaecf131f10e36e07d894698226e36ae0eb5ff" @@ -4905,7 +5081,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0: +concat-stream@^1.5.0, concat-stream@^1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -5114,6 +5290,13 @@ create-react-context@^0.2.1: fbjs "^0.8.0" gud "^1.0.0" +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -5125,7 +5308,7 @@ cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -5350,6 +5533,64 @@ cyclist@~0.2.2: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= +cypress-image-snapshot@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cypress-image-snapshot/-/cypress-image-snapshot-4.0.1.tgz#59084e713a8d03500c8e053ad7a76f3f18609648" + integrity sha512-PBpnhX/XItlx3/DAk5ozsXQHUi72exybBNH5Mpqj1DVmjq+S5Jd9WE5CRa4q5q0zuMZb2V2VpXHth6MjFpgj9Q== + dependencies: + chalk "^2.4.1" + fs-extra "^7.0.1" + glob "^7.1.3" + jest-image-snapshot "4.2.0" + pkg-dir "^3.0.0" + term-img "^4.0.0" + +cypress@^6.5.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-6.6.0.tgz#659c64cdb06e51b6be18fdac39d8f192deb54fa0" + integrity sha512-+Xx3Zn653LJHUsCb9h1Keql2jlazbr1ROmbY6DFJMmXKLgXP4ez9cE403W93JNGRbZK0Tng3R/oP8mvd9XAPVg== + dependencies: + "@cypress/listr-verbose-renderer" "^0.4.1" + "@cypress/request" "^2.88.5" + "@cypress/xvfb" "^1.2.4" + "@types/node" "12.12.50" + "@types/sinonjs__fake-timers" "^6.0.1" + "@types/sizzle" "^2.3.2" + arch "^2.1.2" + blob-util "2.0.2" + bluebird "^3.7.2" + cachedir "^2.3.0" + chalk "^4.1.0" + check-more-types "^2.24.0" + cli-table3 "~0.6.0" + commander "^5.1.0" + common-tags "^1.8.0" + dayjs "^1.9.3" + debug "4.3.2" + eventemitter2 "^6.4.2" + execa "^4.0.2" + executable "^4.1.1" + extract-zip "^1.7.0" + fs-extra "^9.0.1" + getos "^3.2.1" + is-ci "^2.0.0" + is-installed-globally "^0.3.2" + lazy-ass "^1.6.0" + listr "^0.14.3" + lodash "^4.17.19" + log-symbols "^4.0.0" + minimist "^1.2.5" + moment "^2.29.1" + ospath "^1.2.2" + pretty-bytes "^5.4.1" + ramda "~0.27.1" + request-progress "^3.0.0" + supports-color "^7.2.0" + tmp "~0.2.1" + untildify "^4.0.0" + url "^0.11.0" + yauzl "^2.10.0" + "d3-array@^1.2.0 || 2", d3-array@^2.0.3: version "2.2.0" resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.2.0.tgz#a9e966b8f8d78f0888d98db1fb840fc8da8ac5c7" @@ -5460,7 +5701,12 @@ date-now@^0.1.4: resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0: +dayjs@^1.9.3: + version "1.10.4" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.4.tgz#8e544a9b8683f61783f570980a8a80eaf54ab1e2" + integrity sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw== + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -5474,6 +5720,13 @@ debug@3.2.6, debug@^3.2.5, debug@^3.2.6: dependencies: ms "^2.1.1" +debug@4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + debug@=3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -5481,7 +5734,7 @@ debug@=3.1.0: dependencies: ms "2.0.0" -debug@^3.0.1: +debug@^3.0.1, debug@^3.1.0: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -6402,6 +6655,11 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= +eventemitter2@^6.4.2: + version "6.4.4" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.4.tgz#aa96e8275c4dbeb017a5d0e03780c65612a1202b" + integrity sha512-HLU3NDY6wARrLCEwyGKRBvuWYyvW6mHYv72SJJAH3iJN3a6eVUvkjFkcxah1bcTgGVBBrFdIopBJPhCQFMLyXw== + eventemitter3@^3.1.0: version "3.1.2" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" @@ -6463,7 +6721,7 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^4.0.0: +execa@^4.0.0, execa@^4.0.2: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== @@ -6493,6 +6751,18 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.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" + +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g= + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -6609,6 +6879,16 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extract-zip@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" + integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== + dependencies: + concat-stream "^1.6.2" + debug "^2.6.9" + mkdirp "^0.5.4" + yauzl "^2.10.0" + extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -6729,6 +7009,13 @@ fbjs@^0.8.0, fbjs@^0.8.1: setimmediate "^1.0.5" ua-parser-js "^0.7.18" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + dependencies: + pend "~1.2.0" + figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" @@ -6929,6 +7216,11 @@ follow-redirects@1.5.10: dependencies: debug "=3.1.0" +follow-redirects@^1.10.0: + version "1.13.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.3.tgz#e5598ad50174c1bc4e872301e82ac2cd97f90267" + integrity sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA== + for-in@^0.1.3: version "0.1.8" resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" @@ -7028,6 +7320,15 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.0.1.tgz#90294081f978b1f182f347a440a209154344285b" @@ -7047,6 +7348,16 @@ fs-extra@^9.0.0: jsonfile "^6.0.1" universalify "^1.0.0" +fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-minipass@^1.2.5: version "1.2.6" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" @@ -7172,6 +7483,11 @@ get-stdin@^4.0.1: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= +get-stdin@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" + integrity sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g= + get-stdin@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" @@ -7206,6 +7522,13 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= +getos@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" + integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== + dependencies: + async "^3.2.0" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -7297,6 +7620,13 @@ glob@^7.0.3, glob@^7.1.6, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" +global-dirs@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.1.0.tgz#e9046a49c806ff04d6c1825e196c8f0091e8df4d" + integrity sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ== + dependencies: + ini "1.3.7" + global-modules@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -7390,6 +7720,11 @@ globule@^1.0.0: lodash "~4.17.10" minimatch "~3.0.2" +glur@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/glur/-/glur-1.1.2.tgz#f20ea36db103bfc292343921f1f91e83c3467689" + integrity sha1-8g6jbbEDv8KSNDkh8fkeg8NGdok= + good-listener@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" @@ -7911,7 +8246,7 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.5, ini@~1.3.0: +ini@1.3.7, ini@^1.3.5, ini@~1.3.0: version "1.3.7" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== @@ -8235,6 +8570,14 @@ is-hexadecimal@^1.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz#e8a426a69b6d31470d3a33a47bb825cda02506ee" integrity sha512-zxQ9//Q3D/34poZf8fiy3m3XVpbQc7ren15iKqrTtLPwkPD/t3Scy9Imp63FujULGxuK0ZlCwoo5xNpktFgbOA== +is-installed-globally@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" + integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== + dependencies: + global-dirs "^2.0.1" + is-path-inside "^3.0.1" + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -8259,6 +8602,11 @@ is-observable@^1.1.0: dependencies: symbol-observable "^1.1.0" +is-path-inside@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" + integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== + is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -8455,6 +8803,14 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" +iterm2-version@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/iterm2-version/-/iterm2-version-4.2.0.tgz#b78069f747f34a772bc7dc17bda5bd9ed5e09633" + integrity sha512-IoiNVk4SMPu6uTcK+1nA5QaHNok2BMDLjSl5UomrOixe5g4GkylhPwuiGdw00ysSCrXAKNMfFTu+u/Lk5f6OLQ== + dependencies: + app-path "^3.2.0" + plist "^3.0.1" + java-properties@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-1.0.2.tgz#ccd1fa73907438a5b5c38982269d0e771fe78211" @@ -8610,6 +8966,21 @@ jest-haste-map@^26.6.2: optionalDependencies: fsevents "^2.1.2" +jest-image-snapshot@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/jest-image-snapshot/-/jest-image-snapshot-4.2.0.tgz#559d7ade69e9918517269cef184261c80029a69e" + integrity sha512-6aAqv2wtfOgxiJeBayBCqHo1zX+A12SUNNzo7rIxiXh6W6xYVu8QyHWkada8HeRi+QUTHddp0O0Xa6kmQr+xbQ== + dependencies: + chalk "^1.1.3" + get-stdin "^5.0.1" + glur "^1.1.2" + lodash "^4.17.4" + mkdirp "^0.5.1" + pixelmatch "^5.1.0" + pngjs "^3.4.0" + rimraf "^2.6.2" + ssim.js "^3.1.1" + jest-jasmine2@^26.6.3: version "26.6.3" resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" @@ -8884,6 +9255,17 @@ jest@^26.6.3: import-local "^3.0.2" jest-cli "^26.6.3" +joi@^17.3.0: + version "17.4.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.4.0.tgz#b5c2277c8519e016316e49ababd41a1908d9ef20" + integrity sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.0" + "@sideway/formula" "^3.0.0" + "@sideway/pinpoint" "^2.0.0" + js-base64@^2.1.8: version "2.6.3" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.3.tgz#7afdb9b57aa7717e15d370b66e8f36a9cb835dc3" @@ -9148,6 +9530,11 @@ klona@^2.0.4: resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== +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" @@ -9265,7 +9652,7 @@ listr-verbose-renderer@^0.5.0: date-fns "^1.27.2" figures "^2.0.0" -listr@0.14.3: +listr@0.14.3, listr@^0.14.3: version "0.14.3" resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== @@ -9500,6 +9887,11 @@ lodash.min@^4.0.0: resolved "https://registry.yarnpkg.com/lodash.min/-/lodash.min-4.0.1.tgz#4ac1b9a8baf8b6d28a690d716512510cfc14708c" integrity sha1-SsG5qLr4ttKKaQ1xZRJRDPwUcIw= +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= + lodash.pairs@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash.pairs/-/lodash.pairs-3.0.1.tgz#bbe08d5786eeeaa09a15c91ebf0dcb7d2be326a9" @@ -9552,6 +9944,11 @@ lodash@^4.0.0, lodash@^4.0.1, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== +lodash@^4.17.20, lodash@^4.17.4: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + log-symbols@2.2.0, log-symbols@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -9573,6 +9970,13 @@ log-symbols@^3.0.0: dependencies: chalk "^2.4.2" +log-symbols@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + log-update@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" @@ -10101,7 +10505,7 @@ mkdirp@1.x: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -"mkdirp@>=0.5 0": +"mkdirp@>=0.5 0", mkdirp@^0.5.4: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -10137,7 +10541,7 @@ mocha@^6.1.4: yargs-parser "13.0.0" yargs-unparser "1.5.0" -moment@^2.18.1: +moment@^2.18.1, moment@^2.29.1: version "2.29.1" resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== @@ -10727,6 +11131,11 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +onetime@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k= + onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" @@ -10847,6 +11256,11 @@ osenv@0, osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +ospath@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" + integrity sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs= + p-cancelable@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" @@ -11171,6 +11585,11 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -11191,7 +11610,7 @@ pidtree@^0.3.0: resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.0.tgz#f6fada10fccc9f99bf50e90d0b23d72c9ebc2e6b" integrity sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg== -pify@^2.0.0: +pify@^2.0.0, pify@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= @@ -11225,6 +11644,13 @@ pirates@^4.0.1: dependencies: node-modules-regexp "^1.0.0" +pixelmatch@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-5.2.1.tgz#9e4e4f4aa59648208a31310306a5bed5522b0d65" + integrity sha512-WjcAdYSnKrrdDdqTcVEY7aB7UhhwjYQKYhHiBXdJef0MOaQeYpUdQ+iVyBLa5YBKS8MPVPPMX7rpOByISLpeEQ== + dependencies: + pngjs "^4.0.1" + pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -11253,11 +11679,30 @@ pkg-up@3.1.0, pkg-up@^3.1.0: dependencies: find-up "^3.0.0" +plist@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.1.tgz#a9b931d17c304e8912ef0ba3bdd6182baf2e1f8c" + integrity sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ== + dependencies: + base64-js "^1.2.3" + xmlbuilder "^9.0.7" + xmldom "0.1.x" + pluralize@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== +pngjs@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + +pngjs@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-4.0.1.tgz#f803869bb2fc1bfe1bf99aa4ec21c108117cfdbe" + integrity sha512-rf5+2/ioHeQxR6IxuYNYGFytUyG3lma/WW1nsmjeHlWwtb2aByla6dkVc8pmJ9nplzkTA0q2xx7mMWrOTqT4Gg== + pnp-webpack-plugin@1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.4.3.tgz#0a100b63f4a1d09cee6ee55a87393b69f03ab5c7" @@ -11502,6 +11947,11 @@ prettier@^1.19.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== +pretty-bytes@^5.4.1: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + pretty-error@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" @@ -11771,6 +12221,11 @@ ramda@^0.21.0: resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.21.0.tgz#a001abedb3ff61077d4ff1d577d44de77e8d0a35" integrity sha1-oAGr7bP/YQd9T/HVd9RN536NCjU= +ramda@~0.27.1: + version "0.27.1" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9" + integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== + randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -12500,6 +12955,13 @@ replace-ext@1.0.0: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= +request-progress@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" + integrity sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4= + dependencies: + throttleit "^1.0.0" + request-promise-core@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" @@ -12673,6 +13135,14 @@ responselike@1.0.2: dependencies: lowercase-keys "^1.0.0" +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE= + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -12717,7 +13187,7 @@ rework@1.0.1: convert-source-map "^0.3.3" css "^2.0.0" -rimraf@2: +rimraf@2, rimraf@^2.6.2: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -12789,6 +13259,13 @@ rxjs@^6.4.0: dependencies: tslib "^1.9.0" +rxjs@^6.6.3: + version "6.6.6" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.6.tgz#14d8417aa5a07c5e633995b525e1e3c0dec03b70" + integrity sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg== + dependencies: + tslib "^1.9.0" + s2-geometry@^1.2.10: version "1.2.10" resolved "https://registry.yarnpkg.com/s2-geometry/-/s2-geometry-1.2.10.tgz#c6ff22f3eccafd0eea491b60b44c141b9887acab" @@ -13435,6 +13912,11 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +ssim.js@^3.1.1: + version "3.5.0" + resolved "https://registry.yarnpkg.com/ssim.js/-/ssim.js-3.5.0.tgz#d7276b9ee99b57a5ff0db34035f02f35197e62df" + integrity sha512-Aj6Jl2z6oDmgYFFbQqK7fght19bXdOxY7Tj03nF+03M9gCBAjeIiO8/PlEGMfKDwYpw4q6iBqVq2YuREorGg/g== + ssri@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" @@ -13772,7 +14254,7 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.0.0, supports-color@^7.1.0, supports-color@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -13879,6 +14361,14 @@ telejson@^2.2.1: lodash.get "^4.4.2" memoizerific "^1.11.3" +term-img@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/term-img/-/term-img-4.1.0.tgz#5b170961f7aa20b2f3b22deb8ad504beb963a8a5" + integrity sha512-DFpBhaF5j+2f7kheKFc1ajsAUUDGOaNPpKPtiIMxlbfud6mvfFZuWGnTRpaujUa5J7yl6cIw/h6nyr4mSsENPg== + dependencies: + ansi-escapes "^4.1.0" + iterm2-version "^4.1.0" + term-size@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" @@ -13959,6 +14449,11 @@ throat@^5.0.0: resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== +throttleit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= + through2@^2.0.0, through2@~2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -14008,7 +14503,7 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@^0.2.0: +tmp@^0.2.0, tmp@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== @@ -14234,6 +14729,11 @@ type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + type-fest@^0.18.0: version "0.18.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" @@ -14433,6 +14933,11 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + upath@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" @@ -14659,6 +15164,17 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" +wait-on@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-5.2.1.tgz#05b66fcb4d7f5da01537f03e7cf96e8836422996" + integrity sha512-H2F986kNWMU9hKlI9l/ppO6tN8ZSJd35yBljMLa1/vjzWP++Qh6aXyt77/u7ySJFZQqBtQxnvm/xgG48AObXcw== + dependencies: + axios "^0.21.1" + joi "^17.3.0" + lodash "^4.17.20" + minimist "^1.2.5" + rxjs "^6.6.3" + walker@^1.0.7, walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -15060,11 +15576,21 @@ xmlbuilder@^10.0.0: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-10.1.1.tgz#8cae6688cc9b38d850b7c8d3c0a4161dcaf475b0" integrity sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg== +xmlbuilder@^9.0.7: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= + xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +xmldom@0.1.x: + version "0.1.31" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" + integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== + xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" @@ -15250,6 +15776,14 @@ yarn-or-npm@^3.0.1: cross-spawn "^6.0.5" pkg-dir "^4.2.0" +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"