mirror of
https://github.com/storybookjs/storybook.git
synced 2025-01-13 23:52:32 +08:00
delete cypress usage
This commit is contained in:
parent
d6401954f7
commit
a6095a4a44
@ -27,21 +27,6 @@ executors:
|
||||
environment:
|
||||
NODE_OPTIONS: --max_old_space_size=3076
|
||||
resource_class: <<parameters.class>>
|
||||
sb_cypress_8_node_14:
|
||||
parameters:
|
||||
class:
|
||||
description: The Resource class
|
||||
type: enum
|
||||
enum: ['small', 'medium', 'medium+', 'large', 'xlarge']
|
||||
default: 'medium'
|
||||
working_directory: /tmp/storybook
|
||||
docker:
|
||||
# ⚠️ The Cypress docker image is based on Node.js one so be careful when updating it because it can also
|
||||
# cause an upgrade of Node.js version too. Cypress 8.5 image is based on Node.js 14
|
||||
- image: cypress/included:8.7.0
|
||||
environment:
|
||||
NODE_OPTIONS: --max_old_space_size=3076
|
||||
resource_class: <<parameters.class>>
|
||||
sb_playwright:
|
||||
parameters:
|
||||
class:
|
||||
@ -184,85 +169,6 @@ jobs:
|
||||
root: .
|
||||
paths:
|
||||
- .verdaccio-cache
|
||||
e2e-tests-extended:
|
||||
executor:
|
||||
class: medium
|
||||
name: sb_cypress_8_node_14
|
||||
parallelism: 14
|
||||
steps:
|
||||
- when:
|
||||
condition:
|
||||
and:
|
||||
- not:
|
||||
equal: [main, << pipeline.git.branch >>]
|
||||
- not:
|
||||
equal: [next, << pipeline.git.branch >>]
|
||||
steps:
|
||||
- ensure-pr-is-labeled-with:
|
||||
label: 'run e2e extended test suite'
|
||||
- git-shallow-clone/checkout_advanced:
|
||||
clone_options: '--depth 1 --verbose'
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: running local registry
|
||||
command: |
|
||||
cd code
|
||||
yarn local-registry --port 6001 --open
|
||||
background: true
|
||||
- run:
|
||||
name: Wait for registry
|
||||
command: |
|
||||
cd code
|
||||
yarn wait-on http://localhost:6001
|
||||
- run:
|
||||
name: Run E2E (extended) tests
|
||||
command: |
|
||||
cd code
|
||||
yarn test:e2e-framework --clean --all --skip angular --skip angular12 --skip vue3 --skip web_components_typescript --skip cra --skip react
|
||||
no_output_timeout: 5m
|
||||
- store_artifacts:
|
||||
path: /tmp/cypress-record
|
||||
destination: cypress
|
||||
e2e-tests-core:
|
||||
executor:
|
||||
class: large
|
||||
name: sb_cypress_8_node_14
|
||||
parallelism: 8
|
||||
steps:
|
||||
- git-shallow-clone/checkout_advanced:
|
||||
clone_options: '--depth 1 --verbose'
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: Running local registry
|
||||
command: |
|
||||
cd code
|
||||
yarn local-registry --port 6001 --open
|
||||
background: true
|
||||
- run:
|
||||
name: Wait for registry
|
||||
command: |
|
||||
cd code
|
||||
yarn wait-on http://localhost:6001
|
||||
- run:
|
||||
name: Run E2E (core) tests
|
||||
# Do not test CRA here because it's done in PnP part
|
||||
# TODO: Remove `web_components_typescript` as soon as Lit 2 stable is released
|
||||
command: |
|
||||
cd code
|
||||
yarn test:e2e-framework vue3 angular130 angular13 angular12 web_components_typescript web_components_lit2 react react_legacy_root_api
|
||||
no_output_timeout: 5m
|
||||
- run:
|
||||
name: prep artifacts
|
||||
when: always
|
||||
command: zip -r /tmp/storybook-e2e-testing-out.zip /tmp/storybook-e2e-testing
|
||||
- store_artifacts:
|
||||
path: /tmp/cypress-record
|
||||
destination: cypress
|
||||
- store_artifacts:
|
||||
path: /tmp/storybook-e2e-testing-out.zip
|
||||
destination: e2e
|
||||
# NOTE: this currently tests each story in docs mode, which doesn't make sense any more as stories
|
||||
# can no longer run in docs mode. Instead we should probably change the test runner to test each
|
||||
# docs entry if you run it in `VIEW_MODE=docs`
|
||||
@ -325,73 +231,6 @@ jobs:
|
||||
- store_artifacts:
|
||||
path: /tmp/sb-bench.tar.gz
|
||||
destination: sb-bench.tar.gz
|
||||
e2e-tests-pnp:
|
||||
executor:
|
||||
class: medium
|
||||
name: sb_cypress_8_node_14
|
||||
working_directory: /tmp/storybook
|
||||
steps:
|
||||
- git-shallow-clone/checkout_advanced:
|
||||
clone_options: '--depth 1 --verbose'
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: Running local registry
|
||||
command: |
|
||||
cd code
|
||||
yarn local-registry --port 6001 --open
|
||||
background: true
|
||||
- run:
|
||||
name: Wait for registry
|
||||
command: |
|
||||
cd code
|
||||
yarn wait-on http://localhost:6001
|
||||
- run:
|
||||
name: run e2e tests cra
|
||||
command: |
|
||||
cd code
|
||||
yarn test:e2e-framework --pnp cra
|
||||
# - run:
|
||||
# name: run e2e tests vue
|
||||
# command: yarn test:e2e-framework --pnp sfcVue
|
||||
- run:
|
||||
name: prep artifacts
|
||||
when: always
|
||||
command: zip -r /tmp/storybook-e2e-testing-out.zip /tmp/storybook-e2e-testing
|
||||
- store_artifacts:
|
||||
path: /tmp/cypress-record
|
||||
destination: cypress
|
||||
- store_artifacts:
|
||||
path: /tmp/storybook-e2e-testing-out.zip
|
||||
destination: e2e
|
||||
e2e-tests-examples:
|
||||
executor:
|
||||
class: small
|
||||
name: sb_cypress_8_node_14
|
||||
steps:
|
||||
- git-shallow-clone/checkout_advanced:
|
||||
clone_options: '--depth 1 --verbose'
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: running example
|
||||
command: |
|
||||
cd code
|
||||
yarn serve-storybooks
|
||||
background: true
|
||||
- run:
|
||||
name: await running examples
|
||||
command: |
|
||||
cd code
|
||||
yarn await-serve-storybooks
|
||||
- run:
|
||||
name: cypress run
|
||||
command: |
|
||||
cd code
|
||||
yarn test:e2e-examples
|
||||
- store_artifacts:
|
||||
path: /tmp/cypress-record
|
||||
destination: cypress
|
||||
smoke-tests:
|
||||
executor:
|
||||
class: medium+
|
||||
|
@ -6,7 +6,6 @@
|
||||
- [2a. Run unit tests](#2a-run-unit-tests)
|
||||
- [Core & Examples Tests](#core--examples-tests)
|
||||
- [2b. Run Linter](#2b-run-linter)
|
||||
- [2c. Run Cypress tests](#2c-run-cypress-tests)
|
||||
- [Reproductions](#reproductions)
|
||||
- [In the monorepo](#in-the-monorepo)
|
||||
- [Outside the monorepo](#outside-the-monorepo)
|
||||
@ -32,8 +31,8 @@
|
||||
- [Verify your local version is working](#verify-your-local-version-is-working)
|
||||
- [Documentation](#documentation)
|
||||
- [Release Guide](#release-guide)
|
||||
- [Prerelease:](#prerelease)
|
||||
- [Full release:](#full-release)
|
||||
- [Prerelease:](#prerelease)
|
||||
- [Full release:](#full-release)
|
||||
|
||||
Thanks for your interest in improving Storybook! We are a community-driven project and welcome contributions of all kinds: from discussion to documentation to bugfixes to feature improvements.
|
||||
|
||||
@ -129,18 +128,6 @@ It can be immensely helpful to get feedback in your editor, if you're using VsCo
|
||||
|
||||
This should enable auto-fix for all source files, and give linting warnings and errors within your editor.
|
||||
|
||||
### 2c. Run Cypress tests
|
||||
|
||||
First make sure the repo is bootstrapped.
|
||||
|
||||
Then run `yarn build-storybooks --all`, this creates a static website from all examples.
|
||||
|
||||
Then run `yarn serve-storybooks`, this will run the static site on the port cypress expects.
|
||||
|
||||
Then run `yarn add cypress -W --optional`. When this has completed cypress should be installed on your system. If it is already on your system, this step can be skipped.
|
||||
|
||||
Then run `yarn cypress open` if you want to see the tests run in the UI, or `yarn cypress run` to run the tests headless.
|
||||
|
||||
### Reproductions
|
||||
|
||||
#### In the monorepo
|
||||
|
@ -55,7 +55,6 @@ module.exports = {
|
||||
},
|
||||
},
|
||||
{ files: '**/.storybook/config.js', rules: { 'global-require': 'off' } },
|
||||
{ files: 'cypress/**', rules: { 'jest/expect-expect': 'off' } },
|
||||
{
|
||||
files: ['**/*.stories.*'],
|
||||
rules: {
|
||||
|
@ -1,6 +0,0 @@
|
||||
{
|
||||
"extends": ["plugin:cypress/recommended"],
|
||||
"rules": {
|
||||
"import/no-extraneous-dependencies": ["error", { "devDependencies": true }]
|
||||
}
|
||||
}
|
@ -1,5 +0,0 @@
|
||||
{
|
||||
"name": "Using fixtures to represent data",
|
||||
"email": "hello@cypress.io",
|
||||
"body": "Fixtures are a great way to mock data for responses to routes"
|
||||
}
|
@ -1,19 +0,0 @@
|
||||
describe('addon-action', () => {
|
||||
before(() => {
|
||||
cy.visitStorybook();
|
||||
});
|
||||
|
||||
it('should trigger an action', () => {
|
||||
// click on the button
|
||||
cy.navigateToStory('example-button', 'primary');
|
||||
|
||||
cy.getStoryElement().contains('Button').click();
|
||||
cy.viewAddonPanel('Actions');
|
||||
|
||||
// TODO @yannbf improve tab identifier on addons
|
||||
// get the logs
|
||||
cy.get('#storybook-panel-root')
|
||||
.contains(/onClick/)
|
||||
.should('be.visible');
|
||||
});
|
||||
});
|
@ -1,26 +0,0 @@
|
||||
describe('addon-backgrounds', () => {
|
||||
before(() => {
|
||||
cy.visitStorybook();
|
||||
});
|
||||
|
||||
it('should have a dark background', () => {
|
||||
// click on the button
|
||||
cy.navigateToStory('example-button', 'primary');
|
||||
|
||||
// Click on the addon and select dark background
|
||||
cy.get('[title="Change the background of the preview"]').click();
|
||||
cy.get('#dark').click();
|
||||
|
||||
cy.getCanvasBodyElement().should('have.css', 'background-color', 'rgb(51, 51, 51)');
|
||||
});
|
||||
|
||||
it('should apply a grid', () => {
|
||||
// click on the button
|
||||
cy.navigateToStory('example-button', 'primary');
|
||||
|
||||
// Toggle grid view
|
||||
cy.get('[title="Apply a grid to the preview"]').click();
|
||||
|
||||
cy.getCanvasBodyElement().should('have.css', 'background-image');
|
||||
});
|
||||
});
|
@ -1,49 +0,0 @@
|
||||
describe('addon-controls', () => {
|
||||
it('should change component when changing controls', () => {
|
||||
cy.visitStorybook();
|
||||
|
||||
cy.navigateToStory('example-button', 'Primary');
|
||||
|
||||
cy.viewAddonPanel('Controls');
|
||||
|
||||
// Text input: Label
|
||||
cy.getStoryElement().find('button').should('contain.text', 'Button');
|
||||
cy.get('textarea[name=label]').clear().type('Hello world');
|
||||
cy.getStoryElement().find('button').should('contain.text', 'Hello world');
|
||||
|
||||
// Args in URL
|
||||
cy.url().should('include', 'args=label:Hello+world');
|
||||
|
||||
// Boolean toggle: Primary/secondary
|
||||
cy.getStoryElement().find('button').should('have.css', 'background-color', 'rgb(30, 167, 253)');
|
||||
cy.get('input[name=primary]').click();
|
||||
cy.getStoryElement().find('button').should('have.css', 'background-color', 'rgba(0, 0, 0, 0)');
|
||||
|
||||
// Color picker: Background color
|
||||
cy.get('input[placeholder="Choose color..."]').type('red');
|
||||
cy.getStoryElement().find('button').should('have.css', 'background-color', 'rgb(255, 0, 0)');
|
||||
|
||||
// TODO: enable this once the controls for size are aligned in all CLI templates.
|
||||
// Radio buttons: Size
|
||||
// cy.getStoryElement().find('button').should('have.css', 'font-size', '14px');
|
||||
// cy.get('label[for="size-large"]').click();
|
||||
// cy.getStoryElement().find('button').should('have.css', 'font-size', '16px');
|
||||
|
||||
// Reset controls: assert that the component is back to original state
|
||||
cy.get('button[title="Reset controls"]').click();
|
||||
cy.getStoryElement().find('button').should('have.css', 'font-size', '14px');
|
||||
cy.getStoryElement().find('button').should('have.css', 'background-color', 'rgb(30, 167, 253)');
|
||||
cy.getStoryElement().find('button').should('contain.text', 'Button');
|
||||
});
|
||||
|
||||
it('should apply controls automatically when passed via url', () => {
|
||||
cy.visit('/', {
|
||||
qs: {
|
||||
path: '/story/example-button--primary',
|
||||
args: 'label:Hello world',
|
||||
},
|
||||
});
|
||||
|
||||
cy.getStoryElement().find('button').should('contain.text', 'Hello world');
|
||||
});
|
||||
});
|
@ -1,30 +0,0 @@
|
||||
import { skipOn } from '@cypress/skip-test';
|
||||
|
||||
describe('addon-docs', () => {
|
||||
beforeEach(() => {
|
||||
cy.visitStorybook();
|
||||
cy.navigateToStory('example-button', 'docs');
|
||||
});
|
||||
|
||||
skipOn('vue3', () => {
|
||||
skipOn('html', () => {
|
||||
it('should provide source snippet', () => {
|
||||
cy.getDocsElement()
|
||||
.find('.docblock-code-toggle')
|
||||
.each(($div) => {
|
||||
cy.wrap($div)
|
||||
.should('contain.text', 'Show code')
|
||||
// use force click so cypress does not automatically scroll, making the source block visible on this step
|
||||
.click({ force: true });
|
||||
});
|
||||
|
||||
cy.getDocsElement()
|
||||
.find('pre.prismjs')
|
||||
.each(($div) => {
|
||||
const text = $div.text();
|
||||
expect(text).not.match(/^\(args\) => /);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
@ -1,53 +0,0 @@
|
||||
/* eslint-disable jest/no-identical-title */
|
||||
import { onlyOn } from '@cypress/skip-test';
|
||||
|
||||
describe('addon-interactions', () => {
|
||||
before(() => {
|
||||
cy.visitStorybook();
|
||||
});
|
||||
|
||||
const test = () => {
|
||||
// click on the button
|
||||
cy.navigateToStory('example-page', 'logged-in');
|
||||
|
||||
cy.viewAddonPanel('Interactions');
|
||||
|
||||
cy.getStoryElement().find('.welcome').should('contain.text', 'Welcome, Jane Doe!');
|
||||
|
||||
cy.get('#tabbutton-interactions').contains(/(1)/).should('be.visible');
|
||||
cy.get('#storybook-panel-root')
|
||||
.contains(/userEvent.click/)
|
||||
.should('be.visible');
|
||||
cy.get('[data-testid=icon-done]').should('be.visible');
|
||||
};
|
||||
|
||||
// Having multiple of onlyOn for the same test is a workaround instead
|
||||
// of having to use skipOn a long list of frameworks
|
||||
onlyOn('angular', () => {
|
||||
it('should have interactions', test);
|
||||
});
|
||||
|
||||
onlyOn('react', () => {
|
||||
it('should have interactions', test);
|
||||
});
|
||||
|
||||
// onlyOn('vite_react', () => {
|
||||
// it('should have interactions', test);
|
||||
// });
|
||||
|
||||
onlyOn('preact', () => {
|
||||
it('should have interactions', test);
|
||||
});
|
||||
|
||||
onlyOn('html', () => {
|
||||
it('should have interactions', test);
|
||||
});
|
||||
|
||||
onlyOn('svelte', () => {
|
||||
it('should have interactions', test);
|
||||
});
|
||||
|
||||
onlyOn('vue3', () => {
|
||||
it('should have interactions', test);
|
||||
});
|
||||
});
|
@ -1,16 +0,0 @@
|
||||
describe('addon-viewport', () => {
|
||||
before(() => {
|
||||
cy.visitStorybook();
|
||||
});
|
||||
|
||||
it('should have viewport button in the toolbar', () => {
|
||||
cy.navigateToStory('example-button', 'Primary');
|
||||
|
||||
// Click on viewport button and select small mobile
|
||||
cy.get('[title="Change the size of the preview"]').click();
|
||||
cy.get('#mobile1').click();
|
||||
|
||||
// Check that Welcome story is still displayed
|
||||
cy.getStoryElement().should('contain.text', 'Button');
|
||||
});
|
||||
});
|
@ -1,80 +0,0 @@
|
||||
import { skipOn } from '@cypress/skip-test';
|
||||
|
||||
describe('Basic CLI', () => {
|
||||
before(() => {
|
||||
cy.visitStorybook();
|
||||
});
|
||||
|
||||
describe('Welcome story (MDX)', () => {
|
||||
it('should load and display', () => {
|
||||
cy.navigateToStory('example-introduction', 'docs');
|
||||
cy.getDocsElement().should('contain.text', 'Welcome to Storybook');
|
||||
});
|
||||
});
|
||||
|
||||
describe('Button story', () => {
|
||||
it('should load primary story', () => {
|
||||
cy.navigateToStory('example-button', 'primary');
|
||||
cy.getStoryElement()
|
||||
.find('button')
|
||||
.should('have.class', 'storybook-button')
|
||||
.and('have.class', 'storybook-button--primary');
|
||||
});
|
||||
|
||||
it('should load secondary story', () => {
|
||||
cy.navigateToStory('example-button', 'secondary');
|
||||
cy.getStoryElement()
|
||||
.find('button')
|
||||
.should('have.class', 'storybook-button')
|
||||
.and('have.class', 'storybook-button--secondary');
|
||||
});
|
||||
it('should load small story', () => {
|
||||
cy.navigateToStory('example-button', 'small');
|
||||
cy.getStoryElement()
|
||||
.find('button')
|
||||
.should('have.class', 'storybook-button')
|
||||
.and('have.class', 'storybook-button--small');
|
||||
});
|
||||
it('should load large story', () => {
|
||||
cy.navigateToStory('example-button', 'large');
|
||||
cy.getStoryElement()
|
||||
.find('button')
|
||||
.should('have.class', 'storybook-button')
|
||||
.and('have.class', 'storybook-button--large');
|
||||
});
|
||||
});
|
||||
|
||||
describe('Header story', () => {
|
||||
it('should load and display logged in', () => {
|
||||
cy.navigateToStory('example-header', 'logged-in');
|
||||
cy.getStoryElement().find('header').should('contain.text', 'Acme');
|
||||
cy.getStoryElement().find('button').should('contain.text', 'Log out');
|
||||
});
|
||||
|
||||
it('should load and display logged out', () => {
|
||||
cy.navigateToStory('example-header', 'logged-out');
|
||||
cy.getStoryElement().find('header').should('contain.text', 'Acme');
|
||||
cy.getStoryElement().find('button').first().should('contain.text', 'Log in');
|
||||
cy.getStoryElement().find('button').last().should('contain.text', 'Sign up');
|
||||
});
|
||||
});
|
||||
|
||||
describe('Page story', () => {
|
||||
skipOn('vue', () => {
|
||||
it('should load and display logged out', () => {
|
||||
cy.navigateToStory('example-page', 'logged-out');
|
||||
cy.getStoryElement().should('contain.text', 'Acme');
|
||||
cy.getStoryElement().find('button').first().should('contain.text', 'Log in');
|
||||
cy.getStoryElement().find('button').last().should('contain.text', 'Sign up');
|
||||
cy.getStoryElement().should('contain.text', 'Pages in Storybook');
|
||||
});
|
||||
|
||||
it('should load and display logged in', () => {
|
||||
cy.navigateToStory('example-page', 'logged-in');
|
||||
cy.getStoryElement().find('header').should('contain.text', 'Acme');
|
||||
cy.getStoryElement().find('button').should('contain.text', 'Log out');
|
||||
cy.getStoryElement().should('contain.text', 'Pages in Storybook');
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
@ -1,51 +0,0 @@
|
||||
/* eslint-disable no-unused-expressions */
|
||||
/* eslint-disable jest/valid-expect */
|
||||
type StorybookApps = 'official-storybook';
|
||||
|
||||
type Addons = 'Actions' | 'Knobs';
|
||||
|
||||
const getUrl = (route: string) => {
|
||||
const host = Cypress.env('location') || 'http://localhost:8001';
|
||||
|
||||
return `${host}/${route}`;
|
||||
};
|
||||
|
||||
export const visit = (route = '') => {
|
||||
cy.clearLocalStorage().visit(getUrl(route));
|
||||
return cy.get(`#storybook-preview-iframe`).then({ timeout: 15000 }, (iframe) => {
|
||||
return cy.wrap(iframe, { timeout: 10000 }).should(() => {
|
||||
const content: Document | null = (iframe[0] as HTMLIFrameElement).contentDocument;
|
||||
const element: HTMLElement | null = content !== null ? content.documentElement : null;
|
||||
|
||||
expect(element).not.null;
|
||||
|
||||
if (element !== null) {
|
||||
expect(element.querySelector('#storybook-root > *, #storybook-docs > *')).not.null;
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
export const clickAddon = (addonName: Addons) => {
|
||||
return cy.get(`[role=tablist] button[role=tab]`).contains(addonName).click();
|
||||
};
|
||||
|
||||
export const getStorybookPreview = () => {
|
||||
return cy.get(`#storybook-preview-iframe`).then({ timeout: 10000 }, (iframe) => {
|
||||
const content: Document | null = (iframe[0] as HTMLIFrameElement).contentDocument;
|
||||
const element: HTMLElement | null = content !== null ? content.documentElement : null;
|
||||
|
||||
return cy
|
||||
.wrap(iframe)
|
||||
.should(() => {
|
||||
expect(element).not.null;
|
||||
|
||||
if (element !== null) {
|
||||
expect(element.querySelector('#storybook-root > *')).not.null;
|
||||
}
|
||||
})
|
||||
.then(() => {
|
||||
return cy.wrap(element).get('#storybook-root');
|
||||
});
|
||||
});
|
||||
};
|
@ -1,40 +0,0 @@
|
||||
import { visit } from '../helper';
|
||||
|
||||
describe('Navigation', () => {
|
||||
before(() => {
|
||||
visit('official-storybook');
|
||||
});
|
||||
|
||||
it('should search navigation item', () => {
|
||||
cy.get('#storybook-explorer-searchfield').click({ force: true });
|
||||
cy.get('#storybook-explorer-searchfield').clear();
|
||||
cy.get('#storybook-explorer-searchfield').type('syntax');
|
||||
|
||||
cy.get('#storybook-explorer-menu button')
|
||||
.should('contain', 'SyntaxHighlighter')
|
||||
.and('not.contain', 'a11y');
|
||||
});
|
||||
|
||||
it('should display no results after searching a non-existing navigation item', () => {
|
||||
cy.get('#storybook-explorer-searchfield').click({ force: true });
|
||||
cy.get('#storybook-explorer-searchfield').clear();
|
||||
cy.get('#storybook-explorer-searchfield').type('zzzzzzzzzz');
|
||||
|
||||
cy.get('#storybook-explorer-menu button').should('be.hidden');
|
||||
});
|
||||
});
|
||||
|
||||
describe('Routing', () => {
|
||||
it('should navigate to sibling story sibling', () => {
|
||||
visit('official-storybook/?path=/story/basics-actionbar--single-item');
|
||||
|
||||
cy.get('#basics-actionbar--many-items').click({ force: true });
|
||||
cy.url().should('include', 'path=/story/basics-actionbar--many-items');
|
||||
});
|
||||
|
||||
it('should directly visit a certain story and render correctly', () => {
|
||||
visit('official-storybook/?path=/story/basics-actionbar--single-item');
|
||||
|
||||
cy.getStoryElement().should('contain.text', 'Clear');
|
||||
});
|
||||
});
|
@ -1,22 +0,0 @@
|
||||
// ***********************************************************
|
||||
// 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 wp = require('@cypress/webpack-preprocessor');
|
||||
const webpackConfig = require('./webpack.config');
|
||||
|
||||
module.exports = (on) => {
|
||||
const options = {
|
||||
webpackOptions: webpackConfig,
|
||||
};
|
||||
on('file:preprocessor', wp(options));
|
||||
};
|
@ -1,21 +0,0 @@
|
||||
module.exports = {
|
||||
resolve: {
|
||||
extensions: ['.ts', '.js'],
|
||||
},
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.ts$/,
|
||||
exclude: [/node_modules/],
|
||||
use: [
|
||||
{
|
||||
loader: require.resolve('ts-loader'),
|
||||
options: {
|
||||
transpileOnly: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
@ -1,70 +0,0 @@
|
||||
import path from 'path';
|
||||
import fs from 'fs-extra';
|
||||
|
||||
import { findSuitesAndTests } from 'mocha-list-tests';
|
||||
|
||||
const testsDir = path.join(__dirname, 'integration');
|
||||
const videosDir = path.join(__dirname, 'videos');
|
||||
const screensDir = path.join(__dirname, 'screenshots');
|
||||
|
||||
let prevFoundTests: string[] = [];
|
||||
function getTests(fileName: string) {
|
||||
const { tests } = findSuitesAndTests(path.join(testsDir, fileName));
|
||||
const newTests = tests.filter((test: string) => !prevFoundTests.includes(test));
|
||||
prevFoundTests = tests;
|
||||
return newTests.map((test: string) => test.split(/\./));
|
||||
}
|
||||
|
||||
const fullTestName = (suite: string, testName: string) => `${suite}: ${testName}`;
|
||||
|
||||
async function report() {
|
||||
const hookFailures: { [file: string]: [string, string][] } = {};
|
||||
const reports: any[] = [];
|
||||
try {
|
||||
const testFiles = await fs.readdir(screensDir);
|
||||
await Promise.all(
|
||||
testFiles.map(async (testFile) => {
|
||||
const files = await fs.readdir(path.join(screensDir, testFile));
|
||||
files.forEach((file) => {
|
||||
const match = file.match(/^(.*) \(failed\).png$/);
|
||||
if (match == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
const [suite, test, hookPart] = match[1].split(' -- ');
|
||||
let testName = test;
|
||||
const hook = hookPart?.match(/^(.*) hook$/)?.[1];
|
||||
if (hook != null) {
|
||||
testName = `"${hook}" hook for "${test}"`;
|
||||
hookFailures[testFile] = hookFailures[testFile] || [];
|
||||
hookFailures[testFile].push([suite, testName]);
|
||||
}
|
||||
reports.push({
|
||||
name: 'Screenshot',
|
||||
testName: fullTestName(suite, testName),
|
||||
type: 'image',
|
||||
value: `screenshots.tar.gz!${testFile}/${file}`,
|
||||
});
|
||||
});
|
||||
})
|
||||
);
|
||||
} catch (e) {
|
||||
// ignore
|
||||
}
|
||||
|
||||
const videoFiles = await fs.readdir(videosDir);
|
||||
videoFiles.forEach((videoFile) => {
|
||||
const testFile = videoFile.replace(/\.mp4$/, '');
|
||||
const tests = [...getTests(testFile), ...(hookFailures[testFile] || [])];
|
||||
tests.forEach(([suite, testName]) =>
|
||||
reports.unshift({
|
||||
name: 'Video',
|
||||
testName: fullTestName(suite, testName),
|
||||
type: 'video',
|
||||
value: `videos.tar.gz!${videoFile}`,
|
||||
})
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
report();
|
@ -1,134 +0,0 @@
|
||||
// ***********************************************
|
||||
// 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) => { ... })
|
||||
|
||||
const logger = console;
|
||||
Cypress.Commands.add(
|
||||
'console',
|
||||
{
|
||||
prevSubject: true,
|
||||
},
|
||||
(subject, method = 'log') => {
|
||||
logger[method]('The subject is', subject);
|
||||
return subject;
|
||||
}
|
||||
);
|
||||
|
||||
Cypress.Commands.add('visitStorybook', () => {
|
||||
cy.log('visitStorybook');
|
||||
const host = Cypress.env('location') || 'http://localhost:8001';
|
||||
return cy
|
||||
.clearLocalStorage()
|
||||
.visit(`${host}/?path=/story/example-introduction--docs`)
|
||||
.get(`#storybook-preview-iframe`, { log: false })
|
||||
.its('0.contentDocument.body', { log: false })
|
||||
.should('not.be.empty')
|
||||
.then((body) => cy.wrap(body, { log: false }))
|
||||
.find('#storybook-docs', { log: false })
|
||||
.should('not.be.empty');
|
||||
});
|
||||
|
||||
Cypress.Commands.add('getStoryElement', {}, () => {
|
||||
cy.log('getStoryElement');
|
||||
return cy
|
||||
.get(`#storybook-preview-iframe`, { log: false })
|
||||
.its('0.contentDocument.body', { log: false })
|
||||
.should('not.be.empty')
|
||||
.then((body) => cy.wrap(body, { log: false }))
|
||||
.find('#storybook-root', { log: false })
|
||||
.should('not.be.empty')
|
||||
.then((storyRoot) => cy.wrap(storyRoot, { log: false }));
|
||||
});
|
||||
|
||||
Cypress.Commands.add('getDocsElement', {}, () => {
|
||||
cy.log('getDocsElement');
|
||||
return cy
|
||||
.get(`#storybook-preview-iframe`, { log: false })
|
||||
.its('0.contentDocument.body', { log: false })
|
||||
.should('not.be.empty')
|
||||
.then((body) => cy.wrap(body, { log: false }))
|
||||
.find('#storybook-docs', { log: false })
|
||||
.should('not.be.empty')
|
||||
.then((storyRoot) => cy.wrap(storyRoot, { log: false }));
|
||||
});
|
||||
|
||||
Cypress.Commands.add('getCanvasElement', {}, () => {
|
||||
cy.log('getCanvasElement');
|
||||
return cy
|
||||
.get(`#storybook-preview-iframe`, { log: false })
|
||||
.then((iframe) => cy.wrap(iframe, { log: false }));
|
||||
});
|
||||
|
||||
Cypress.Commands.add('getCanvasBodyElement', {}, () => {
|
||||
cy.log('getCanvasBodyElement');
|
||||
return cy
|
||||
.getCanvasElement()
|
||||
.its('0.contentDocument.body', { log: false })
|
||||
.should('not.be.empty')
|
||||
.then((body) => cy.wrap(body, { log: false }));
|
||||
});
|
||||
|
||||
Cypress.Commands.add('navigateToStory', (kind, name) => {
|
||||
const kindId = kind.replace(/ /g, '-').toLowerCase();
|
||||
const storyId = name.replace(/ /g, '-').toLowerCase();
|
||||
|
||||
const storyLinkId = `#${kindId}--${storyId}`;
|
||||
cy.log(`navigateToStory ${kind} ${name}`);
|
||||
|
||||
// Section might be collapsed
|
||||
if (Cypress.$(`#${kindId}`).length) {
|
||||
cy.get(`#${kindId}`).then(async ($item) => {
|
||||
if ($item.attr('aria-expanded') === 'false') {
|
||||
await $item.click();
|
||||
// eslint-disable-next-line cypress/no-unnecessary-waiting
|
||||
cy.wait(300);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
cy.get(storyLinkId).click({ force: true });
|
||||
|
||||
// FIXME: Find a way to not wait like this but check for an element in the UI
|
||||
// A pause is good when switching stories
|
||||
// eslint-disable-next-line cypress/no-unnecessary-waiting
|
||||
cy.wait(300);
|
||||
|
||||
// assert url changes
|
||||
const viewMode = name === 'docs' ? 'docs' : 'story';
|
||||
cy.url().should('include', `path=/${viewMode}/${kindId}--${storyId}`);
|
||||
cy.get(storyLinkId).should('have.attr', 'data-selected', 'true');
|
||||
|
||||
// A pause is good when switching stories
|
||||
// eslint-disable-next-line cypress/no-unnecessary-waiting
|
||||
cy.wait(50);
|
||||
});
|
||||
|
||||
Cypress.Commands.add('viewAddonPanel', (name) => {
|
||||
cy.get(`[role=tablist] button[role=tab]`).contains(name).click();
|
||||
});
|
||||
|
||||
Cypress.Commands.add('viewAddonTab', (name) => {
|
||||
cy.get(`[role=main] button[type=button]`).contains(name).click();
|
||||
});
|
59
code/cypress/support/index.d.ts
vendored
59
code/cypress/support/index.d.ts
vendored
@ -1,59 +0,0 @@
|
||||
/// <reference types="cypress" />
|
||||
|
||||
type LoggerMethod = 'log' | 'info' | 'debug';
|
||||
|
||||
declare namespace Cypress {
|
||||
interface Chainable {
|
||||
/**
|
||||
* Visit storybook's introduction page
|
||||
*/
|
||||
visitStorybook(): Chainable<Element>;
|
||||
|
||||
/**
|
||||
* Custom command to select the DOM element of a story in the canvas tab.
|
||||
*/
|
||||
getStoryElement(): Chainable<Element>;
|
||||
|
||||
/**
|
||||
* Custom command to select the DOM element of a docs story in the canvas tab.
|
||||
*/
|
||||
getDocsElement(): Chainable<Element>;
|
||||
|
||||
/**
|
||||
* Custom command to select the DOM element of the preview iframe in the canvas tab.
|
||||
*/
|
||||
getCanvasElement(): Chainable<Element>;
|
||||
|
||||
/**
|
||||
* Custom command to select the DOM element of the body from the preview iframe in the canvas tab.
|
||||
*/
|
||||
getCanvasBodyElement(): Chainable<Element>;
|
||||
|
||||
/**
|
||||
* Navigate to a story.
|
||||
* 'Storybook Example/Button'
|
||||
* - kind: `Storybook Example`
|
||||
* - name: `Button`
|
||||
* @param kind Story kind
|
||||
* @param name name of the story
|
||||
*/
|
||||
navigateToStory(kind: string, name: string): Chainable<Element>;
|
||||
|
||||
/**
|
||||
* Display addon panel
|
||||
* @param name of the addon
|
||||
*/
|
||||
viewAddonPanel(name: string): Chainable<Element>;
|
||||
|
||||
/**
|
||||
* Display main tab
|
||||
* @param name of the addon
|
||||
*/
|
||||
viewAddonTab(name: string): Chainable<Element>;
|
||||
|
||||
/**
|
||||
* Returns the element while logging it.
|
||||
*/
|
||||
console(method: LoggerMethod): Chainable<Element>;
|
||||
}
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
// ***********************************************************
|
||||
// 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';
|
||||
|
||||
// Turn off all uncaught exception handling
|
||||
// https://docs.cypress.io/guides/references/migration-guide#Uncaught-exception-and-unhandled-rejections
|
||||
Cypress.on('uncaught:exception', (err, runnable) => {
|
||||
// returning false here prevents Cypress from
|
||||
// failing the test
|
||||
return false;
|
||||
});
|
||||
|
||||
// Alternatively you can use CommonJS syntax:
|
||||
// require('./commands')
|
@ -1,11 +0,0 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"strict": true,
|
||||
"baseUrl": "../node_modules",
|
||||
"target": "es5",
|
||||
"lib": ["es2017", "dom"],
|
||||
"types": ["cypress", "node"],
|
||||
"esModuleInterop": true
|
||||
},
|
||||
"include": ["**/*.ts"]
|
||||
}
|
1
code/cypress/typings.d.ts
vendored
1
code/cypress/typings.d.ts
vendored
@ -1 +0,0 @@
|
||||
declare module 'mocha-list-tests';
|
@ -88,8 +88,6 @@
|
||||
"test": "NODE_OPTIONS=--max_old_space_size=4096 jest --config ./jest.config.js",
|
||||
"test-puppeteer": "jest --projects examples/official-storybook/storyshots-puppeteer",
|
||||
"test:cli": "npm --prefix lib/cli run test",
|
||||
"test:e2e-examples": "cypress run",
|
||||
"test:e2e-examples-gui": "concurrently --success first --kill-others \"cypress open\" \"yarn serve-storybooks\"",
|
||||
"test:e2e-examples-playwright": "playwright test",
|
||||
"test:e2e-framework": "ts-node --project=../scripts/tsconfig.json ../scripts/run-e2e.ts"
|
||||
},
|
||||
@ -283,7 +281,6 @@
|
||||
"esbuild-loader": "^2.19.0",
|
||||
"esbuild-plugin-alias": "^0.2.1",
|
||||
"eslint": "^7.17.0",
|
||||
"eslint-plugin-cypress": "^2.11.2",
|
||||
"eslint-plugin-import": "^2.22.1",
|
||||
"eslint-plugin-react": "^7.22.0",
|
||||
"eslint-plugin-storybook": "^0.3.5",
|
||||
@ -379,9 +376,6 @@
|
||||
}
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@cypress/skip-test": "^2.6.1",
|
||||
"@cypress/webpack-preprocessor": "^5.9.1",
|
||||
"cypress": "8.7.0",
|
||||
"puppeteer": "^2.1.1",
|
||||
"ts-loader": "^9.2.8",
|
||||
"verdaccio": "^4.10.0",
|
||||
|
410
code/yarn.lock
410
code/yarn.lock
@ -2416,65 +2416,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@cypress/request@npm:^2.88.6":
|
||||
version: 2.88.10
|
||||
resolution: "@cypress/request@npm:2.88.10"
|
||||
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
|
||||
http-signature: ~1.3.6
|
||||
is-typedarray: ~1.0.0
|
||||
isstream: ~0.1.2
|
||||
json-stringify-safe: ~5.0.1
|
||||
mime-types: ~2.1.19
|
||||
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: ^8.3.2
|
||||
checksum: 9e42c1d923e17cdda6d6f8d0f338c3adbeb52d348b399e3aa9703f272b89a673660bc412f321b1db8f0dbef809a217dd6dca96e80a33ca2294d77f5898d6001a
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@cypress/skip-test@npm:^2.6.1":
|
||||
version: 2.6.1
|
||||
resolution: "@cypress/skip-test@npm:2.6.1"
|
||||
checksum: 1d0d2cb4b3094c6dee2d2339b75d60f85e5fb17b4e281cbee854e6cd4a124fad61cc65db8335b9a169ccc24b490df5b29c3385f09fa590124dc4d5b57e110019
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@cypress/webpack-preprocessor@npm:^5.9.1":
|
||||
version: 5.12.2
|
||||
resolution: "@cypress/webpack-preprocessor@npm:5.12.2"
|
||||
dependencies:
|
||||
bluebird: 3.7.1
|
||||
debug: ^4.3.2
|
||||
lodash: ^4.17.20
|
||||
peerDependencies:
|
||||
"@babel/core": ^7.0.1
|
||||
"@babel/preset-env": ^7.0.0
|
||||
babel-loader: ^8.0.2
|
||||
webpack: ^4 || ^5
|
||||
checksum: d295234d9802b6aaf37014fdcc7199d799e68d746c42f180b59f0f586f76ac91527b2570cbb29a6987a7bf59bd8f6a196c352e3e4f3948ff1625e1d58a61ce7a
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@cypress/xvfb@npm:^1.2.4":
|
||||
version: 1.2.4
|
||||
resolution: "@cypress/xvfb@npm:1.2.4"
|
||||
dependencies:
|
||||
debug: ^3.1.0
|
||||
lodash.once: ^4.1.1
|
||||
checksum: 1bf6224b244f6093033d77f04f6bef719280542656de063cf8ac3f38957b62aa633e6918af0b9673a8bf0123b42a850db51d9729a3ae3da885ac179bc7fc1d26
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@design-systems/utils@npm:2.12.0":
|
||||
version: 2.12.0
|
||||
resolution: "@design-systems/utils@npm:2.12.0"
|
||||
@ -8577,8 +8518,6 @@ __metadata:
|
||||
"@babel/preset-typescript": ^7.16.7
|
||||
"@babel/runtime": ^7.17.2
|
||||
"@compodoc/compodoc": ^1.1.18
|
||||
"@cypress/skip-test": ^2.6.1
|
||||
"@cypress/webpack-preprocessor": ^5.9.1
|
||||
"@emotion/babel-plugin": ^11.10.2
|
||||
"@emotion/jest": ^11.10.0
|
||||
"@linear/sdk": ^1.21.0
|
||||
@ -8707,7 +8646,6 @@ __metadata:
|
||||
commander: ^6.2.1
|
||||
concurrently: ^5.3.0
|
||||
cross-env: ^7.0.3
|
||||
cypress: 8.7.0
|
||||
danger: ^10.6.2
|
||||
detect-port: ^1.3.0
|
||||
ejs-lint: ^1.2.2
|
||||
@ -8717,7 +8655,6 @@ __metadata:
|
||||
esbuild-loader: ^2.19.0
|
||||
esbuild-plugin-alias: ^0.2.1
|
||||
eslint: ^7.17.0
|
||||
eslint-plugin-cypress: ^2.11.2
|
||||
eslint-plugin-import: ^2.22.1
|
||||
eslint-plugin-react: ^7.22.0
|
||||
eslint-plugin-storybook: ^0.3.5
|
||||
@ -8788,12 +8725,6 @@ __metadata:
|
||||
dependenciesMeta:
|
||||
"@compodoc/compodoc":
|
||||
built: false
|
||||
"@cypress/skip-test":
|
||||
optional: true
|
||||
"@cypress/webpack-preprocessor":
|
||||
optional: true
|
||||
cypress:
|
||||
optional: true
|
||||
ejs:
|
||||
built: false
|
||||
level:
|
||||
@ -10121,13 +10052,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/node@npm:^14.14.31":
|
||||
version: 14.18.30
|
||||
resolution: "@types/node@npm:14.18.30"
|
||||
checksum: d3c800a4ea6124c4a055453f37fb45b3530d857c1852e76efb513515c329eedbd99a60531ba4cb066fe24361ead1cd2a70d8d092f50344427e1b2d91fd43f32e
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/node@npm:^17.0.23":
|
||||
version: 17.0.45
|
||||
resolution: "@types/node@npm:17.0.45"
|
||||
@ -10449,20 +10373,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/sinonjs__fake-timers@npm:^6.0.2":
|
||||
version: 6.0.4
|
||||
resolution: "@types/sinonjs__fake-timers@npm:6.0.4"
|
||||
checksum: ba880e2451a439d9696c9adbea1b163a4077cf3d48eb8282f1ec9b640c9f063d66df9af44ec73d35c64a2bb9cd780cff02de61043c3b0d501dbaa4280ad26d19
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/sizzle@npm:^2.3.2":
|
||||
version: 2.3.3
|
||||
resolution: "@types/sizzle@npm:2.3.3"
|
||||
checksum: a19de697d2d444c0a3e3cdbfb303b337aeef9dc54b8bdb4a2f15b1fbd7ab1f7b7bf85065b17b5d2da48ea80d38d659fa213ae706880787ff92323e9fce76d841
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/sockjs@npm:^0.3.33":
|
||||
version: 0.3.33
|
||||
resolution: "@types/sockjs@npm:0.3.33"
|
||||
@ -12525,7 +12435,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"arch@npm:^2.1.0, arch@npm:^2.1.1, arch@npm:^2.2.0":
|
||||
"arch@npm:^2.1.0, arch@npm:^2.1.1":
|
||||
version: 2.2.0
|
||||
resolution: "arch@npm:2.2.0"
|
||||
checksum: 4ceaf8d8207817c216ebc4469742052cb0a097bc45d9b7fcd60b7507220da545a28562ab5bdd4dfe87921bb56371a0805da4e10d704e01f93a15f83240f1284c
|
||||
@ -13011,7 +12921,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"async@npm:^3.2.0, async@npm:^3.2.3":
|
||||
"async@npm:^3.2.3":
|
||||
version: 3.2.4
|
||||
resolution: "async@npm:3.2.4"
|
||||
checksum: b5d02fed64717edf49e35b2b156debd9cf524934ea670108fa5528e7615ed66a5e0bf6c65f832c9483b63aa7f0bffe3e588ebe8d58a539b833798d324516e1c9
|
||||
@ -13832,13 +13742,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"blob-util@npm:^2.0.2":
|
||||
version: 2.0.2
|
||||
resolution: "blob-util@npm:2.0.2"
|
||||
checksum: ed82d587827e5c86be122301a7c250f8364963e9582f72a826255bfbd32f8d69cc10169413d666667bb1c4fc8061329ae89d176ffe46fee8f32080af944ccddc
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"blocking-proxy@npm:^1.0.0":
|
||||
version: 1.0.1
|
||||
resolution: "blocking-proxy@npm:1.0.1"
|
||||
@ -13850,13 +13753,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"bluebird@npm:3.7.1":
|
||||
version: 3.7.1
|
||||
resolution: "bluebird@npm:3.7.1"
|
||||
checksum: ed3aa4e0de2b794afa95deb78d868b832e51df5a3e4564da09a6a6a0956d46b6e3bfdc62f075230eed96347329bc5c70729d52b5d3d5c4fc118cf6db63574eb7
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"bluebird@npm:^3.1.1, bluebird@npm:^3.4.6, bluebird@npm:^3.5.1, bluebird@npm:^3.5.3, bluebird@npm:^3.5.5, bluebird@npm:^3.7.2":
|
||||
version: 3.7.2
|
||||
resolution: "bluebird@npm:3.7.2"
|
||||
@ -15023,13 +14919,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"cachedir@npm:^2.3.0":
|
||||
version: 2.3.0
|
||||
resolution: "cachedir@npm:2.3.0"
|
||||
checksum: 8380a4a4aa824b20cbc246c38ae2b3379a865f52ea1f31f7b057d07545ea1ab27f93c4323d4bd1bd398991489f18a226880c3166b19ecbf49a77b18c519d075a
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"calculate-cache-key-for-tree@npm:^2.0.0":
|
||||
version: 2.0.0
|
||||
resolution: "calculate-cache-key-for-tree@npm:2.0.0"
|
||||
@ -15418,13 +15307,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"check-more-types@npm:^2.24.0":
|
||||
version: 2.24.0
|
||||
resolution: "check-more-types@npm:2.24.0"
|
||||
checksum: 93fda2c32eb5f6cd1161a84a2f4107c0e00b40a851748516791dd9a0992b91bdf504e3bf6bf7673ce603ae620042e11ed4084d16d6d92b36818abc9c2e725520
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"checkup@npm:^1.3.0":
|
||||
version: 1.3.0
|
||||
resolution: "checkup@npm:1.3.0"
|
||||
@ -15686,7 +15568,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"cli-table3@npm:^0.6.1, cli-table3@npm:~0.6.0":
|
||||
"cli-table3@npm:^0.6.1":
|
||||
version: 0.6.3
|
||||
resolution: "cli-table3@npm:0.6.3"
|
||||
dependencies:
|
||||
@ -16062,13 +15944,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"commander@npm:^5.1.0":
|
||||
version: 5.1.0
|
||||
resolution: "commander@npm:5.1.0"
|
||||
checksum: da9d71dbe4ce039faf1fe9eac3771dca8c11d66963341f62602f7b66e36d2a3f8883407af4f9a37b1db1a55c59c0c1325f186425764c2e963dc1d67aec2a4b6d
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"commander@npm:^6.2.0, commander@npm:^6.2.1":
|
||||
version: 6.2.1
|
||||
resolution: "commander@npm:6.2.1"
|
||||
@ -17176,58 +17051,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"cypress@npm:8.7.0":
|
||||
version: 8.7.0
|
||||
resolution: "cypress@npm:8.7.0"
|
||||
dependencies:
|
||||
"@cypress/request": ^2.88.6
|
||||
"@cypress/xvfb": ^1.2.4
|
||||
"@types/node": ^14.14.31
|
||||
"@types/sinonjs__fake-timers": ^6.0.2
|
||||
"@types/sizzle": ^2.3.2
|
||||
arch: ^2.2.0
|
||||
blob-util: ^2.0.2
|
||||
bluebird: ^3.7.2
|
||||
cachedir: ^2.3.0
|
||||
chalk: ^4.1.0
|
||||
check-more-types: ^2.24.0
|
||||
cli-cursor: ^3.1.0
|
||||
cli-table3: ~0.6.0
|
||||
commander: ^5.1.0
|
||||
common-tags: ^1.8.0
|
||||
dayjs: ^1.10.4
|
||||
debug: ^4.3.2
|
||||
enquirer: ^2.3.6
|
||||
eventemitter2: ^6.4.3
|
||||
execa: 4.1.0
|
||||
executable: ^4.1.1
|
||||
extract-zip: 2.0.1
|
||||
figures: ^3.2.0
|
||||
fs-extra: ^9.1.0
|
||||
getos: ^3.2.1
|
||||
is-ci: ^3.0.0
|
||||
is-installed-globally: ~0.4.0
|
||||
lazy-ass: ^1.6.0
|
||||
listr2: ^3.8.3
|
||||
lodash: ^4.17.21
|
||||
log-symbols: ^4.0.0
|
||||
minimist: ^1.2.5
|
||||
ospath: ^1.2.2
|
||||
pretty-bytes: ^5.6.0
|
||||
proxy-from-env: 1.0.0
|
||||
ramda: ~0.27.1
|
||||
request-progress: ^3.0.0
|
||||
supports-color: ^8.1.1
|
||||
tmp: ~0.2.1
|
||||
untildify: ^4.0.0
|
||||
url: ^0.11.0
|
||||
yauzl: ^2.10.0
|
||||
bin:
|
||||
cypress: bin/cypress
|
||||
checksum: be3ed1e25dc53d1523674c2632f79eab8676330d4f247ca1beba74e12bb7817473d4f238dd26c0f763f93c41516b40dfbd9afb9df1f75dcd8a8f3f85107405af
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"d@npm:1, d@npm:^1.0.1":
|
||||
version: 1.0.1
|
||||
resolution: "d@npm:1.0.1"
|
||||
@ -17392,13 +17215,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"dayjs@npm:^1.10.4":
|
||||
version: 1.11.5
|
||||
resolution: "dayjs@npm:1.11.5"
|
||||
checksum: 1d719b3c821254cbcee93879030c581dee41249ba9b825119881a941656bb885554b03094e2265c2f646945a4e23c3f05a6af5b4ff4d5a51c3e0e962669ee94b
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"de-indent@npm:^1.0.2":
|
||||
version: 1.0.2
|
||||
resolution: "de-indent@npm:1.0.2"
|
||||
@ -20045,17 +19861,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"eslint-plugin-cypress@npm:^2.11.2":
|
||||
version: 2.12.1
|
||||
resolution: "eslint-plugin-cypress@npm:2.12.1"
|
||||
dependencies:
|
||||
globals: ^11.12.0
|
||||
peerDependencies:
|
||||
eslint: ">= 3.2.1"
|
||||
checksum: 4295bbd0ceb8d182f79bbad3f73eb462df5e2e1cb8ff1e9fd99d7fda10dcbd964522bfdfa0d8cf011396d2265f2f1a0f1aeb9340b224974ba02d0d681641eac9
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"eslint-plugin-html@npm:^6.0.2":
|
||||
version: 6.2.0
|
||||
resolution: "eslint-plugin-html@npm:6.2.0"
|
||||
@ -20577,13 +20382,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"eventemitter2@npm:^6.4.3":
|
||||
version: 6.4.9
|
||||
resolution: "eventemitter2@npm:6.4.9"
|
||||
checksum: b2adf7d9f1544aa2d95ee271b0621acaf1e309d85ebcef1244fb0ebc7ab0afa6ffd5e371535d0981bc46195ad67fd6ff57a8d1db030584dee69aa5e371a27ea7
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"eventemitter3@npm:^3.1.0":
|
||||
version: 3.1.2
|
||||
resolution: "eventemitter3@npm:3.1.2"
|
||||
@ -20619,23 +20417,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"execa@npm:4.1.0, execa@npm:^4.0.0, execa@npm:^4.0.2, execa@npm:^4.1.0":
|
||||
version: 4.1.0
|
||||
resolution: "execa@npm:4.1.0"
|
||||
dependencies:
|
||||
cross-spawn: ^7.0.0
|
||||
get-stream: ^5.0.0
|
||||
human-signals: ^1.1.1
|
||||
is-stream: ^2.0.0
|
||||
merge-stream: ^2.0.0
|
||||
npm-run-path: ^4.0.0
|
||||
onetime: ^5.1.0
|
||||
signal-exit: ^3.0.2
|
||||
strip-final-newline: ^2.0.0
|
||||
checksum: 02211601bb1c52710260edcc68fb84c3c030dc68bafc697c90ada3c52cc31375337de8c24826015b8382a58d63569ffd203b79c94fef217d65503e3e8d2c52ba
|
||||
languageName: node
|
||||
linkType: hard |