diff --git a/.dockerignore b/.dockerignore index eaef8fe6f56..d90df609c1b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -15,6 +15,7 @@ !postcss.config.js !playwright.config.ts !.kearc +!.storybook !tsconfig.json !frontend/@posthog !frontend/src diff --git a/.github/workflows/ci-e2e-vrt.yml b/.github/workflows/ci-e2e-vrt.yml deleted file mode 100644 index c90b66a1039..00000000000 --- a/.github/workflows/ci-e2e-vrt.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: E2E Visual Regression Tests - -on: - pull_request: - push: - branches: - - master - -jobs: - playwright: - name: Visual Regression Tests - runs-on: ubuntu-20.04 - container: - image: mcr.microsoft.com/playwright:v1.28.1-focal - steps: - - uses: actions/checkout@v3 - - - name: Install pnpm - uses: pnpm/action-setup@v2 - with: - version: 7.x.x - - - name: Set up Node.js - uses: actions/setup-node@v3 - with: - node-version: 18 - cache: pnpm - - - name: Install package.json dependencies with pnpm - run: pnpm install --frozen-lockfile - - - name: Install CI utilities with pnpm - run: pnpm install concurrently http-server wait-on - - - name: Build Storybook - run: pnpm build-storybook --quiet - - - name: Serve Storybook and run tests - run: | - pnpm exec concurrently -k -s first -n "SRVR,TEST" -c "magenta,blue" \ - "pnpm exec http-server storybook-static --port 6006" \ - "pnpm exec wait-on http://127.0.0.1:6006 --timeout 60 && pnpm exec playwright test" - - - name: Upload Playwright report - uses: actions/upload-artifact@v3 - if: always() - with: - name: playwright-report - path: | - playwright-report/ - test-results/ - retention-days: 7 diff --git a/.github/workflows/ci-frontend.yml b/.github/workflows/ci-frontend.yml index bd486135795..99f86c5be65 100644 --- a/.github/workflows/ci-frontend.yml +++ b/.github/workflows/ci-frontend.yml @@ -66,10 +66,10 @@ jobs: - run: pnpm install --frozen-lockfile - id: set-test-chunks name: Set Chunks - # Looks at the output of 'pnpm test -- --listTests --json' + # Looks at the output of 'pnpm test:unit -- --listTests --json' # Take the 5th line of the output (the first two are pnpm non-sense) # Split the test into 3 parts. To increase the number split change the denominator in `length / 3` - run: echo "test-chunks=$(pnpm test -- --listTests --json | sed -n 5p | jq -cM '[_nwise(length / 3 | ceil)]')" >> $GITHUB_OUTPUT + run: echo "test-chunks=$(pnpm test:unit --listTests --json | sed -n 5p | jq -cM '[_nwise(length / 3 | ceil)]')" >> $GITHUB_OUTPUT - id: set-test-chunk-ids name: Set Chunk IDs run: echo "test-chunk-ids=$(echo $CHUNKS | jq -cM 'to_entries | map(.key)')" >> $GITHUB_OUTPUT @@ -106,7 +106,57 @@ jobs: - name: Test with Jest # set maxWorkers or Jest only uses 1 CPU in GitHub Actions - run: echo $CHUNKS | jq '.[${{ matrix.chunk }}] | .[] | @text' | xargs pnpm test -- --maxWorkers=2 + run: pnpm test:unit --maxWorkers=2 $(echo $CHUNKS | jq '.[${{ matrix.chunk }}] | .[] | @text') env: NODE_OPTIONS: --max-old-space-size=6144 CHUNKS: ${{ needs.jest-setup.outputs['test-chunks'] }} + + visual-regression: + name: Visual regression tests + runs-on: ubuntu-20.04 + container: + image: mcr.microsoft.com/playwright:v1.29.2-focal + env: + CYPRESS_INSTALL_BINARY: '0' + NODE_OPTIONS: --max_old_space_size=4096 + steps: + - uses: actions/checkout@v3 + + - name: Install pnpm + uses: pnpm/action-setup@v2 + with: + version: 7.x.x + + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: pnpm + + - name: Install package.json dependencies with pnpm + run: pnpm install --frozen-lockfile + + - name: Install CI utilities with pnpm + run: pnpm install http-server wait-on + + - name: Build Storybook + run: pnpm build-storybook --quiet # Silence since progress logging results in a massive wall of spam + + - name: Serve Storybook in the background + run: pnpm exec http-server storybook-static --port 6006 --silent & + + - name: Compare current Storybook to the baseline + run: | + pnpm wait-on http://127.0.0.1:6006 --timeout 60 + pnpm test:visual-regression:ci + + - name: Upload Playwright report and diffs + uses: actions/upload-artifact@v3 + if: always() # We want the report even if there's no failure + with: + name: playwright-report + path: | + playwright-report/ + test-results/ + frontend/__snapshots__/__diff_output__/ + retention-days: 7 diff --git a/.gitignore b/.gitignore index df4dd49018b..18b123ab89f 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ frontend/.cache/ .mypy_cache frontend/dist/ frontend/types/ +frontend/__snapshots__/__diff_output__/ *Type.ts frontend/pnpm-error.log frontend/tmp diff --git a/.husky/pre-commit b/.husky/pre-commit index fab6428a1a7..d6f7ea98a72 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,13 @@ #!/bin/sh . "$(dirname "$0")/_/husky.sh" +# Check if staged files contain any added or modified PNGs +if git diff --cached --name-status | grep '^[AM]' | grep -q '.png$'; then + # Error if OptiPNG is not installed + if ! command -v optipng >/dev/null; then + echo "PNG files must be optimized before being committed, but OptiPNG is not installed! Fix this with \`brew/apt install optipng\`." + exit 1 + fi +fi + pnpm lint-staged diff --git a/.storybook/decorators/withSnapshotsDisabled.tsx b/.storybook/decorators/withSnapshotsDisabled.tsx new file mode 100644 index 00000000000..9d353aee82a --- /dev/null +++ b/.storybook/decorators/withSnapshotsDisabled.tsx @@ -0,0 +1,10 @@ +import { DecoratorFn } from '@storybook/react' + +/** Workaround for https://github.com/storybookjs/test-runner/issues/74 */ +// TODO: Smoke-test all the stories by removing this decorator, once all the stories pass +export const withSnapshotsDisabled: DecoratorFn = (Story, { parameters }) => { + if (parameters?.chromatic?.disableSnapshot && navigator.userAgent.includes('StorybookTestRunner')) { + return <>Disabled for Test Runner + } + return +} diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index 4cd840fec9d..a643f5e31fa 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -7,6 +7,7 @@ import { getStorybookAppContext } from './app-context' import { withKea } from './decorators/withKea' import { withMockDate } from './decorators/withMockDate' import { defaultMocks } from '~/mocks/handlers' +import { withSnapshotsDisabled } from './decorators/withSnapshotsDisabled' const setupMsw = () => { // Make sure the msw worker is started @@ -27,9 +28,9 @@ const setupPosthogJs = () => { } setupPosthogJs() -// Setup storybook global parameters. See https://storybook.js.org/docs/react/writing-stories/parameters#global-parameters +/** Storybook global parameters. See https://storybook.js.org/docs/react/writing-stories/parameters#global-parameters */ export const parameters = { - chromatic: { disableSnapshot: true }, + chromatic: { disableSnapshot: true }, // TODO: Make snapshots the default, instead disable them on a per-story basis actions: { argTypesRegex: '^on[A-Z].*', disabled: true }, controls: { matchers: { @@ -66,6 +67,7 @@ export const parameters = { // Setup storybook global decorators. See https://storybook.js.org/docs/react/writing-stories/decorators#global-decorators export const decorators: Meta['decorators'] = [ + withSnapshotsDisabled, // Make sure the msw service worker is started, and reset the handlers to defaults. withKea, // Allow us to time travel to ensure our stories don't change over time. diff --git a/.storybook/test-runner.ts b/.storybook/test-runner.ts new file mode 100644 index 00000000000..a73f20f0f68 --- /dev/null +++ b/.storybook/test-runner.ts @@ -0,0 +1,73 @@ +import { toMatchImageSnapshot } from 'jest-image-snapshot' +import { getStoryContext, TestRunnerConfig, TestContext } from '@storybook/test-runner' +import { Locator, Page, LocatorScreenshotOptions } from 'playwright-core' + +const customSnapshotsDir = `${process.cwd()}/frontend/__snapshots__` + +async function expectStoryToMatchFullPageSnapshot(page: Page, context: TestContext): Promise { + await expectLocatorToMatchStorySnapshot(page, context) +} + +async function expectStoryToMatchSceneSnapshot(page: Page, context: TestContext): Promise { + await expectLocatorToMatchStorySnapshot(page.locator('.main-app-content'), context) +} + +async function expectStoryToMatchComponentSnapshot(page: Page, context: TestContext): Promise { + await page.evaluate(() => { + const rootEl = document.getElementById('root') + + if (rootEl) { + // don't expand the container element to limit the screenshot + // to the component's size + rootEl.style.display = 'inline-block' + } + + // make the body transparent to take the screenshot + // without background + document.body.style.background = 'transparent' + }) + + await expectLocatorToMatchStorySnapshot(page.locator('#root'), context, { omitBackground: true }) +} + +async function expectLocatorToMatchStorySnapshot( + locator: Locator | Page, + context: TestContext, + options?: LocatorScreenshotOptions +): Promise { + const image = await locator.screenshot(options) + expect(image).toMatchImageSnapshot({ + customSnapshotsDir, + customSnapshotIdentifier: context.id, + }) +} + +module.exports = { + setup() { + expect.extend({ toMatchImageSnapshot }) + }, + async postRender(page, context) { + const storyContext = await getStoryContext(page, context) + + await page.evaluate(() => { + // Stop all animations for consistent snapshots + document.body.classList.add('dangerously-stop-all-animations') + }) + + // Wait for the network to be idle for up to 500 ms, to allow assets like images to load. This is suboptimal, + // because `networkidle` is not resolved reliably here, so we might wait for the full timeout - but it works. + await Promise.race([page.waitForLoadState('networkidle'), page.waitForTimeout(500)]) + + if (!storyContext.parameters?.chromatic?.disableSnapshot) { + if (storyContext.parameters?.layout === 'fullscreen') { + if (storyContext.parameters.testRunner?.includeNavigation) { + await expectStoryToMatchFullPageSnapshot(page, context) + } else { + await expectStoryToMatchSceneSnapshot(page, context) + } + } else { + await expectStoryToMatchComponentSnapshot(page, context) + } + } + }, +} as TestRunnerConfig diff --git a/Dockerfile.playwright b/Dockerfile.playwright index d235eda3c9b..e7e895ec475 100644 --- a/Dockerfile.playwright +++ b/Dockerfile.playwright @@ -3,12 +3,20 @@ # We do this to ensure our reference images for visual regression tests are the same during development and in CI. # -FROM mcr.microsoft.com/playwright:v1.28.1-focal +FROM mcr.microsoft.com/playwright:v1.29.2-focal WORKDIR /work RUN npm install -g pnpm -RUN pnpm install @playwright/test@1.28.1 +COPY package.json pnpm-lock.yaml ./ -COPY playwright.config.ts ./ +ENV CYPRESS_INSTALL_BINARY=0 + +RUN pnpm install + +COPY playwright.config.ts webpack.config.js babel.config.js tsconfig.json ./ + +COPY .storybook/ .storybook/ + +COPY frontend/ frontend/ diff --git a/docker-compose.playwright.yml b/docker-compose.playwright.yml index a4d5484a42b..c51df2d22ed 100644 --- a/docker-compose.playwright.yml +++ b/docker-compose.playwright.yml @@ -5,7 +5,7 @@ services: dockerfile: Dockerfile.playwright network_mode: host volumes: + - './frontend/__snapshots__:/work/frontend/__snapshots__' - './playwright:/work/playwright' - './playwright-report:/work/playwright-report' - './test-results:/work/test-results' - # profiles: [playwright] diff --git a/frontend/__snapshots__/lemon-ui-alert-message--closable.png b/frontend/__snapshots__/lemon-ui-alert-message--closable.png new file mode 100644 index 00000000000..effa8deebed Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-alert-message--closable.png differ diff --git a/frontend/__snapshots__/lemon-ui-alert-message--error.png b/frontend/__snapshots__/lemon-ui-alert-message--error.png new file mode 100644 index 00000000000..55469597927 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-alert-message--error.png differ diff --git a/frontend/__snapshots__/lemon-ui-alert-message--info.png b/frontend/__snapshots__/lemon-ui-alert-message--info.png new file mode 100644 index 00000000000..a93ae99b071 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-alert-message--info.png differ diff --git a/frontend/__snapshots__/lemon-ui-alert-message--success.png b/frontend/__snapshots__/lemon-ui-alert-message--success.png new file mode 100644 index 00000000000..783a8bef161 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-alert-message--success.png differ diff --git a/frontend/__snapshots__/lemon-ui-alert-message--warning.png b/frontend/__snapshots__/lemon-ui-alert-message--warning.png new file mode 100644 index 00000000000..32c1b270170 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-alert-message--warning.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge--active.png b/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge--active.png new file mode 100644 index 00000000000..dc0cfbe477c Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge--active.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge--positioning.png b/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge--positioning.png new file mode 100644 index 00000000000..111163f5e18 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge--positioning.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge--sizes.png b/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge--sizes.png new file mode 100644 index 00000000000..7087aa0ac78 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge--sizes.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge--standard.png b/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge--standard.png new file mode 100644 index 00000000000..90d3db6d796 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge--standard.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge--status.png b/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge--status.png new file mode 100644 index 00000000000..b69773fd0cd Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge--status.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge-number--multiple-digits.png b/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge-number--multiple-digits.png new file mode 100644 index 00000000000..2ff98d621b7 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge-number--multiple-digits.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge-number--show-zero.png b/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge-number--show-zero.png new file mode 100644 index 00000000000..0b72d810075 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge-number--show-zero.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge-number--standard.png b/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge-number--standard.png new file mode 100644 index 00000000000..3395b8b538a Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-badge-lemon-badge-number--standard.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-button--active.png b/frontend/__snapshots__/lemon-ui-lemon-button--active.png new file mode 100644 index 00000000000..b93bb05717f Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-button--active.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-button--as-links.png b/frontend/__snapshots__/lemon-ui-lemon-button--as-links.png new file mode 100644 index 00000000000..fd0fb13eb05 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-button--as-links.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-button--default.png b/frontend/__snapshots__/lemon-ui-lemon-button--default.png new file mode 100644 index 00000000000..88843b4e9c9 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-button--default.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-button--disabled-with-reason.png b/frontend/__snapshots__/lemon-ui-lemon-button--disabled-with-reason.png new file mode 100644 index 00000000000..15a5df8560e Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-button--disabled-with-reason.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-button--full-width.png b/frontend/__snapshots__/lemon-ui-lemon-button--full-width.png new file mode 100644 index 00000000000..3040d873c8a Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-button--full-width.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-button--loading-via-on-click.png b/frontend/__snapshots__/lemon-ui-lemon-button--loading-via-on-click.png new file mode 100644 index 00000000000..3a204d8bd1a Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-button--loading-via-on-click.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-button--loading.png b/frontend/__snapshots__/lemon-ui-lemon-button--loading.png new file mode 100644 index 00000000000..e8624adcf2f Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-button--loading.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-button--menu-buttons.png b/frontend/__snapshots__/lemon-ui-lemon-button--menu-buttons.png new file mode 100644 index 00000000000..cd10c8a7551 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-button--menu-buttons.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-button--more.png b/frontend/__snapshots__/lemon-ui-lemon-button--more.png new file mode 100644 index 00000000000..56f3d9485f7 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-button--more.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-button--no-padding.png b/frontend/__snapshots__/lemon-ui-lemon-button--no-padding.png new file mode 100644 index 00000000000..d7e5b4f6751 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-button--no-padding.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-button--sizes-icon-only.png b/frontend/__snapshots__/lemon-ui-lemon-button--sizes-icon-only.png new file mode 100644 index 00000000000..9c80f090f33 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-button--sizes-icon-only.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-button--sizes.png b/frontend/__snapshots__/lemon-ui-lemon-button--sizes.png new file mode 100644 index 00000000000..50517f7c706 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-button--sizes.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-button--text-only.png b/frontend/__snapshots__/lemon-ui-lemon-button--text-only.png new file mode 100644 index 00000000000..1a6f9700575 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-button--text-only.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-button--types-and-statuses.png b/frontend/__snapshots__/lemon-ui-lemon-button--types-and-statuses.png new file mode 100644 index 00000000000..706b8c1d029 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-button--types-and-statuses.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-button--with-popup-to-the-bottom.png b/frontend/__snapshots__/lemon-ui-lemon-button--with-popup-to-the-bottom.png new file mode 100644 index 00000000000..79a9f4ae290 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-button--with-popup-to-the-bottom.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-button--with-popup-to-the-right.png b/frontend/__snapshots__/lemon-ui-lemon-button--with-popup-to-the-right.png new file mode 100644 index 00000000000..a62ea4d7f67 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-button--with-popup-to-the-right.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-button--with-side-action.png b/frontend/__snapshots__/lemon-ui-lemon-button--with-side-action.png new file mode 100644 index 00000000000..56ac3038ae8 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-button--with-side-action.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-button--with-side-icon.png b/frontend/__snapshots__/lemon-ui-lemon-button--with-side-icon.png new file mode 100644 index 00000000000..de01c8543a6 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-button--with-side-icon.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-button--with-tooltip.png b/frontend/__snapshots__/lemon-ui-lemon-button--with-tooltip.png new file mode 100644 index 00000000000..88843b4e9c9 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-button--with-tooltip.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-button--with-very-long-popup-to-the-bottom.png b/frontend/__snapshots__/lemon-ui-lemon-button--with-very-long-popup-to-the-bottom.png new file mode 100644 index 00000000000..79a9f4ae290 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-button--with-very-long-popup-to-the-bottom.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--custom-styles.png b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--custom-styles.png new file mode 100644 index 00000000000..710f4dc72a8 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--custom-styles.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--default.png b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--default.png new file mode 100644 index 00000000000..0e49faf8d24 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--default.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--friday-first.png b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--friday-first.png new file mode 100644 index 00000000000..8cc57d7815d Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--friday-first.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--monday-first.png b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--monday-first.png new file mode 100644 index 00000000000..0e49faf8d24 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--monday-first.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--multiple-months.png b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--multiple-months.png new file mode 100644 index 00000000000..b07e412e34f Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--multiple-months.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--saturday-first.png b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--saturday-first.png new file mode 100644 index 00000000000..d22c3d4b650 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--saturday-first.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--sunday-first.png b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--sunday-first.png new file mode 100644 index 00000000000..3ac0dedd310 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--sunday-first.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--thursday-first.png b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--thursday-first.png new file mode 100644 index 00000000000..2daa09266b1 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--thursday-first.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--tuesday-first.png b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--tuesday-first.png new file mode 100644 index 00000000000..5035ace9f02 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--tuesday-first.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--wednesday-first.png b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--wednesday-first.png new file mode 100644 index 00000000000..2677654470c Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar--wednesday-first.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar-range--lemon-calendar-range.png b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar-range--lemon-calendar-range.png new file mode 100644 index 00000000000..47ed4ca2d55 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar-range--lemon-calendar-range.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar-range-inline--lemon-calendar-range-inline.png b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar-range-inline--lemon-calendar-range-inline.png new file mode 100644 index 00000000000..cccdf6b3c9c Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar-range-inline--lemon-calendar-range-inline.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar-select--lemon-calendar-select.png b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar-select--lemon-calendar-select.png new file mode 100644 index 00000000000..a0fcd369f8c Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-calendar-lemon-calendar-select--lemon-calendar-select.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-checkbox--basic.png b/frontend/__snapshots__/lemon-ui-lemon-checkbox--basic.png new file mode 100644 index 00000000000..45fe0ad7681 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-checkbox--basic.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-checkbox--bordered.png b/frontend/__snapshots__/lemon-ui-lemon-checkbox--bordered.png new file mode 100644 index 00000000000..ae48ccfc30d Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-checkbox--bordered.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-checkbox--disabled.png b/frontend/__snapshots__/lemon-ui-lemon-checkbox--disabled.png new file mode 100644 index 00000000000..2f3caf611ce Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-checkbox--disabled.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-checkbox--no-label.png b/frontend/__snapshots__/lemon-ui-lemon-checkbox--no-label.png new file mode 100644 index 00000000000..308fad87553 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-checkbox--no-label.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-checkbox--overview.png b/frontend/__snapshots__/lemon-ui-lemon-checkbox--overview.png new file mode 100644 index 00000000000..b9da8fabd4d Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-checkbox--overview.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-dialog--customised.png b/frontend/__snapshots__/lemon-ui-lemon-dialog--customised.png new file mode 100644 index 00000000000..370b5b1a326 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-dialog--customised.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-dialog--minimal.png b/frontend/__snapshots__/lemon-ui-lemon-dialog--minimal.png new file mode 100644 index 00000000000..9465d3ebda2 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-dialog--minimal.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-dialog--template.png b/frontend/__snapshots__/lemon-ui-lemon-dialog--template.png new file mode 100644 index 00000000000..b58a325500f Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-dialog--template.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-divider--default.png b/frontend/__snapshots__/lemon-ui-lemon-divider--default.png new file mode 100644 index 00000000000..c3dd551fea6 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-divider--default.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-divider--large.png b/frontend/__snapshots__/lemon-ui-lemon-divider--large.png new file mode 100644 index 00000000000..3040b4d5a48 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-divider--large.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-divider--thick-dashed.png b/frontend/__snapshots__/lemon-ui-lemon-divider--thick-dashed.png new file mode 100644 index 00000000000..38a7ff3adb0 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-divider--thick-dashed.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-divider--vertical.png b/frontend/__snapshots__/lemon-ui-lemon-divider--vertical.png new file mode 100644 index 00000000000..67a9c109067 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-divider--vertical.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-file-input--default.png b/frontend/__snapshots__/lemon-ui-lemon-file-input--default.png new file mode 100644 index 00000000000..0204ecc04cd Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-file-input--default.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-input--basic.png b/frontend/__snapshots__/lemon-ui-lemon-input--basic.png new file mode 100644 index 00000000000..964a238615e Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-input--basic.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-input--clearable.png b/frontend/__snapshots__/lemon-ui-lemon-input--clearable.png new file mode 100644 index 00000000000..c3ad04a3531 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-input--clearable.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-input--danger-status.png b/frontend/__snapshots__/lemon-ui-lemon-input--danger-status.png new file mode 100644 index 00000000000..6a377ee6467 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-input--danger-status.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-input--disabled.png b/frontend/__snapshots__/lemon-ui-lemon-input--disabled.png new file mode 100644 index 00000000000..06cd01005f2 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-input--disabled.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-input--numeric.png b/frontend/__snapshots__/lemon-ui-lemon-input--numeric.png new file mode 100644 index 00000000000..0b42bdb099a Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-input--numeric.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-input--password.png b/frontend/__snapshots__/lemon-ui-lemon-input--password.png new file mode 100644 index 00000000000..470465513f9 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-input--password.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-input--search.png b/frontend/__snapshots__/lemon-ui-lemon-input--search.png new file mode 100644 index 00000000000..0055e6019d2 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-input--search.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-input--small.png b/frontend/__snapshots__/lemon-ui-lemon-input--small.png new file mode 100644 index 00000000000..ae45f9e9f5c Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-input--small.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-input--with-prefix-and-suffix-action.png b/frontend/__snapshots__/lemon-ui-lemon-input--with-prefix-and-suffix-action.png new file mode 100644 index 00000000000..72c0aa36ce2 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-input--with-prefix-and-suffix-action.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-label--basic.png b/frontend/__snapshots__/lemon-ui-lemon-label--basic.png new file mode 100644 index 00000000000..cf07f7d9a54 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-label--basic.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-label--overview.png b/frontend/__snapshots__/lemon-ui-lemon-label--overview.png new file mode 100644 index 00000000000..a46a83fe785 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-label--overview.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-modal--inline.png b/frontend/__snapshots__/lemon-ui-lemon-modal--inline.png new file mode 100644 index 00000000000..481b947482f Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-modal--inline.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-modal--lemon-modal.png b/frontend/__snapshots__/lemon-ui-lemon-modal--lemon-modal.png new file mode 100644 index 00000000000..0b8b771d27a Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-modal--lemon-modal.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-modal--with-custom-content.png b/frontend/__snapshots__/lemon-ui-lemon-modal--with-custom-content.png new file mode 100644 index 00000000000..e2c8b4b867d Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-modal--with-custom-content.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-modal--without-content.png b/frontend/__snapshots__/lemon-ui-lemon-modal--without-content.png new file mode 100644 index 00000000000..0b8b771d27a Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-modal--without-content.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-row--danger.png b/frontend/__snapshots__/lemon-ui-lemon-row--danger.png new file mode 100644 index 00000000000..11047d7d9c8 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-row--danger.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-row--default.png b/frontend/__snapshots__/lemon-ui-lemon-row--default.png new file mode 100644 index 00000000000..1d44f593f51 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-row--default.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-row--disabled.png b/frontend/__snapshots__/lemon-ui-lemon-row--disabled.png new file mode 100644 index 00000000000..d6a2ce74486 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-row--disabled.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-row--full-width.png b/frontend/__snapshots__/lemon-ui-lemon-row--full-width.png new file mode 100644 index 00000000000..91932c55707 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-row--full-width.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-row--icon-only.png b/frontend/__snapshots__/lemon-ui-lemon-row--icon-only.png new file mode 100644 index 00000000000..7356e72375f Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-row--icon-only.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-row--large.png b/frontend/__snapshots__/lemon-ui-lemon-row--large.png new file mode 100644 index 00000000000..a2b7ab4a09a Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-row--large.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-row--loading.png b/frontend/__snapshots__/lemon-ui-lemon-row--loading.png new file mode 100644 index 00000000000..17434afe573 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-row--loading.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-row--outlined.png b/frontend/__snapshots__/lemon-ui-lemon-row--outlined.png new file mode 100644 index 00000000000..4ae85c1f55d Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-row--outlined.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-row--small.png b/frontend/__snapshots__/lemon-ui-lemon-row--small.png new file mode 100644 index 00000000000..0780bf2d805 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-row--small.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-row--success.png b/frontend/__snapshots__/lemon-ui-lemon-row--success.png new file mode 100644 index 00000000000..2543c168fd5 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-row--success.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-row--tall.png b/frontend/__snapshots__/lemon-ui-lemon-row--tall.png new file mode 100644 index 00000000000..79fad8b57a0 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-row--tall.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-row--text-only.png b/frontend/__snapshots__/lemon-ui-lemon-row--text-only.png new file mode 100644 index 00000000000..12f595d4c5e Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-row--text-only.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-row--warning.png b/frontend/__snapshots__/lemon-ui-lemon-row--warning.png new file mode 100644 index 00000000000..a9a28d79f0d Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-row--warning.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-row--with-extended-content.png b/frontend/__snapshots__/lemon-ui-lemon-row--with-extended-content.png new file mode 100644 index 00000000000..95c568bb018 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-row--with-extended-content.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-row--with-side-icon.png b/frontend/__snapshots__/lemon-ui-lemon-row--with-side-icon.png new file mode 100644 index 00000000000..789ce8ac375 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-row--with-side-icon.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-row--with-tooltip.png b/frontend/__snapshots__/lemon-ui-lemon-row--with-tooltip.png new file mode 100644 index 00000000000..1d44f593f51 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-row--with-tooltip.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-select--clearable.png b/frontend/__snapshots__/lemon-ui-lemon-select--clearable.png new file mode 100644 index 00000000000..117c2111cc7 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-select--clearable.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-select--custom-element.png b/frontend/__snapshots__/lemon-ui-lemon-select--custom-element.png new file mode 100644 index 00000000000..303196352c1 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-select--custom-element.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-select--default.png b/frontend/__snapshots__/lemon-ui-lemon-select--default.png new file mode 100644 index 00000000000..2abee653a4b Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-select--default.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-select--full-width.png b/frontend/__snapshots__/lemon-ui-lemon-select--full-width.png new file mode 100644 index 00000000000..43c60b1213a Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-select--full-width.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-select--long-options.png b/frontend/__snapshots__/lemon-ui-lemon-select--long-options.png new file mode 100644 index 00000000000..ae435b05902 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-select--long-options.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-select--mixed-values-types.png b/frontend/__snapshots__/lemon-ui-lemon-select--mixed-values-types.png new file mode 100644 index 00000000000..2abee653a4b Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-select--mixed-values-types.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-select--nested-select.png b/frontend/__snapshots__/lemon-ui-lemon-select--nested-select.png new file mode 100644 index 00000000000..2abee653a4b Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-select--nested-select.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-select--sectioned-options.png b/frontend/__snapshots__/lemon-ui-lemon-select--sectioned-options.png new file mode 100644 index 00000000000..2abee653a4b Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-select--sectioned-options.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-selectmultiple--default.png b/frontend/__snapshots__/lemon-ui-lemon-selectmultiple--default.png new file mode 100644 index 00000000000..ff77896d084 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-selectmultiple--default.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-selectmultiple--disabled.png b/frontend/__snapshots__/lemon-ui-lemon-selectmultiple--disabled.png new file mode 100644 index 00000000000..2a634a9605c Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-selectmultiple--disabled.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-selectmultiple--loading.png b/frontend/__snapshots__/lemon-ui-lemon-selectmultiple--loading.png new file mode 100644 index 00000000000..6e5ecae1c89 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-selectmultiple--loading.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-selectmultiple--multiple-select-with-custom.png b/frontend/__snapshots__/lemon-ui-lemon-selectmultiple--multiple-select-with-custom.png new file mode 100644 index 00000000000..f03249836d7 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-selectmultiple--multiple-select-with-custom.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-selectmultiple--multiple-select.png b/frontend/__snapshots__/lemon-ui-lemon-selectmultiple--multiple-select.png new file mode 100644 index 00000000000..f03249836d7 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-selectmultiple--multiple-select.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-selectmultiple--no-options.png b/frontend/__snapshots__/lemon-ui-lemon-selectmultiple--no-options.png new file mode 100644 index 00000000000..f03249836d7 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-selectmultiple--no-options.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-skeleton--customisation.png b/frontend/__snapshots__/lemon-ui-lemon-skeleton--customisation.png new file mode 100644 index 00000000000..5f3a4d25af0 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-skeleton--customisation.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-skeleton--dark-background.png b/frontend/__snapshots__/lemon-ui-lemon-skeleton--dark-background.png new file mode 100644 index 00000000000..9eb200d7990 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-skeleton--dark-background.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-skeleton--default.png b/frontend/__snapshots__/lemon-ui-lemon-skeleton--default.png new file mode 100644 index 00000000000..f8825b08716 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-skeleton--default.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-skeleton--presets.png b/frontend/__snapshots__/lemon-ui-lemon-skeleton--presets.png new file mode 100644 index 00000000000..d2da417207f Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-skeleton--presets.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-skeleton--repeat.png b/frontend/__snapshots__/lemon-ui-lemon-skeleton--repeat.png new file mode 100644 index 00000000000..92646012408 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-skeleton--repeat.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-snack--colors.png b/frontend/__snapshots__/lemon-ui-lemon-snack--colors.png new file mode 100644 index 00000000000..16e99979312 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-snack--colors.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-snack--complex-content.png b/frontend/__snapshots__/lemon-ui-lemon-snack--complex-content.png new file mode 100644 index 00000000000..e8d5584d2f5 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-snack--complex-content.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-snack--default.png b/frontend/__snapshots__/lemon-ui-lemon-snack--default.png new file mode 100644 index 00000000000..fe21f46552f Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-snack--default.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-snack--overflow-options.png b/frontend/__snapshots__/lemon-ui-lemon-snack--overflow-options.png new file mode 100644 index 00000000000..dce646e5892 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-snack--overflow-options.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-snack--pill.png b/frontend/__snapshots__/lemon-ui-lemon-snack--pill.png new file mode 100644 index 00000000000..ba7ea4c1cf3 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-snack--pill.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-switch--basic.png b/frontend/__snapshots__/lemon-ui-lemon-switch--basic.png new file mode 100644 index 00000000000..19cc9c73d54 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-switch--basic.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-switch--bordered.png b/frontend/__snapshots__/lemon-ui-lemon-switch--bordered.png new file mode 100644 index 00000000000..0196ff670f3 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-switch--bordered.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-switch--disabled.png b/frontend/__snapshots__/lemon-ui-lemon-switch--disabled.png new file mode 100644 index 00000000000..3ed67e00eea Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-switch--disabled.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-switch--overview.png b/frontend/__snapshots__/lemon-ui-lemon-switch--overview.png new file mode 100644 index 00000000000..3dd1f40feb9 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-switch--overview.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-switch--standalone.png b/frontend/__snapshots__/lemon-ui-lemon-switch--standalone.png new file mode 100644 index 00000000000..70b06fd9ca6 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-switch--standalone.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-table--basic.png b/frontend/__snapshots__/lemon-ui-lemon-table--basic.png new file mode 100644 index 00000000000..2d583788452 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-table--basic.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-table--borderless.png b/frontend/__snapshots__/lemon-ui-lemon-table--borderless.png new file mode 100644 index 00000000000..17bb1eb19a9 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-table--borderless.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-table--embedded.png b/frontend/__snapshots__/lemon-ui-lemon-table--embedded.png new file mode 100644 index 00000000000..a77bff20673 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-table--embedded.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-table--empty-loading-with-many-skeleton-rows.png b/frontend/__snapshots__/lemon-ui-lemon-table--empty-loading-with-many-skeleton-rows.png new file mode 100644 index 00000000000..07333eced2c Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-table--empty-loading-with-many-skeleton-rows.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-table--empty-loading.png b/frontend/__snapshots__/lemon-ui-lemon-table--empty-loading.png new file mode 100644 index 00000000000..1b09101731e Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-table--empty-loading.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-table--empty.png b/frontend/__snapshots__/lemon-ui-lemon-table--empty.png new file mode 100644 index 00000000000..e310597eb18 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-table--empty.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-table--grouped.png b/frontend/__snapshots__/lemon-ui-lemon-table--grouped.png new file mode 100644 index 00000000000..a5a77fdc22d Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-table--grouped.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-table--loading.png b/frontend/__snapshots__/lemon-ui-lemon-table--loading.png new file mode 100644 index 00000000000..161177bd507 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-table--loading.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-table--paginated-automatically.png b/frontend/__snapshots__/lemon-ui-lemon-table--paginated-automatically.png new file mode 100644 index 00000000000..5ffe55395ba Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-table--paginated-automatically.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-table--small.png b/frontend/__snapshots__/lemon-ui-lemon-table--small.png new file mode 100644 index 00000000000..9c82e5d4cbe Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-table--small.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-table--with-color-coded-rows.png b/frontend/__snapshots__/lemon-ui-lemon-table--with-color-coded-rows.png new file mode 100644 index 00000000000..de39442a12b Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-table--with-color-coded-rows.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-table--with-expandable-rows.png b/frontend/__snapshots__/lemon-ui-lemon-table--with-expandable-rows.png new file mode 100644 index 00000000000..62b98dc929c Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-table--with-expandable-rows.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-table--with-highlighted-rows.png b/frontend/__snapshots__/lemon-ui-lemon-table--with-highlighted-rows.png new file mode 100644 index 00000000000..b7ab747281a Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-table--with-highlighted-rows.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-table--with-mandatory-sorting.png b/frontend/__snapshots__/lemon-ui-lemon-table--with-mandatory-sorting.png new file mode 100644 index 00000000000..b180793d182 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-table--with-mandatory-sorting.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-table--without-header.png b/frontend/__snapshots__/lemon-ui-lemon-table--without-header.png new file mode 100644 index 00000000000..90438f664d6 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-table--without-header.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-table--without-uppercasing-in-header.png b/frontend/__snapshots__/lemon-ui-lemon-table--without-uppercasing-in-header.png new file mode 100644 index 00000000000..f3e5add7ca8 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-table--without-uppercasing-in-header.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-table--x-small.png b/frontend/__snapshots__/lemon-ui-lemon-table--x-small.png new file mode 100644 index 00000000000..e1449f51e4d Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-table--x-small.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-text-area--basic.png b/frontend/__snapshots__/lemon-ui-lemon-text-area--basic.png new file mode 100644 index 00000000000..d89322556c6 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-text-area--basic.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-text-area--disabled.png b/frontend/__snapshots__/lemon-ui-lemon-text-area--disabled.png new file mode 100644 index 00000000000..59872ce10bc Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-text-area--disabled.png differ diff --git a/frontend/__snapshots__/lemon-ui-lemon-text-area--lemon-text-markdown.png b/frontend/__snapshots__/lemon-ui-lemon-text-area--lemon-text-markdown.png new file mode 100644 index 00000000000..376dbc6b4c5 Binary files /dev/null and b/frontend/__snapshots__/lemon-ui-lemon-text-area--lemon-text-markdown.png differ diff --git a/frontend/src/layout/navigation/Navigation.stories.tsx b/frontend/src/layout/navigation/Navigation.stories.tsx index 23e3605bef1..281fbe110e1 100644 --- a/frontend/src/layout/navigation/Navigation.stories.tsx +++ b/frontend/src/layout/navigation/Navigation.stories.tsx @@ -9,7 +9,12 @@ import { useEffect } from 'react' export default { title: 'Layout/Navigation', - parameters: { layout: 'fullscreen', options: { showPanel: false }, viewMode: 'story' }, + parameters: { + layout: 'fullscreen', + options: { showPanel: false }, + viewMode: 'story', + testRunner: { includeNavigation: true }, + }, } as Meta function BaseAppPage(): JSX.Element { diff --git a/frontend/src/lib/components/ActivityLog/ActivityLog.stories.tsx b/frontend/src/lib/components/ActivityLog/ActivityLog.stories.tsx index 3267ebff9a6..ee57c2b7fc2 100644 --- a/frontend/src/lib/components/ActivityLog/ActivityLog.stories.tsx +++ b/frontend/src/lib/components/ActivityLog/ActivityLog.stories.tsx @@ -11,9 +11,7 @@ import { ActivityScope } from 'lib/components/ActivityLog/humanizeActivity' export default { title: 'Components/ActivityLog', component: ActivityLog, - parameters: { - chromatic: { disableSnapshot: false }, - }, + parameters: {}, decorators: [ mswDecorator({ get: { diff --git a/frontend/src/lib/components/ActivityLog/SentenceList.stories.tsx b/frontend/src/lib/components/ActivityLog/SentenceList.stories.tsx index c390829dc35..10b31577b96 100644 --- a/frontend/src/lib/components/ActivityLog/SentenceList.stories.tsx +++ b/frontend/src/lib/components/ActivityLog/SentenceList.stories.tsx @@ -4,9 +4,7 @@ import { SentenceList, SentenceListProps } from './SentenceList' export default { title: 'Components/SentenceList', component: SentenceList, - parameters: { - chromatic: { disableSnapshot: false }, - }, + parameters: {}, } as ComponentMeta const Template: ComponentStory = (props: SentenceListProps) => { diff --git a/frontend/src/lib/components/Animation/Animation.stories.tsx b/frontend/src/lib/components/Animation/Animation.stories.tsx index 52b21320128..bb1b8e95195 100644 --- a/frontend/src/lib/components/Animation/Animation.stories.tsx +++ b/frontend/src/lib/components/Animation/Animation.stories.tsx @@ -11,7 +11,6 @@ export default { 'Animations are [LottieFiles.com](https://lottiefiles.com/) animations that we load asynchronously.', }, }, - chromatic: { disableSnapshot: false }, }, argTypes: { size: { diff --git a/frontend/src/lib/components/Cards/InsightCard/InsightCard.stories.tsx b/frontend/src/lib/components/Cards/InsightCard/InsightCard.stories.tsx index d4a4872c50e..f14b54bcc95 100644 --- a/frontend/src/lib/components/Cards/InsightCard/InsightCard.stories.tsx +++ b/frontend/src/lib/components/Cards/InsightCard/InsightCard.stories.tsx @@ -285,9 +285,7 @@ const EXAMPLE_FUNNEL: InsightModel = { export default { title: 'Components/Cards/Insight Card', component: InsightCardComponent, - parameters: { - chromatic: { disableSnapshot: false }, - }, + parameters: {}, argTypes: { insightName: { control: { type: 'text' }, diff --git a/frontend/src/lib/components/Cards/TextCard/TextCard.stories.tsx b/frontend/src/lib/components/Cards/TextCard/TextCard.stories.tsx index dc85efee189..c633afcfe37 100644 --- a/frontend/src/lib/components/Cards/TextCard/TextCard.stories.tsx +++ b/frontend/src/lib/components/Cards/TextCard/TextCard.stories.tsx @@ -5,9 +5,7 @@ import { TextCard } from './TextCard' export default { title: 'Components/Cards/Text Card', component: TextCard, - parameters: { - chromatic: { disableSnapshot: false }, - }, + parameters: {}, } as Meta const makeTextTile = (body: string, color: InsightColor | null = null): DashboardTile => { diff --git a/frontend/src/lib/components/CompactList/CompactList.stories.tsx b/frontend/src/lib/components/CompactList/CompactList.stories.tsx index 49061bcd932..29d5a9e3f6a 100644 --- a/frontend/src/lib/components/CompactList/CompactList.stories.tsx +++ b/frontend/src/lib/components/CompactList/CompactList.stories.tsx @@ -8,7 +8,6 @@ import { PersonHeader } from 'scenes/persons/PersonHeader' export default { title: 'Components/Compact List', component: CompactList, - parameters: { chromatic: { disableSnapshot: false } }, argTypes: { loading: { control: { diff --git a/frontend/src/lib/components/EditableField/EditableField.stories.tsx b/frontend/src/lib/components/EditableField/EditableField.stories.tsx index 9a1637e7a98..55b79f11dc3 100644 --- a/frontend/src/lib/components/EditableField/EditableField.stories.tsx +++ b/frontend/src/lib/components/EditableField/EditableField.stories.tsx @@ -7,7 +7,6 @@ import { useState } from 'react' export default { title: 'Components/Editable Field', component: EditableFieldComponent, - parameters: { chromatic: { disableSnapshot: false } }, } as ComponentMeta export function EditableField_(): JSX.Element { diff --git a/frontend/src/lib/components/EmptyMessage/EmptyMessage.stories.tsx b/frontend/src/lib/components/EmptyMessage/EmptyMessage.stories.tsx index a52bce2fc59..ce506983717 100644 --- a/frontend/src/lib/components/EmptyMessage/EmptyMessage.stories.tsx +++ b/frontend/src/lib/components/EmptyMessage/EmptyMessage.stories.tsx @@ -5,7 +5,6 @@ import { EmptyMessage } from './EmptyMessage' export default { title: 'Components/Empty Message', component: EmptyMessage, - parameters: { chromatic: { disableSnapshot: false } }, } as ComponentMeta export function EmptyMessage_(): JSX.Element { diff --git a/frontend/src/lib/components/EventSelect/EventSelect.stories.tsx b/frontend/src/lib/components/EventSelect/EventSelect.stories.tsx index 9c4895c3198..1e5ff9bddbd 100644 --- a/frontend/src/lib/components/EventSelect/EventSelect.stories.tsx +++ b/frontend/src/lib/components/EventSelect/EventSelect.stories.tsx @@ -42,9 +42,7 @@ export default { }, }), ], - parameters: { - chromatic: { disableSnapshot: false }, - }, + parameters: {}, } as Meta export function EventSelect_(): JSX.Element { diff --git a/frontend/src/lib/components/LemonBadge/index.ts b/frontend/src/lib/components/LemonBadge/index.ts index 9d3d4f910fd..1c064e83a14 100644 --- a/frontend/src/lib/components/LemonBadge/index.ts +++ b/frontend/src/lib/components/LemonBadge/index.ts @@ -1 +1,2 @@ -export { LemonBadge, LemonBadgeProps } from './LemonBadge' +export { LemonBadge } from './LemonBadge' +export type { LemonBadgeProps } from './LemonBadge' diff --git a/frontend/src/lib/components/LemonButton/LemonButton.stories.tsx b/frontend/src/lib/components/LemonButton/LemonButton.stories.tsx index 756ebf3e505..9ab48807005 100644 --- a/frontend/src/lib/components/LemonButton/LemonButton.stories.tsx +++ b/frontend/src/lib/components/LemonButton/LemonButton.stories.tsx @@ -22,7 +22,6 @@ const types: LemonButtonProps['type'][] = ['primary', 'secondary', 'tertiary'] export default { title: 'Lemon UI/Lemon Button', component: LemonButton, - parameters: { chromatic: { disableSnapshot: false } }, argTypes: { icon: { defaultValue: , @@ -31,6 +30,9 @@ export default { defaultValue: 'Click me', }, }, + parameters: { + chromatic: { disableSnapshot: false }, + }, } as ComponentMeta const BasicTemplate: ComponentStory = (props: LemonButtonProps) => { @@ -121,6 +123,7 @@ export const SizesIconOnly = (): JSX.Element => { export const DisabledWithReason = (): JSX.Element => { return } +// TODO: Add DisabledWithReason.play for a proper snapshot showcasing the tooltip export const Loading = (): JSX.Element => { return diff --git a/frontend/src/lib/components/LemonCalendar/LemonCalendar.stories.tsx b/frontend/src/lib/components/LemonCalendar/LemonCalendar.stories.tsx index c82aa968100..1c8e2e5f628 100644 --- a/frontend/src/lib/components/LemonCalendar/LemonCalendar.stories.tsx +++ b/frontend/src/lib/components/LemonCalendar/LemonCalendar.stories.tsx @@ -5,7 +5,6 @@ import { dayjs } from 'lib/dayjs' export default { title: 'Lemon UI/Lemon Calendar/Lemon Calendar', component: LemonCalendar, - parameters: { chromatic: { disableSnapshot: false } }, argTypes: { onClick: { defaultValue: (date: dayjs.Dayjs) => { @@ -13,6 +12,10 @@ export default { }, }, }, + parameters: { + mockDate: '2023-01-26', + chromatic: { disableSnapshot: false }, + }, } as ComponentMeta const BasicTemplate: ComponentStory = (props: LemonCalendarProps) => { diff --git a/frontend/src/lib/components/LemonCalendar/LemonCalendarSelect.stories.tsx b/frontend/src/lib/components/LemonCalendar/LemonCalendarSelect.stories.tsx index 5d2dac67e2e..425ff60fe1b 100644 --- a/frontend/src/lib/components/LemonCalendar/LemonCalendarSelect.stories.tsx +++ b/frontend/src/lib/components/LemonCalendar/LemonCalendarSelect.stories.tsx @@ -9,7 +9,10 @@ import { formatDate } from 'lib/utils' export default { title: 'Lemon UI/Lemon Calendar/Lemon Calendar Select', component: LemonCalendarSelect, - parameters: { chromatic: { disableSnapshot: false } }, + parameters: { + mockDate: '2023-01-26', + chromatic: { disableSnapshot: false }, + }, } as ComponentMeta const BasicTemplate: ComponentStory = (props: LemonCalendarSelectProps) => { diff --git a/frontend/src/lib/components/LemonCalendarRange/LemonCalendarRange.stories.tsx b/frontend/src/lib/components/LemonCalendarRange/LemonCalendarRange.stories.tsx index 201cebc2ccb..9f1a7ac4791 100644 --- a/frontend/src/lib/components/LemonCalendarRange/LemonCalendarRange.stories.tsx +++ b/frontend/src/lib/components/LemonCalendarRange/LemonCalendarRange.stories.tsx @@ -9,7 +9,10 @@ import { formatDateRange } from 'lib/utils' export default { title: 'Lemon UI/Lemon Calendar/Lemon Calendar Range', component: LemonCalendarRange, - parameters: { chromatic: { disableSnapshot: false } }, + parameters: { + mockDate: '2023-01-26', + chromatic: { disableSnapshot: false }, + }, } as ComponentMeta const BasicTemplate: ComponentStory = (props: LemonCalendarRangeProps) => { diff --git a/frontend/src/lib/components/LemonCalendarRange/LemonCalendarRangeInline.stories.tsx b/frontend/src/lib/components/LemonCalendarRange/LemonCalendarRangeInline.stories.tsx index 1dff1747ebc..ede6371ef2e 100644 --- a/frontend/src/lib/components/LemonCalendarRange/LemonCalendarRangeInline.stories.tsx +++ b/frontend/src/lib/components/LemonCalendarRange/LemonCalendarRangeInline.stories.tsx @@ -8,7 +8,10 @@ import { LemonCalendarRangeInline } from './LemonCalendarRangeInline' export default { title: 'Lemon UI/Lemon Calendar/Lemon Calendar Range Inline', component: LemonCalendarRangeInline, - parameters: { chromatic: { disableSnapshot: false } }, + parameters: { + mockDate: '2023-01-26', + chromatic: { disableSnapshot: false }, + }, } as ComponentMeta const BasicTemplate: ComponentStory = (props: LemonCalendarRangeProps) => { diff --git a/frontend/src/lib/components/LemonCheckbox/LemonCheckbox.stories.tsx b/frontend/src/lib/components/LemonCheckbox/LemonCheckbox.stories.tsx index c5ce966c7b0..3bd6511c85e 100644 --- a/frontend/src/lib/components/LemonCheckbox/LemonCheckbox.stories.tsx +++ b/frontend/src/lib/components/LemonCheckbox/LemonCheckbox.stories.tsx @@ -4,7 +4,9 @@ import { LemonCheckbox, LemonCheckboxProps } from './LemonCheckbox' export default { title: 'Lemon UI/Lemon Checkbox', component: LemonCheckbox, - parameters: { chromatic: { disableSnapshot: false } }, + parameters: { + chromatic: { disableSnapshot: false }, + }, } as ComponentMeta const Template: ComponentStory = (props: LemonCheckboxProps) => { diff --git a/frontend/src/lib/components/LemonDialog/LemonDialog.stories.tsx b/frontend/src/lib/components/LemonDialog/LemonDialog.stories.tsx index 8231659a4d3..ab231fe71e0 100644 --- a/frontend/src/lib/components/LemonDialog/LemonDialog.stories.tsx +++ b/frontend/src/lib/components/LemonDialog/LemonDialog.stories.tsx @@ -2,7 +2,6 @@ import { ComponentMeta, ComponentStory } from '@storybook/react' import { LemonDialog, LemonDialogProps } from './LemonDialog' import { LemonButton } from '../LemonButton' import { Link } from '@posthog/lemon-ui' -import { CodeSnippet, Language } from 'lib/components/CodeSnippet' export default { title: 'Lemon UI/Lemon Dialog', @@ -53,15 +52,9 @@ export const Template: ComponentStory = (props: LemonDialogP
- onClick()} className="mx-auto mt-2"> - Open as Dialog + Open as modal - -

Usage

- - {`LemonDialog.open(${JSON.stringify(props, null, 2)})`} - ) } diff --git a/frontend/src/lib/components/LemonDivider/LemonDivider.stories.tsx b/frontend/src/lib/components/LemonDivider/LemonDivider.stories.tsx index ae7d7b61b59..af78243bd64 100644 --- a/frontend/src/lib/components/LemonDivider/LemonDivider.stories.tsx +++ b/frontend/src/lib/components/LemonDivider/LemonDivider.stories.tsx @@ -8,7 +8,9 @@ import { ProfileBubbles } from '../ProfilePicture' export default { title: 'Lemon UI/Lemon Divider', component: LemonDivider, - parameters: { chromatic: { disableSnapshot: false } }, + parameters: { + chromatic: { disableSnapshot: false }, + }, } as ComponentMeta const HorizontalTemplate: ComponentStory = (props: LemonDividerProps) => { diff --git a/frontend/src/lib/components/LemonFileInput/LemonFileInput.stories.tsx b/frontend/src/lib/components/LemonFileInput/LemonFileInput.stories.tsx index 874232c3373..b836265367c 100644 --- a/frontend/src/lib/components/LemonFileInput/LemonFileInput.stories.tsx +++ b/frontend/src/lib/components/LemonFileInput/LemonFileInput.stories.tsx @@ -5,11 +5,13 @@ import { createRef, useState } from 'react' export default { title: 'Lemon UI/Lemon File Input', component: LemonFileInput, - parameters: { chromatic: { disableSnapshot: false } }, argTypes: { loading: { type: 'boolean', defaultValue: false }, accept: { type: 'string', defaultValue: '.json' }, }, + parameters: { + chromatic: { disableSnapshot: false }, + }, } as ComponentMeta const Template: ComponentStory = (props) => { diff --git a/frontend/src/lib/components/LemonInput/LemonInput.stories.tsx b/frontend/src/lib/components/LemonInput/LemonInput.stories.tsx index 4755afe9403..c400cc2a7ab 100644 --- a/frontend/src/lib/components/LemonInput/LemonInput.stories.tsx +++ b/frontend/src/lib/components/LemonInput/LemonInput.stories.tsx @@ -8,10 +8,12 @@ import { LemonButtonWithPopup } from 'lib/components/LemonButton' export default { title: 'Lemon UI/Lemon Input', component: LemonInput, - parameters: { chromatic: { disableSnapshot: false } }, argTypes: { value: { defaultValue: 'Foo' }, }, + parameters: { + chromatic: { disableSnapshot: false }, + }, } as ComponentMeta const Template: ComponentStory = (props) => { diff --git a/frontend/src/lib/components/LemonLabel/LemonLabel.stories.tsx b/frontend/src/lib/components/LemonLabel/LemonLabel.stories.tsx index 5386031d33d..8834acee9cc 100644 --- a/frontend/src/lib/components/LemonLabel/LemonLabel.stories.tsx +++ b/frontend/src/lib/components/LemonLabel/LemonLabel.stories.tsx @@ -6,7 +6,6 @@ import { LemonModal } from '@posthog/lemon-ui' export default { title: 'Lemon UI/Lemon Label', component: LemonLabel, - parameters: { chromatic: { disableSnapshot: false } }, docs: { description: { component: ` @@ -18,6 +17,9 @@ Lemon Labels provide common styling and options for labeling form elements. They `, }, }, + parameters: { + chromatic: { disableSnapshot: false }, + }, } as ComponentMeta const Template: ComponentStory = (props: LemonLabelProps) => { diff --git a/frontend/src/lib/components/LemonModal/LemonModal.stories.tsx b/frontend/src/lib/components/LemonModal/LemonModal.stories.tsx index 5da82b76b6a..2bbfedc14cd 100644 --- a/frontend/src/lib/components/LemonModal/LemonModal.stories.tsx +++ b/frontend/src/lib/components/LemonModal/LemonModal.stories.tsx @@ -6,7 +6,9 @@ import { LemonButton } from '../LemonButton' export default { title: 'Lemon UI/Lemon Modal', component: LemonModal, - parameters: { chromatic: { disableSnapshot: false } }, + parameters: { + chromatic: { disableSnapshot: false }, + }, } as ComponentMeta export const _LemonModal: ComponentStory = (props: LemonModalProps) => { diff --git a/frontend/src/lib/components/LemonRow/LemonRow.stories.tsx b/frontend/src/lib/components/LemonRow/LemonRow.stories.tsx index 614d42ce0ab..a046c9135b2 100644 --- a/frontend/src/lib/components/LemonRow/LemonRow.stories.tsx +++ b/frontend/src/lib/components/LemonRow/LemonRow.stories.tsx @@ -5,7 +5,6 @@ import { LemonRow, LemonRowProps } from './LemonRow' export default { title: 'Lemon UI/Lemon Row', component: LemonRow, - parameters: { chromatic: { disableSnapshot: false } }, argTypes: { icon: { defaultValue: , @@ -14,6 +13,9 @@ export default { defaultValue: 'Information', }, }, + parameters: { + chromatic: { disableSnapshot: false }, + }, } as ComponentMeta const Template: ComponentStory = (props: LemonRowProps) => { diff --git a/frontend/src/lib/components/LemonSelectMultiple/LemonSelectMultiple.stories.tsx b/frontend/src/lib/components/LemonSelectMultiple/LemonSelectMultiple.stories.tsx index cd59289f8b5..9efe11759dc 100644 --- a/frontend/src/lib/components/LemonSelectMultiple/LemonSelectMultiple.stories.tsx +++ b/frontend/src/lib/components/LemonSelectMultiple/LemonSelectMultiple.stories.tsx @@ -7,7 +7,6 @@ import { capitalizeFirstLetter } from 'lib/utils' export default { title: 'Lemon UI/Lemon SelectMultiple', component: LemonSelectMultiple, - parameters: { chromatic: { disableSnapshot: false } }, argTypes: { options: { defaultValue: ['ben', 'marius', 'paul', 'tiina', 'li'].reduce( @@ -29,6 +28,9 @@ export default { ), }, }, + parameters: { + chromatic: { disableSnapshot: false }, + }, } as ComponentMeta const Template: ComponentStory = (props: LemonSelectMultipleProps) => { diff --git a/frontend/src/lib/components/LemonSkeleton/LemonSkeleton.scss b/frontend/src/lib/components/LemonSkeleton/LemonSkeleton.scss index 6d8ce2e01e2..bbd07691933 100644 --- a/frontend/src/lib/components/LemonSkeleton/LemonSkeleton.scss +++ b/frontend/src/lib/components/LemonSkeleton/LemonSkeleton.scss @@ -18,6 +18,16 @@ &.LemonSkeleton--static { animation: none; } + + // The following CSS visually hides the "Loading…" span, but still leaves it available for a screen reader + // See https://adrianroselli.com/2020/11/more-accessible-skeletons.html + > span { + display: block; + overflow: hidden; + width: 1px; + height: 1px; + white-space: nowrap; + } } @keyframes lemon-skeleton-loading { diff --git a/frontend/src/lib/components/LemonSkeleton/LemonSkeleton.tsx b/frontend/src/lib/components/LemonSkeleton/LemonSkeleton.tsx index 40cbb593f05..81a6947aa97 100644 --- a/frontend/src/lib/components/LemonSkeleton/LemonSkeleton.tsx +++ b/frontend/src/lib/components/LemonSkeleton/LemonSkeleton.tsx @@ -13,7 +13,10 @@ export interface LemonSkeletonProps { } export function LemonSkeleton({ className, repeat, active = true, fade = false }: LemonSkeletonProps): JSX.Element { const content = ( -
+
+ {/* The span is for accessibility, but also because @storybook/test-runner smoke tests require content */} + Loading… +
) if (repeat) { diff --git a/frontend/src/lib/components/LemonSnack/LemonSnack.stories.tsx b/frontend/src/lib/components/LemonSnack/LemonSnack.stories.tsx index dacd5585214..e565faf1ff1 100644 --- a/frontend/src/lib/components/LemonSnack/LemonSnack.stories.tsx +++ b/frontend/src/lib/components/LemonSnack/LemonSnack.stories.tsx @@ -5,12 +5,14 @@ import { ProfilePicture } from '../ProfilePicture' export default { title: 'Lemon UI/Lemon Snack', component: LemonSnack, - parameters: { chromatic: { disableSnapshot: false } }, argTypes: { children: { defaultValue: 'Tasty snacks', }, }, + parameters: { + chromatic: { disableSnapshot: false }, + }, } as ComponentMeta const BasicTemplate: ComponentStory = (props: LemonSnackProps) => { diff --git a/frontend/src/lib/components/LemonSwitch/LemonSwitch.stories.tsx b/frontend/src/lib/components/LemonSwitch/LemonSwitch.stories.tsx index 053227e491e..49f97b76ab7 100644 --- a/frontend/src/lib/components/LemonSwitch/LemonSwitch.stories.tsx +++ b/frontend/src/lib/components/LemonSwitch/LemonSwitch.stories.tsx @@ -7,12 +7,14 @@ import { IconGlobeLock } from '../icons' export default { title: 'Lemon UI/Lemon Switch', component: RawLemonSwitch, - parameters: { chromatic: { disableSnapshot: false } }, argTypes: { label: { defaultValue: 'Switch this!', }, }, + parameters: { + chromatic: { disableSnapshot: false }, + }, } as ComponentMeta const LemonSwitch = ({ checked, ...props }: Partial): JSX.Element => { diff --git a/frontend/src/lib/components/LemonTable/LemonTable.stories.tsx b/frontend/src/lib/components/LemonTable/LemonTable.stories.tsx index 027c2e83f67..d5cfa07c50f 100644 --- a/frontend/src/lib/components/LemonTable/LemonTable.stories.tsx +++ b/frontend/src/lib/components/LemonTable/LemonTable.stories.tsx @@ -4,7 +4,9 @@ import { LemonTable, LemonTableProps } from './LemonTable' export default { title: 'Lemon UI/Lemon Table', component: LemonTable, - parameters: { chromatic: { disableSnapshot: false } }, + parameters: { + chromatic: { disableSnapshot: false }, + }, } as ComponentMeta interface MockPerson { diff --git a/frontend/src/lib/components/LemonTextArea/LemonTextArea.stories.tsx b/frontend/src/lib/components/LemonTextArea/LemonTextArea.stories.tsx index 59ead290d32..dc71ae964a7 100644 --- a/frontend/src/lib/components/LemonTextArea/LemonTextArea.stories.tsx +++ b/frontend/src/lib/components/LemonTextArea/LemonTextArea.stories.tsx @@ -6,13 +6,15 @@ import { LemonTextArea, LemonTextAreaProps, LemonTextMarkdown as _LemonTextMarkd export default { title: 'Lemon UI/Lemon Text Area', component: LemonTextArea, - parameters: { chromatic: { disableSnapshot: false } }, argTypes: { value: { defaultValue: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.', }, }, + parameters: { + chromatic: { disableSnapshot: false }, + }, } as ComponentMeta const Template: ComponentStory = (props: LemonTextAreaProps) => { diff --git a/frontend/src/lib/components/Lettermark/Lettermark.stories.tsx b/frontend/src/lib/components/Lettermark/Lettermark.stories.tsx index e5adf227fb5..d0eb0b4e11a 100644 --- a/frontend/src/lib/components/Lettermark/Lettermark.stories.tsx +++ b/frontend/src/lib/components/Lettermark/Lettermark.stories.tsx @@ -6,7 +6,6 @@ export default { title: 'Lemon UI/Lettermark', component: Lettermark, parameters: { - chromatic: { disableSnapshot: false }, docs: { description: { component: diff --git a/frontend/src/lib/components/NotFound/NotFound.stories.tsx b/frontend/src/lib/components/NotFound/NotFound.stories.tsx index 391f3d5ffde..9c903b6e3d2 100644 --- a/frontend/src/lib/components/NotFound/NotFound.stories.tsx +++ b/frontend/src/lib/components/NotFound/NotFound.stories.tsx @@ -5,7 +5,6 @@ import { NotFound } from './index' export default { title: 'Components/Not Found', component: NotFound, - parameters: { chromatic: { disableSnapshot: false } }, } as ComponentMeta const Template: ComponentStory = (args) => diff --git a/frontend/src/lib/components/PaginationControl/PaginationControl.stories.tsx b/frontend/src/lib/components/PaginationControl/PaginationControl.stories.tsx index 4dd8daaf586..4b0266634fb 100644 --- a/frontend/src/lib/components/PaginationControl/PaginationControl.stories.tsx +++ b/frontend/src/lib/components/PaginationControl/PaginationControl.stories.tsx @@ -5,7 +5,6 @@ import { usePagination } from './usePagination' export default { title: 'Lemon UI/Pagination Control', component: PaginationControl, - parameters: { chromatic: { disableSnapshot: false } }, } as ComponentMeta const DATA_SOURCE = Array(43) diff --git a/frontend/src/lib/components/Popup/Popup.stories.tsx b/frontend/src/lib/components/Popup/Popup.stories.tsx index 911e7214e7f..73c6c8eec45 100644 --- a/frontend/src/lib/components/Popup/Popup.stories.tsx +++ b/frontend/src/lib/components/Popup/Popup.stories.tsx @@ -6,7 +6,6 @@ import { IconArrowDropDown } from '../icons' export default { title: 'Lemon UI/Popup', component: Popup, - parameters: { chromatic: { disableSnapshot: false } }, } as ComponentMeta const Template: ComponentStory = (args) => diff --git a/frontend/src/lib/components/ProfilePicture/ProfileBubbles.stories.tsx b/frontend/src/lib/components/ProfilePicture/ProfileBubbles.stories.tsx index 82d28c69ce5..82d00f68ed1 100644 --- a/frontend/src/lib/components/ProfilePicture/ProfileBubbles.stories.tsx +++ b/frontend/src/lib/components/ProfilePicture/ProfileBubbles.stories.tsx @@ -12,7 +12,6 @@ const DUMMIES: ProfileBubblesProps['people'] = [ export default { title: 'Lemon UI/Profile Bubbles', component: ProfileBubblesComponent, - parameters: { chromatic: { disableSnapshot: false } }, argTypes: { people: { defaultValue: DUMMIES, diff --git a/frontend/src/lib/components/PropertyFilters/PropertyFilters.stories.tsx b/frontend/src/lib/components/PropertyFilters/PropertyFilters.stories.tsx index 68adb1193dd..2e1de568239 100644 --- a/frontend/src/lib/components/PropertyFilters/PropertyFilters.stories.tsx +++ b/frontend/src/lib/components/PropertyFilters/PropertyFilters.stories.tsx @@ -8,7 +8,6 @@ import { personPropertiesModel } from '~/models/personPropertiesModel' export default { title: 'Filters/PropertyFilters', component: PropertyFilters, - parameters: { chromatic: { disableSnapshot: false } }, } as ComponentMeta const propertyFilters = [ diff --git a/frontend/src/lib/components/PropertyGroupFilters/PropertyGroupFilters.stories.tsx b/frontend/src/lib/components/PropertyGroupFilters/PropertyGroupFilters.stories.tsx index f60bf9fcc30..a5db8e6396d 100644 --- a/frontend/src/lib/components/PropertyGroupFilters/PropertyGroupFilters.stories.tsx +++ b/frontend/src/lib/components/PropertyGroupFilters/PropertyGroupFilters.stories.tsx @@ -10,7 +10,6 @@ import { cohortsModel } from '~/models/cohortsModel' export default { title: 'Filters/PropertyGroupFilters', component: PropertyGroupFilters, - parameters: { chromatic: { disableSnapshot: false } }, } as ComponentMeta const propertyFilters = [ diff --git a/frontend/src/lib/components/PropertyIcon.stories.tsx b/frontend/src/lib/components/PropertyIcon.stories.tsx index 38ba7c2056c..8ef11666188 100644 --- a/frontend/src/lib/components/PropertyIcon.stories.tsx +++ b/frontend/src/lib/components/PropertyIcon.stories.tsx @@ -6,7 +6,6 @@ import { countryCodeToName } from 'scenes/insights/views/WorldMap' export default { title: 'Lemon UI/Icons/Property Icon', component: PropertyIcon, - parameters: { chromatic: { disableSnapshot: false } }, } as ComponentMeta const Template: ComponentStory = (args) => { diff --git a/frontend/src/lib/components/PropertyKeyInfo.stories.tsx b/frontend/src/lib/components/PropertyKeyInfo.stories.tsx index b81fb531a74..3f47549c4ef 100644 --- a/frontend/src/lib/components/PropertyKeyInfo.stories.tsx +++ b/frontend/src/lib/components/PropertyKeyInfo.stories.tsx @@ -5,7 +5,6 @@ import { PropertyKeyInfo } from './PropertyKeyInfo' export default { title: 'Components/Property Key Info', component: PropertyKeyInfo, - parameters: { chromatic: { disableSnapshot: false } }, } as ComponentMeta const Template: ComponentStory = (args) => { diff --git a/frontend/src/lib/components/PropertyNamesSelect/PropertyNamesSelect.stories.tsx b/frontend/src/lib/components/PropertyNamesSelect/PropertyNamesSelect.stories.tsx index aca2e045ae3..f58ac9dc95a 100644 --- a/frontend/src/lib/components/PropertyNamesSelect/PropertyNamesSelect.stories.tsx +++ b/frontend/src/lib/components/PropertyNamesSelect/PropertyNamesSelect.stories.tsx @@ -5,7 +5,6 @@ import { personPropertiesModel } from '~/models/personPropertiesModel' export default { title: 'Filters', - parameters: { chromatic: { disableSnapshot: false } }, decorators: [ mswDecorator({ get: { diff --git a/frontend/src/lib/components/Sharing/SharingModal.stories.tsx b/frontend/src/lib/components/Sharing/SharingModal.stories.tsx index a54e0993116..1534d804c0d 100644 --- a/frontend/src/lib/components/Sharing/SharingModal.stories.tsx +++ b/frontend/src/lib/components/Sharing/SharingModal.stories.tsx @@ -19,7 +19,6 @@ export default { layout: 'fullscreen', options: { showPanel: false }, viewMode: 'story', - chromatic: { disableSnapshot: false }, }, } as ComponentMeta diff --git a/frontend/src/lib/components/Spinner/Spinner.stories.tsx b/frontend/src/lib/components/Spinner/Spinner.stories.tsx index c0b11d02f1a..9d0731874f4 100644 --- a/frontend/src/lib/components/Spinner/Spinner.stories.tsx +++ b/frontend/src/lib/components/Spinner/Spinner.stories.tsx @@ -6,7 +6,6 @@ import { LemonButton } from '@posthog/lemon-ui' export default { title: 'Lemon UI/Spinner', component: Spinner, - parameters: { chromatic: { disableSnapshot: false } }, } as ComponentMeta export function Default(): JSX.Element { diff --git a/frontend/src/lib/components/Subscriptions/SubscriptionsModal.stories.tsx b/frontend/src/lib/components/Subscriptions/SubscriptionsModal.stories.tsx index 68dee8db0d9..d295097f049 100644 --- a/frontend/src/lib/components/Subscriptions/SubscriptionsModal.stories.tsx +++ b/frontend/src/lib/components/Subscriptions/SubscriptionsModal.stories.tsx @@ -16,7 +16,6 @@ export default { layout: 'fullscreen', options: { showPanel: false }, viewMode: 'story', - chromatic: { disableSnapshot: false }, }, } as ComponentMeta diff --git a/frontend/src/lib/components/TaxonomicFilter/TaxonomicFilter.stories.tsx b/frontend/src/lib/components/TaxonomicFilter/TaxonomicFilter.stories.tsx index 0bc53065abd..dd6712f29c2 100644 --- a/frontend/src/lib/components/TaxonomicFilter/TaxonomicFilter.stories.tsx +++ b/frontend/src/lib/components/TaxonomicFilter/TaxonomicFilter.stories.tsx @@ -8,7 +8,6 @@ import { useMountedLogic } from 'kea' export default { title: 'Filters', decorators: [taxonomicFilterMocksDecorator], - parameters: { chromatic: { disableSnapshot: false } }, } export function TaxonomicFilter_(): JSX.Element { diff --git a/frontend/src/lib/components/TaxonomicPopup/TaxonomicPopup.stories.tsx b/frontend/src/lib/components/TaxonomicPopup/TaxonomicPopup.stories.tsx index 30b1b3f70bd..6f8da9ab160 100644 --- a/frontend/src/lib/components/TaxonomicPopup/TaxonomicPopup.stories.tsx +++ b/frontend/src/lib/components/TaxonomicPopup/TaxonomicPopup.stories.tsx @@ -11,7 +11,6 @@ import { ComponentMeta } from '@storybook/react' export default { title: 'Filters/TaxonomicPopup', component: TaxonomicPopup, - parameters: { chromatic: { disableSnapshot: false } }, decorators: [taxonomicFilterMocksDecorator], } as ComponentMeta diff --git a/frontend/src/lib/components/colors.stories.tsx b/frontend/src/lib/components/colors.stories.tsx index b80085ee5a0..0f5e4c0fa5a 100644 --- a/frontend/src/lib/components/colors.stories.tsx +++ b/frontend/src/lib/components/colors.stories.tsx @@ -5,7 +5,6 @@ import { useState } from 'react' export default { title: 'Lemon UI/Colors', parameters: { - chromatic: { disableSnapshot: false }, options: { showPanel: false }, docs: { description: { diff --git a/frontend/src/lib/components/hedgehogs.stories.tsx b/frontend/src/lib/components/hedgehogs.stories.tsx index bdc336789b1..5621a564bc2 100644 --- a/frontend/src/lib/components/hedgehogs.stories.tsx +++ b/frontend/src/lib/components/hedgehogs.stories.tsx @@ -15,7 +15,6 @@ const allHedgehogs: HedgehogDefinition[] = Object.entries(hedgehogs).map(([key, export default { title: 'Lemon UI/Hog illustrations', parameters: { - chromatic: { disableSnapshot: false }, options: { showPanel: false }, docs: { description: { diff --git a/frontend/src/lib/components/icons.stories.tsx b/frontend/src/lib/components/icons.stories.tsx index c9e534d98e0..19569c9aab4 100644 --- a/frontend/src/lib/components/icons.stories.tsx +++ b/frontend/src/lib/components/icons.stories.tsx @@ -18,7 +18,6 @@ const allIcons: IconDefinition[] = Object.entries(icons) export default { title: 'Lemon UI/Icons', parameters: { - chromatic: { disableSnapshot: false }, options: { showPanel: false }, docs: { description: { diff --git a/frontend/src/lib/components/icons/Splotch.stories.tsx b/frontend/src/lib/components/icons/Splotch.stories.tsx index f78d624b586..859804ee961 100644 --- a/frontend/src/lib/components/icons/Splotch.stories.tsx +++ b/frontend/src/lib/components/icons/Splotch.stories.tsx @@ -4,7 +4,6 @@ import { Splotch, SplotchColor, SplotchProps } from './Splotch' export default { title: 'Lemon UI/Splotch', component: Splotch, - parameters: { chromatic: { disableSnapshot: false } }, argTypes: { color: { defaultValue: SplotchColor.Purple, diff --git a/frontend/src/lib/forms/Field.stories.tsx b/frontend/src/lib/forms/Field.stories.tsx index 5e04bb52dcc..934e2779988 100644 --- a/frontend/src/lib/forms/Field.stories.tsx +++ b/frontend/src/lib/forms/Field.stories.tsx @@ -10,7 +10,6 @@ export default { title: 'Lemon UI/Forms and Fields', component: PureField, parameters: { - chromatic: { disableSnapshot: false }, docs: { description: { component: ` diff --git a/frontend/src/queries/nodes/DataNode/DataNode.stories.tsx b/frontend/src/queries/nodes/DataNode/DataNode.stories.tsx index 0a9b5fbd668..fc6c7bdae4b 100644 --- a/frontend/src/queries/nodes/DataNode/DataNode.stories.tsx +++ b/frontend/src/queries/nodes/DataNode/DataNode.stories.tsx @@ -9,7 +9,6 @@ export default { title: 'Queries/DataNode', component: QueryRunner, parameters: { - chromatic: { disableSnapshot: false }, layout: 'fullscreen', options: { showPanel: false }, viewMode: 'story', diff --git a/frontend/src/queries/nodes/DataTable/DataTable.stories.tsx b/frontend/src/queries/nodes/DataTable/DataTable.stories.tsx index 5cdd7e2ab5f..4afd761a91c 100644 --- a/frontend/src/queries/nodes/DataTable/DataTable.stories.tsx +++ b/frontend/src/queries/nodes/DataTable/DataTable.stories.tsx @@ -10,7 +10,6 @@ export default { title: 'Queries/DataTable', component: Query, parameters: { - chromatic: { disableSnapshot: false }, layout: 'fullscreen', options: { showPanel: false }, viewMode: 'story', diff --git a/frontend/src/scenes/PreflightCheck/PreflightCheck.stories.tsx b/frontend/src/scenes/PreflightCheck/PreflightCheck.stories.tsx index 8c0e7eaca05..e6605a69cb1 100644 --- a/frontend/src/scenes/PreflightCheck/PreflightCheck.stories.tsx +++ b/frontend/src/scenes/PreflightCheck/PreflightCheck.stories.tsx @@ -3,7 +3,7 @@ import { Meta } from '@storybook/react' import { PreflightCheck } from './PreflightCheck' export default { - title: 'Scenes-Other/Onboarding', + title: 'Scenes-Other/Preflight', parameters: { layout: 'fullscreen', options: { showPanel: false }, viewMode: 'story' }, } as Meta diff --git a/frontend/src/scenes/ingestion/v1/IngestionV1.stories.tsx b/frontend/src/scenes/ingestion/v1/IngestionV1.stories.tsx index f70a7cd49e0..a16b720a6c3 100644 --- a/frontend/src/scenes/ingestion/v1/IngestionV1.stories.tsx +++ b/frontend/src/scenes/ingestion/v1/IngestionV1.stories.tsx @@ -3,8 +3,8 @@ import { Meta } from '@storybook/react' import { IngestionWizardV1 } from './IngestionWizard' export default { - title: 'Scenes-Other/Onboarding', + title: 'Scenes-Other/Ingestion v1', parameters: { layout: 'fullscreen', options: { showPanel: false }, viewMode: 'story' }, } as Meta -export const IngestionV1 = (): JSX.Element => +export const Ingestion = (): JSX.Element => diff --git a/frontend/src/scenes/ingestion/v2/IngestionV2.stories.tsx b/frontend/src/scenes/ingestion/v2/IngestionV2.stories.tsx deleted file mode 100644 index a6158e13b49..00000000000 --- a/frontend/src/scenes/ingestion/v2/IngestionV2.stories.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { Meta } from '@storybook/react' - -import { IngestionWizardV2 } from './IngestionWizard' - -export default { - title: 'Scenes-Other/Onboarding', - parameters: { layout: 'fullscreen', options: { showPanel: false }, viewMode: 'story' }, -} as Meta - -export const IngestionV2 = (): JSX.Element => diff --git a/frontend/src/scenes/insights/InsightTooltip/InsightTooltip.stories.tsx b/frontend/src/scenes/insights/InsightTooltip/InsightTooltip.stories.tsx index 72893de8583..2dc0d515a7c 100644 --- a/frontend/src/scenes/insights/InsightTooltip/InsightTooltip.stories.tsx +++ b/frontend/src/scenes/insights/InsightTooltip/InsightTooltip.stories.tsx @@ -119,7 +119,6 @@ const data = { export default { title: 'Components/InsightTooltip', component: InsightTooltip, - parameters: { chromatic: { disableSnapshot: false } }, argTypes: { date: { defaultValue: data.date }, timezone: { defaultValue: data.timezone }, diff --git a/frontend/src/scenes/project/Settings/SlackIntegration.stories.tsx b/frontend/src/scenes/project/Settings/SlackIntegration.stories.tsx index aecb710cdb4..23134b13143 100644 --- a/frontend/src/scenes/project/Settings/SlackIntegration.stories.tsx +++ b/frontend/src/scenes/project/Settings/SlackIntegration.stories.tsx @@ -12,7 +12,6 @@ export default { layout: 'fullscreen', options: { showPanel: false }, viewMode: 'story', - chromatic: { disableSnapshot: false }, }, } as ComponentMeta diff --git a/frontend/src/styles/global.scss b/frontend/src/styles/global.scss index e820ba70a94..3ace794ac8b 100644 --- a/frontend/src/styles/global.scss +++ b/frontend/src/styles/global.scss @@ -667,3 +667,15 @@ body { max-width: 350px; } } + +.dangerously-stop-all-animations { + // Only use this class to achieve consistent snapshots by stopping all animations + *, + *::before, + *::after { + transition: none !important; + animation-fill-mode: forwards !important; + animation-duration: 0ms !important; + animation-iteration-count: 1 !important; + } +} diff --git a/frontend/src/styles/utilities.stories.tsx b/frontend/src/styles/utilities.stories.tsx index 40e3554d5d8..e94026cb386 100644 --- a/frontend/src/styles/utilities.stories.tsx +++ b/frontend/src/styles/utilities.stories.tsx @@ -2,7 +2,6 @@ import { LemonButton } from '@posthog/lemon-ui' export default { title: 'Lemon UI/Utilities', - parameters: { chromatic: { disableSnapshot: false } }, } export const Overview = (): JSX.Element => { diff --git a/package.json b/package.json index a7088c15f6a..04091e41024 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,10 @@ "copy-scripts": "mkdir -p frontend/dist/ && pnpm copy-scripts:array && pnpm copy-scripts:recorder", "copy-scripts:array": "cp node_modules/posthog-js/dist/array.js* frontend/dist/", "copy-scripts:recorder": "./bin/copy-scripts-recorder", - "test": "jest", + "test": "pnpm test:unit && pnpm test:visual-regression", + "test:unit": "jest --testPathPattern=frontend/", + "test:visual-regression": "playwright test -u && test-storybook -u --no-index-json --url $STORYBOOK_URL", + "test:visual-regression:ci": "playwright test && test-storybook --ci --no-index-json --maxWorkers=2", "start": "concurrently -n ESBUILD,TYPEGEN -c yellow,green \"pnpm start-http\" \"pnpm run typegen:watch\"", "start-http": "pnpm clean && pnpm copy-scripts && node frontend/build.mjs --dev", "start-docker": "pnpm start-http --host 0.0.0.0", @@ -57,7 +60,6 @@ "@lottiefiles/react-lottie-player": "^3.4.7", "@medv/finder": "^2.1.0", "@monaco-editor/react": "^4.1.3", - "@playwright/test": "^1.28.1", "@posthog/plugin-scaffold": "^1.3.2", "@react-hook/size": "^2.1.2", "@sentry/react": "7.22.0", @@ -150,6 +152,7 @@ "@babel/runtime": "^7.17.9", "@cypress/webpack-preprocessor": "^5.15.4", "@hot-loader/react-dom": "^16.14.0", + "@playwright/test": "1.29.2", "@sentry/types": "7.22.0", "@storybook/addon-a11y": "^6.5.14", "@storybook/addon-actions": "^6.5.14", @@ -161,6 +164,7 @@ "@storybook/components": "^6.5.14", "@storybook/core-events": "^6.5.14", "@storybook/react": "^6.5.14", + "@storybook/test-runner": "^0.9.2", "@storybook/theming": "^6.5.14", "@sucrase/jest-plugin": "^3.0.0", "@testing-library/dom": ">=7.21.4", @@ -172,6 +176,7 @@ "@types/d3": "^7.0.0", "@types/d3-sankey": "^0.11.2", "@types/jest": "^29.2.3", + "@types/jest-image-snapshot": "^6.1.0", "@types/md5": "^2.3.0", "@types/node": "^18.11.9", "@types/pixelmatch": "^5.2.4", @@ -218,6 +223,7 @@ "jest": "^29.3.1", "jest-canvas-mock": "^2.4.0", "jest-environment-jsdom": "^29.3.1", + "jest-image-snapshot": "^6.1.0", "kea-typegen": "^3.1.4", "less": "^3.12.2", "less-loader": "^7.0.2", @@ -226,6 +232,7 @@ "msw": "^0.47.3", "path-browserify": "^1.0.1", "pixelmatch": "^5.3.0", + "playwright-core": "1.29.2", "pngjs": "^6.0.0", "postcss": "^8.4.14", "postcss-loader": "^4.3.0", @@ -246,8 +253,11 @@ "fsevents": "^2.1.2" }, "lint-staged": { - "*.{js,jsx,mjs,ts,tsx,json,yaml,yml,css,scss}": "prettier --write", - "((frontend|cypress)/**).{js,jsx,mjs,ts,tsx}": "eslint -c .eslintrc.js --fix", + "*.{json,yaml,yml,css,scss}": "prettier --write", + "(!(plugin-server)/**).{js,jsx,mjs,ts,tsx}": [ + "eslint -c .eslintrc.js --fix", + "prettier --write" + ], "(plugin-server/**).{js,jsx,mjs,ts,tsx}": [ "eslint -c plugin-server/.eslintrc.js --fix", "prettier --write" @@ -256,6 +266,9 @@ "black", "flake8", "isort" + ], + "*.png": [ + "optipng -clobber -o4 -strip all" ] }, "browserslist": { diff --git a/playwright.config.ts b/playwright.config.ts index 04231310ac4..2808d20ed15 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -27,8 +27,8 @@ const config: PlaywrightTestConfig = { forbidOnly: !!process.env.CI, /* Retry on CI only */ retries: process.env.CI ? 2 : 0, - /* Opt out of parallel tests on CI. */ - workers: process.env.CI ? 1 : undefined, + /* Run one worker per core in GitHub Actions. */ + workers: process.env.CI ? 2 : undefined, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ reporter: [['html', { open: 'never' }]], /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ diff --git a/playwright/e2e-vrt/README.md b/playwright/e2e-vrt/README.md index 096a2dc5d22..c2acffb95bb 100644 --- a/playwright/e2e-vrt/README.md +++ b/playwright/e2e-vrt/README.md @@ -1,6 +1,6 @@ # Visual Regression Tests -We're using Playwright to run visual regression tests against Storybook. To create reference images that are consistent between development and CI we run Playwright in an Ubuntu docker container. +We're using Playwright to run visual regression tests against Storybook. To create reference images that are consistent between development and CI we run Playwright in an Ubuntu Docker container. ## Workflow @@ -37,13 +37,15 @@ We're using Playwright to run visual regression tests against Storybook. To crea - `#root` for components and - `.main-app-content` for scenes -3. Generate the reference images with (you need to have Storybook running locally, i.e. on the Docker host machine): +3. Generate the reference images (you need to have Storybook running locally, i.e. on the Docker host machine): - ``` - docker compose -f docker-compose.playwright.yml run -it -e STORYBOOK_URL=http://host.docker.internal:6006 playwright pnpm exec playwright test -u + ```sh + docker compose -f docker-compose.playwright.yml run -it --build -e STORYBOOK_URL=http://host.docker.internal:6006 playwright pnpm test:visual-regression ``` -Open the generated report locally with `pnpm dlx playwright show-report` to see test results (they are mounted local in docker volume) + > If your `docker compose version` is lower than 2.13, you won't be able to use the `--build` flag. Instead, first run `docker compose -f docker-compose.playwright.yml build playwright`, and then the above `run` command - without the `--build` arg. + + Open the generated report locally with `pnpm dlx playwright show-report` to see test results (they are mounted local in docker volume) ### Renaming or deleting tests diff --git a/playwright/e2e-vrt/components/PropertiesTimeline.spec.ts-snapshots/Properties-Timeline-Multiple-Points-for-One-Person-Property-1-chromium-linux.png b/playwright/e2e-vrt/components/PropertiesTimeline.spec.ts-snapshots/Properties-Timeline-Multiple-Points-for-One-Person-Property-1-chromium-linux.png old mode 100755 new mode 100644 index a36305b7f3d..d3fcf98f89a Binary files a/playwright/e2e-vrt/components/PropertiesTimeline.spec.ts-snapshots/Properties-Timeline-Multiple-Points-for-One-Person-Property-1-chromium-linux.png and b/playwright/e2e-vrt/components/PropertiesTimeline.spec.ts-snapshots/Properties-Timeline-Multiple-Points-for-One-Person-Property-1-chromium-linux.png differ diff --git a/playwright/pages/storybook.ts b/playwright/pages/storybook.ts index cd75b796fa6..bef93b6e90c 100644 --- a/playwright/pages/storybook.ts +++ b/playwright/pages/storybook.ts @@ -30,7 +30,7 @@ export class StorybookStoryPage { async goto(storyId: string): Promise { const storyUrl = `${STORYBOOK_URL}/iframe.html?id=${storyId}&viewMode=story` - await this.page.goto(storyUrl) + await this.page.goto(storyUrl, { waitUntil: 'networkidle' }) } async resizeToMobile(): Promise { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a5cc57f4a27..e8091ae3c23 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,7 +18,7 @@ specifiers: '@lottiefiles/react-lottie-player': ^3.4.7 '@medv/finder': ^2.1.0 '@monaco-editor/react': ^4.1.3 - '@playwright/test': ^1.28.1 + '@playwright/test': 1.29.2 '@posthog/plugin-scaffold': ^1.3.2 '@react-hook/size': ^2.1.2 '@sentry/react': 7.22.0 @@ -33,6 +33,7 @@ specifiers: '@storybook/components': ^6.5.14 '@storybook/core-events': ^6.5.14 '@storybook/react': ^6.5.14 + '@storybook/test-runner': ^0.9.2 '@storybook/theming': ^6.5.14 '@sucrase/jest-plugin': ^3.0.0 '@testing-library/dom': '>=7.21.4' @@ -44,6 +45,7 @@ specifiers: '@types/d3': ^7.0.0 '@types/d3-sankey': ^0.11.2 '@types/jest': ^29.2.3 + '@types/jest-image-snapshot': ^6.1.0 '@types/md5': ^2.3.0 '@types/node': ^18.11.9 '@types/pixelmatch': ^5.2.4 @@ -113,6 +115,7 @@ specifiers: jest: ^29.3.1 jest-canvas-mock: ^2.4.0 jest-environment-jsdom: ^29.3.1 + jest-image-snapshot: ^6.1.0 kea: ^3.1.0 kea-forms: ^3.0.3 kea-loaders: ^3.0.0 @@ -132,6 +135,7 @@ specifiers: msw: ^0.47.3 path-browserify: ^1.0.1 pixelmatch: ^5.3.0 + playwright-core: 1.29.2 pngjs: ^6.0.0 postcss: ^8.4.14 postcss-loader: ^4.3.0 @@ -189,7 +193,6 @@ dependencies: '@lottiefiles/react-lottie-player': 3.4.7_react@16.14.0 '@medv/finder': 2.1.0 '@monaco-editor/react': 4.4.6_vtctfwvicljpcdx2mjoqbo4tly - '@playwright/test': 1.28.1 '@posthog/plugin-scaffold': 1.3.4 '@react-hook/size': 2.1.2_react@16.14.0 '@sentry/react': 7.22.0_react@16.14.0 @@ -285,6 +288,7 @@ devDependencies: '@babel/runtime': 7.20.1 '@cypress/webpack-preprocessor': 5.15.4_5j4ke4o34lz3j3743ikwv5ryvm '@hot-loader/react-dom': 16.14.0_react@16.14.0 + '@playwright/test': 1.29.2 '@sentry/types': 7.22.0 '@storybook/addon-a11y': 6.5.14_wcqkhtmu7mswc6yz4uyexck3ty '@storybook/addon-actions': 6.5.14_wcqkhtmu7mswc6yz4uyexck3ty @@ -296,6 +300,7 @@ devDependencies: '@storybook/components': 6.5.14_wcqkhtmu7mswc6yz4uyexck3ty '@storybook/core-events': 6.5.14 '@storybook/react': 6.5.14_ynw662n6z6lgugf2bmr63fewey + '@storybook/test-runner': 0.9.3_goaxpva5utls3mxdpvxrfhulsq '@storybook/theming': 6.5.14_wcqkhtmu7mswc6yz4uyexck3ty '@sucrase/jest-plugin': 3.0.0_jest@29.3.1+sucrase@3.29.0 '@testing-library/jest-dom': 5.16.5 @@ -305,6 +310,7 @@ devDependencies: '@types/clone': 2.1.1 '@types/d3': 7.4.0 '@types/jest': 29.2.4 + '@types/jest-image-snapshot': 6.1.0 '@types/node': 18.11.9 '@types/pixelmatch': 5.2.4 '@types/pngjs': 6.0.1 @@ -346,6 +352,7 @@ devDependencies: jest: 29.3.1_odkjkoia5xunhxkdrka32ib6vi jest-canvas-mock: 2.4.0 jest-environment-jsdom: 29.3.1 + jest-image-snapshot: 6.1.0_jest@29.3.1 kea-typegen: 3.1.4_typescript@4.8.4 less: 3.13.1 less-loader: 7.3.0_less@3.13.1+webpack@4.46.0 @@ -354,6 +361,7 @@ devDependencies: msw: 0.47.4_typescript@4.8.4 path-browserify: 1.0.1 pixelmatch: 5.3.0 + playwright-core: 1.29.2 pngjs: 6.0.0 postcss: 8.4.18 postcss-loader: 4.3.0_dhonik3q6ff6ozbzdscnovq2ka @@ -2028,6 +2036,16 @@ packages: resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} dev: true + /@hapi/hoek/9.3.0: + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + dev: true + + /@hapi/topo/5.1.0: + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + dependencies: + '@hapi/hoek': 9.3.0 + dev: true + /@hot-loader/react-dom/16.14.0_react@16.14.0: resolution: {integrity: sha512-EN9czvcLsMYmSDo5yRKZOAq3ZGRlDpad1gPtX0NdMMomJXcPE3yFSeFzE94X/NjOaiSVimB7LuqPYpkWVaIi4Q==} peerDependencies: @@ -2071,6 +2089,18 @@ packages: engines: {node: '>=8'} dev: true + /@jest/console/28.1.3: + resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + '@types/node': 18.11.9 + chalk: 4.1.2 + jest-message-util: 28.1.3 + jest-util: 28.1.3 + slash: 3.0.0 + dev: true + /@jest/console/29.3.1: resolution: {integrity: sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2083,6 +2113,49 @@ packages: slash: 3.0.0 dev: true + /@jest/core/28.1.3_ts-node@10.9.1: + resolution: {integrity: sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 28.1.3 + '@jest/reporters': 28.1.3 + '@jest/test-result': 28.1.3 + '@jest/transform': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.11.9 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.5.0 + exit: 0.1.2 + graceful-fs: 4.2.10 + jest-changed-files: 28.1.3 + jest-config: 28.1.3_odkjkoia5xunhxkdrka32ib6vi + jest-haste-map: 28.1.3 + jest-message-util: 28.1.3 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.3 + jest-resolve-dependencies: 28.1.3 + jest-runner: 28.1.3 + jest-runtime: 28.1.3 + jest-snapshot: 28.1.3 + jest-util: 28.1.3 + jest-validate: 28.1.3 + jest-watcher: 28.1.3 + micromatch: 4.0.5 + pretty-format: 28.1.3 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + /@jest/core/29.3.1_ts-node@10.9.1: resolution: {integrity: sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2125,6 +2198,16 @@ packages: - ts-node dev: true + /@jest/environment/28.1.3: + resolution: {integrity: sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/fake-timers': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.11.9 + jest-mock: 28.1.3 + dev: true + /@jest/environment/29.3.1: resolution: {integrity: sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2135,6 +2218,13 @@ packages: jest-mock: 29.3.1 dev: true + /@jest/expect-utils/28.1.3: + resolution: {integrity: sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + jest-get-type: 28.0.2 + dev: true + /@jest/expect-utils/29.3.1: resolution: {integrity: sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2142,6 +2232,16 @@ packages: jest-get-type: 29.2.0 dev: true + /@jest/expect/28.1.3: + resolution: {integrity: sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + expect: 28.1.3 + jest-snapshot: 28.1.3 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/expect/29.3.1: resolution: {integrity: sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2152,6 +2252,18 @@ packages: - supports-color dev: true + /@jest/fake-timers/28.1.3: + resolution: {integrity: sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + '@sinonjs/fake-timers': 9.1.2 + '@types/node': 18.11.9 + jest-message-util: 28.1.3 + jest-mock: 28.1.3 + jest-util: 28.1.3 + dev: true + /@jest/fake-timers/29.3.1: resolution: {integrity: sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2164,6 +2276,17 @@ packages: jest-util: 29.3.1 dev: true + /@jest/globals/28.1.3: + resolution: {integrity: sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/environment': 28.1.3 + '@jest/expect': 28.1.3 + '@jest/types': 28.1.3 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/globals/29.3.1: resolution: {integrity: sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2176,6 +2299,44 @@ packages: - supports-color dev: true + /@jest/reporters/28.1.3: + resolution: {integrity: sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 28.1.3 + '@jest/test-result': 28.1.3 + '@jest/transform': 28.1.3 + '@jest/types': 28.1.3 + '@jridgewell/trace-mapping': 0.3.17 + '@types/node': 18.11.9 + chalk: 4.1.2 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.5 + jest-message-util: 28.1.3 + jest-util: 28.1.3 + jest-worker: 28.1.3 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + terminal-link: 2.1.1 + v8-to-istanbul: 9.0.1 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/reporters/29.3.1: resolution: {integrity: sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2213,6 +2374,13 @@ packages: - supports-color dev: true + /@jest/schemas/28.1.3: + resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@sinclair/typebox': 0.24.51 + dev: true + /@jest/schemas/29.0.0: resolution: {integrity: sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2220,6 +2388,15 @@ packages: '@sinclair/typebox': 0.24.51 dev: true + /@jest/source-map/28.1.2: + resolution: {integrity: sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.17 + callsites: 3.1.0 + graceful-fs: 4.2.10 + dev: true + /@jest/source-map/29.2.0: resolution: {integrity: sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2229,6 +2406,16 @@ packages: graceful-fs: 4.2.10 dev: true + /@jest/test-result/28.1.3: + resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/console': 28.1.3 + '@jest/types': 28.1.3 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.1 + dev: true + /@jest/test-result/29.3.1: resolution: {integrity: sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2239,6 +2426,16 @@ packages: collect-v8-coverage: 1.0.1 dev: true + /@jest/test-sequencer/28.1.3: + resolution: {integrity: sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/test-result': 28.1.3 + graceful-fs: 4.2.10 + jest-haste-map: 28.1.3 + slash: 3.0.0 + dev: true + /@jest/test-sequencer/29.3.1: resolution: {integrity: sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2272,6 +2469,29 @@ packages: - supports-color dev: true + /@jest/transform/28.1.3: + resolution: {integrity: sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@babel/core': 7.20.2 + '@jest/types': 28.1.3 + '@jridgewell/trace-mapping': 0.3.17 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.9.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.10 + jest-haste-map: 28.1.3 + jest-regex-util: 28.0.2 + jest-util: 28.1.3 + micromatch: 4.0.5 + pirates: 4.0.5 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/transform/29.3.1: resolution: {integrity: sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2306,6 +2526,18 @@ packages: chalk: 4.1.2 dev: true + /@jest/types/28.1.3: + resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/schemas': 28.1.3 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 18.11.9 + '@types/yargs': 17.0.16 + chalk: 4.1.2 + dev: true + /@jest/types/29.3.1: resolution: {integrity: sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2528,14 +2760,14 @@ packages: resolution: {integrity: sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==} dev: true - /@playwright/test/1.28.1: - resolution: {integrity: sha512-xN6spdqrNlwSn9KabIhqfZR7IWjPpFK1835tFNgjrlysaSezuX8PYUwaz38V/yI8TJLG9PkAMEXoHRXYXlpTPQ==} + /@playwright/test/1.29.2: + resolution: {integrity: sha512-+3/GPwOgcoF0xLz/opTnahel1/y42PdcgZ4hs+BZGIUjtmEFSXGg+nFoaH3NSmuc7a6GSFwXDJ5L7VXpqzigNg==} engines: {node: '>=14'} hasBin: true dependencies: '@types/node': 18.11.9 - playwright-core: 1.28.1 - dev: false + playwright-core: 1.29.2 + dev: true /@pmmmwh/react-refresh-webpack-plugin/0.5.8_a3gyllrqvxpec3fpybsrposvju: resolution: {integrity: sha512-wxXRwf+IQ6zvHSJZ+5T2RQNEsq+kx4jKRXfFvdt3nBIUzJUAvXEFsUeoaohDe/Kr84MTjGwcuIUPNcstNJORsA==} @@ -2664,6 +2896,20 @@ packages: tslib: 1.14.1 dev: false + /@sideway/address/4.1.4: + resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} + dependencies: + '@hapi/hoek': 9.3.0 + dev: true + + /@sideway/formula/3.0.1: + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + dev: true + + /@sideway/pinpoint/2.0.0: + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + dev: true + /@sinclair/typebox/0.24.51: resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} dev: true @@ -3904,6 +4150,56 @@ packages: - webpack-command dev: true + /@storybook/test-runner/0.9.3_goaxpva5utls3mxdpvxrfhulsq: + resolution: {integrity: sha512-H3tuVn5f+RYD6LBfQHljVOTwUnwjHaP/uSt6TodmnrAbDFQeMDW/wpDlHWEFiJlQaoXnJV3Cj/WgJGsh5REOQA==} + hasBin: true + dependencies: + '@babel/core': 7.20.2 + '@babel/generator': 7.20.2 + '@babel/preset-env': 7.20.2_@babel+core@7.20.2 + '@babel/preset-react': 7.18.6_@babel+core@7.20.2 + '@babel/preset-typescript': 7.18.6_@babel+core@7.20.2 + '@babel/template': 7.18.10 + '@babel/types': 7.20.2 + '@storybook/core-common': 6.5.14_avaoy7nkomvmxgqg35rmueudvu + '@storybook/csf': 0.0.2--canary.4566f4d.1 + '@storybook/csf-tools': 6.5.14 + '@storybook/store': 6.5.14_wcqkhtmu7mswc6yz4uyexck3ty + can-bind-to-host: 1.1.2 + commander: 9.4.1 + expect-playwright: 0.8.0 + jest: 28.1.3_odkjkoia5xunhxkdrka32ib6vi + jest-circus: 28.1.3 + jest-environment-node: 28.1.3 + jest-junit: 14.0.1 + jest-playwright-preset: 2.0.0_qruclkpwe5tgscr3gxibacztji + jest-runner: 28.1.3 + jest-serializer-html: 7.1.0 + jest-watch-typeahead: 2.2.2_jest@28.1.3 + node-fetch: 2.6.7 + playwright: 1.29.2 + read-pkg-up: 7.0.1 + regenerator-runtime: 0.13.10 + semver: 7.3.8 + tempy: 1.0.1 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@storybook/mdx2-csf' + - '@types/node' + - debug + - encoding + - eslint + - node-notifier + - react + - react-dom + - supports-color + - ts-node + - typescript + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + /@storybook/theming/6.5.14_wcqkhtmu7mswc6yz4uyexck3ty: resolution: {integrity: sha512-3ff6RLZGaIil/AFJ0/BRlE2hhdPrC5v6wGbRfroZVmGldRCxio/7+KAA3LH6cuHnjK5MeBcCBaHuxzXqGmbEFw==} peerDependencies: @@ -4343,6 +4639,14 @@ packages: '@types/istanbul-lib-report': 3.0.0 dev: true + /@types/jest-image-snapshot/6.1.0: + resolution: {integrity: sha512-wYayjKQGdI0ZbmsAq7OPt+5wMMi1CDXXkF3LfoGj4eRC0dOqlYJdXqLwfC89Qf2apQdlL9StgCkw0iTDb8lpUw==} + dependencies: + '@types/jest': 29.2.4 + '@types/pixelmatch': 5.2.4 + ssim.js: 3.5.0 + dev: true + /@types/jest/29.2.4: resolution: {integrity: sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A==} dependencies: @@ -4412,6 +4716,7 @@ packages: /@types/node/18.11.9: resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==} + dev: true /@types/normalize-package-data/2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -4586,6 +4891,12 @@ packages: /@types/unist/2.0.6: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} + /@types/wait-on/5.3.1: + resolution: {integrity: sha512-2FFOKCF/YydrMUaqg+fkk49qf0e5rDgwt6aQsMzFQzbS419h2gNOXyiwp/o2yYy27bi/C1z+HgfncryjGzlvgQ==} + dependencies: + '@types/node': 18.11.9 + dev: true + /@types/webpack-env/1.18.0: resolution: {integrity: sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg==} dev: true @@ -5149,6 +5460,13 @@ packages: type-fest: 0.21.3 dev: true + /ansi-escapes/6.0.0: + resolution: {integrity: sha512-IG23inYII3dWlU2EyiAiGj6Bwal5GzsgPMwjYGvc1HPE2dgbj4ZB5ToWBKSquKw74nB3TIuOwaI6/jSULzfgrw==} + engines: {node: '>=14.16'} + dependencies: + type-fest: 3.5.3 + dev: true + /ansi-html-community/0.0.8: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} engines: {'0': node >= 0.8.0} @@ -5169,6 +5487,11 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + /ansi-regex/6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + /ansi-styles/3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -5277,6 +5600,13 @@ packages: resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==} dev: true + /append-transform/2.0.0: + resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} + engines: {node: '>=8'} + dependencies: + default-require-extensions: 3.0.1 + dev: true + /aproba/1.2.0: resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} dev: true @@ -5289,6 +5619,10 @@ packages: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} dev: true + /archy/1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + dev: true + /are-we-there-yet/2.0.0: resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} engines: {node: '>=10'} @@ -5556,6 +5890,14 @@ packages: engines: {node: '>=4'} dev: true + /axios/0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + dependencies: + follow-redirects: 1.15.2 + transitivePeerDependencies: + - debug + dev: true + /babel-eslint/10.1.0_eslint@7.32.0: resolution: {integrity: sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==} engines: {node: '>=6'} @@ -5574,6 +5916,24 @@ packages: - supports-color dev: true + /babel-jest/28.1.3_@babel+core@7.20.2: + resolution: {integrity: sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.20.2 + '@jest/transform': 28.1.3 + '@types/babel__core': 7.1.19 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 28.1.3_@babel+core@7.20.2 + chalk: 4.1.2 + graceful-fs: 4.2.10 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-jest/29.3.1_@babel+core@7.20.2: resolution: {integrity: sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5646,6 +6006,16 @@ packages: - supports-color dev: true + /babel-plugin-jest-hoist/28.1.3: + resolution: {integrity: sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@babel/template': 7.18.10 + '@babel/types': 7.20.2 + '@types/babel__core': 7.1.19 + '@types/babel__traverse': 7.18.2 + dev: true + /babel-plugin-jest-hoist/29.2.0: resolution: {integrity: sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5740,6 +6110,17 @@ packages: '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.2 dev: true + /babel-preset-jest/28.1.3_@babel+core@7.20.2: + resolution: {integrity: sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.2 + babel-plugin-jest-hoist: 28.1.3 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.2 + dev: true + /babel-preset-jest/29.2.0_@babel+core@7.20.2: resolution: {integrity: sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6148,6 +6529,16 @@ packages: engines: {node: '>=6'} dev: true + /caching-transform/4.0.0: + resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} + engines: {node: '>=8'} + dependencies: + hasha: 5.2.2 + make-dir: 3.1.0 + package-hash: 4.0.0 + write-file-atomic: 3.0.3 + dev: true + /call-bind/1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: @@ -6228,6 +6619,11 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} + /can-bind-to-host/1.1.2: + resolution: {integrity: sha512-CqsgmaqiyFRNtP17Ihqa/uHbZxRirntNVNl/kJz31DLKuNRfzvzionkLoUSkElQ6Cz+cpXKA3mhHq4tjbieujA==} + hasBin: true + dev: true + /caniuse-api/3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: @@ -6291,11 +6687,21 @@ packages: ansi-styles: 4.3.0 supports-color: 7.2.0 + /chalk/5.2.0: + resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + /char-regex/1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} dev: true + /char-regex/2.0.1: + resolution: {integrity: sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==} + engines: {node: '>=12.20'} + dev: true + /character-entities-legacy/1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} @@ -6486,6 +6892,14 @@ packages: wrap-ansi: 5.1.0 dev: true + /cliui/6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: true + /cliui/7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: @@ -6605,6 +7019,10 @@ packages: /commander/2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + /commander/3.0.2: + resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} + dev: true + /commander/4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -6945,6 +7363,11 @@ packages: randomfill: 1.0.4 dev: true + /crypto-random-string/2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + dev: true + /css-color-names/0.0.4: resolution: {integrity: sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==} dev: true @@ -7149,6 +7572,14 @@ packages: dev: true optional: true + /cwd/0.10.0: + resolution: {integrity: sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==} + engines: {node: '>=0.8'} + dependencies: + find-pkg: 0.1.2 + fs-exists-sync: 0.1.0 + dev: true + /cyclist/1.0.1: resolution: {integrity: sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==} dev: true @@ -7593,6 +8024,13 @@ packages: dev: true optional: true + /default-require-extensions/3.0.1: + resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} + engines: {node: '>=8'} + dependencies: + strip-bom: 4.0.0 + dev: true + /defaults/1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} dependencies: @@ -7633,6 +8071,20 @@ packages: isobject: 3.0.1 dev: true + /del/6.1.1: + resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} + engines: {node: '>=10'} + dependencies: + globby: 11.1.0 + graceful-fs: 4.2.10 + is-glob: 4.0.3 + is-path-cwd: 2.2.0 + is-path-inside: 3.0.3 + p-map: 4.0.0 + rimraf: 3.0.2 + slash: 3.0.0 + dev: true + /delayed-stream/1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -7685,6 +8137,11 @@ packages: - supports-color dev: true + /diff-sequences/28.1.1: + resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dev: true + /diff-sequences/29.3.1: resolution: {integrity: sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7695,6 +8152,12 @@ packages: engines: {node: '>=0.3.1'} dev: true + /diffable-html/4.1.0: + resolution: {integrity: sha512-++kyNek+YBLH8cLXS+iTj/Hiy2s5qkRJEJ8kgu/WHbFrVY2vz9xPFUT+fii2zGF0m1CaojDlQJjkfrCt7YWM1g==} + dependencies: + htmlparser2: 3.10.1 + dev: true + /diffie-hellman/5.0.3: resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} dependencies: @@ -7797,6 +8260,12 @@ packages: webidl-conversions: 7.0.0 dev: true + /domhandler/2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + dependencies: + domelementtype: 1.3.1 + dev: true + /domhandler/4.3.1: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} engines: {node: '>= 4'} @@ -7897,6 +8366,11 @@ packages: minimalistic-crypto-utils: 1.0.1 dev: true + /emittery/0.10.2: + resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} + engines: {node: '>=12'} + dev: true + /emittery/0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} @@ -7949,6 +8423,10 @@ packages: ansi-colors: 4.1.3 dev: true + /entities/1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + dev: true + /entities/2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} dev: true @@ -8046,6 +8524,10 @@ packages: engines: {node: '>=0.4.0'} dev: true + /es6-error/4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + dev: true + /es6-shim/0.35.6: resolution: {integrity: sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA==} dev: true @@ -8654,6 +9136,28 @@ packages: - supports-color dev: true + /expand-tilde/1.2.2: + resolution: {integrity: sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==} + engines: {node: '>=0.10.0'} + dependencies: + os-homedir: 1.0.2 + dev: true + + /expect-playwright/0.8.0: + resolution: {integrity: sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg==} + dev: true + + /expect/28.1.3: + resolution: {integrity: sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/expect-utils': 28.1.3 + jest-get-type: 28.0.2 + jest-matcher-utils: 28.1.3 + jest-message-util: 28.1.3 + jest-util: 28.1.3 + dev: true + /expect/29.3.1: resolution: {integrity: sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8972,6 +9476,32 @@ packages: pkg-dir: 4.2.0 dev: true + /find-file-up/0.1.3: + resolution: {integrity: sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==} + engines: {node: '>=0.10.0'} + dependencies: + fs-exists-sync: 0.1.0 + resolve-dir: 0.1.1 + dev: true + + /find-pkg/0.1.2: + resolution: {integrity: sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==} + engines: {node: '>=0.10.0'} + dependencies: + find-file-up: 0.1.3 + dev: true + + /find-process/1.4.7: + resolution: {integrity: sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==} + hasBin: true + dependencies: + chalk: 4.1.2 + commander: 5.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + /find-up/1.1.2: resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} engines: {node: '>=0.10.0'} @@ -9035,6 +9565,16 @@ packages: - encoding dev: false + /follow-redirects/1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: true + /for-each/0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: @@ -9174,6 +9714,15 @@ packages: readable-stream: 2.3.7 dev: true + /fromentries/1.3.2: + resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} + dev: true + + /fs-exists-sync/0.1.0: + resolution: {integrity: sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==} + engines: {node: '>=0.10.0'} + dev: true + /fs-extra/10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -9306,6 +9855,11 @@ packages: dev: true optional: true + /get-stdin/5.0.1: + resolution: {integrity: sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA==} + engines: {node: '>=0.12.0'} + dev: true + /get-stream/4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} engines: {node: '>=6'} @@ -9429,6 +9983,24 @@ packages: ini: 2.0.0 dev: true + /global-modules/0.2.3: + resolution: {integrity: sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==} + engines: {node: '>=0.10.0'} + dependencies: + global-prefix: 0.1.5 + is-windows: 0.2.0 + dev: true + + /global-prefix/0.1.5: + resolution: {integrity: sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==} + engines: {node: '>=0.10.0'} + dependencies: + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 0.2.0 + which: 1.3.1 + dev: true + /global/4.4.0: resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} dependencies: @@ -9482,6 +10054,10 @@ packages: - supports-color dev: true + /glur/1.1.2: + resolution: {integrity: sha512-l+8esYHTKOx2G/Aao4lEQ0bnHWg4fWtJbVoZZT9Knxi01pB8C80BR85nONLFwkkQoFRCmXY+BUcGZN3yZ2QsRA==} + dev: true + /gopd/1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: @@ -9598,6 +10174,14 @@ packages: minimalistic-assert: 1.0.1 dev: true + /hasha/5.2.2: + resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} + engines: {node: '>=8'} + dependencies: + is-stream: 2.0.1 + type-fest: 0.8.1 + dev: true + /hast-to-hyperscript/9.0.1: resolution: {integrity: sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==} dependencies: @@ -9694,6 +10278,13 @@ packages: react-is: 16.13.1 dev: false + /homedir-polyfill/1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + dependencies: + parse-passwd: 1.0.0 + dev: true + /hosted-git-info/2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true @@ -9782,6 +10373,17 @@ packages: webpack: 4.46.0_webpack-cli@4.10.0 dev: true + /htmlparser2/3.10.1: + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + dependencies: + domelementtype: 1.3.1 + domhandler: 2.4.2 + domutils: 1.7.0 + entities: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: true + /htmlparser2/6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} dependencies: @@ -9984,6 +10586,10 @@ packages: /inherits/2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + /ini/1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + /ini/2.0.0: resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} engines: {node: '>=10'} @@ -10352,6 +10958,11 @@ packages: resolution: {integrity: sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==} dev: true + /is-path-cwd/2.2.0: + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} + dev: true + /is-path-inside/3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} @@ -10474,6 +11085,11 @@ packages: resolution: {integrity: sha512-uj00kdXyZb9t9RcAUAwMZAnkBUwdYGhYlt7djMXhfyhUCzwNba50tIiBKR7q0l7tdoBtFVw/3JmLY6fI3rmZmg==} dev: true + /is-windows/0.2.0: + resolution: {integrity: sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==} + engines: {node: '>=0.10.0'} + dev: true + /is-windows/1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -10540,6 +11156,25 @@ packages: engines: {node: '>=8'} dev: true + /istanbul-lib-hook/3.0.0: + resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} + engines: {node: '>=8'} + dependencies: + append-transform: 2.0.0 + dev: true + + /istanbul-lib-instrument/4.0.3: + resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.20.2 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + /istanbul-lib-instrument/5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} @@ -10553,6 +11188,18 @@ packages: - supports-color dev: true + /istanbul-lib-processinfo/2.0.3: + resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} + engines: {node: '>=8'} + dependencies: + archy: 1.0.0 + cross-spawn: 7.0.3 + istanbul-lib-coverage: 3.2.0 + p-map: 3.0.0 + rimraf: 3.0.2 + uuid: 8.3.2 + dev: true + /istanbul-lib-report/3.0.0: resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} engines: {node: '>=8'} @@ -10599,6 +11246,14 @@ packages: moo-color: 1.0.3 dev: true + /jest-changed-files/28.1.3: + resolution: {integrity: sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + execa: 5.1.1 + p-limit: 3.1.0 + dev: true + /jest-changed-files/29.2.0: resolution: {integrity: sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10607,6 +11262,33 @@ packages: p-limit: 3.1.0 dev: true + /jest-circus/28.1.3: + resolution: {integrity: sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/environment': 28.1.3 + '@jest/expect': 28.1.3 + '@jest/test-result': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.11.9 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + is-generator-fn: 2.1.0 + jest-each: 28.1.3 + jest-matcher-utils: 28.1.3 + jest-message-util: 28.1.3 + jest-runtime: 28.1.3 + jest-snapshot: 28.1.3 + jest-util: 28.1.3 + p-limit: 3.1.0 + pretty-format: 28.1.3 + slash: 3.0.0 + stack-utils: 2.0.5 + transitivePeerDependencies: + - supports-color + dev: true + /jest-circus/29.3.1: resolution: {integrity: sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10634,6 +11316,34 @@ packages: - supports-color dev: true + /jest-cli/28.1.3_odkjkoia5xunhxkdrka32ib6vi: + resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 28.1.3_ts-node@10.9.1 + '@jest/test-result': 28.1.3 + '@jest/types': 28.1.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + import-local: 3.1.0 + jest-config: 28.1.3_odkjkoia5xunhxkdrka32ib6vi + jest-util: 28.1.3 + jest-validate: 28.1.3 + prompts: 2.4.2 + yargs: 17.6.2 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + /jest-cli/29.3.1_odkjkoia5xunhxkdrka32ib6vi: resolution: {integrity: sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10662,6 +11372,46 @@ packages: - ts-node dev: true + /jest-config/28.1.3_odkjkoia5xunhxkdrka32ib6vi: + resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.20.2 + '@jest/test-sequencer': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.11.9 + babel-jest: 28.1.3_@babel+core@7.20.2 + chalk: 4.1.2 + ci-info: 3.5.0 + deepmerge: 4.2.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-circus: 28.1.3 + jest-environment-node: 28.1.3 + jest-get-type: 28.0.2 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.3 + jest-runner: 28.1.3 + jest-util: 28.1.3 + jest-validate: 28.1.3 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 28.1.3 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.1_cbe7ovvae6zqfnmtgctpgpys54 + transitivePeerDependencies: + - supports-color + dev: true + /jest-config/29.3.1_odkjkoia5xunhxkdrka32ib6vi: resolution: {integrity: sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10702,6 +11452,16 @@ packages: - supports-color dev: true + /jest-diff/28.1.3: + resolution: {integrity: sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 28.1.1 + jest-get-type: 28.0.2 + pretty-format: 28.1.3 + dev: true + /jest-diff/29.3.1: resolution: {integrity: sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10712,6 +11472,13 @@ packages: pretty-format: 29.3.1 dev: true + /jest-docblock/28.1.1: + resolution: {integrity: sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + /jest-docblock/29.2.0: resolution: {integrity: sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10719,6 +11486,17 @@ packages: detect-newline: 3.1.0 dev: true + /jest-each/28.1.3: + resolution: {integrity: sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + chalk: 4.1.2 + jest-get-type: 28.0.2 + jest-util: 28.1.3 + pretty-format: 28.1.3 + dev: true + /jest-each/29.3.1: resolution: {integrity: sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10753,6 +11531,18 @@ packages: - utf-8-validate dev: true + /jest-environment-node/28.1.3: + resolution: {integrity: sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/environment': 28.1.3 + '@jest/fake-timers': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.11.9 + jest-mock: 28.1.3 + jest-util: 28.1.3 + dev: true + /jest-environment-node/29.3.1: resolution: {integrity: sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10765,6 +11555,11 @@ packages: jest-util: 29.3.1 dev: true + /jest-get-type/28.0.2: + resolution: {integrity: sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dev: true + /jest-get-type/29.2.0: resolution: {integrity: sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10793,6 +11588,25 @@ packages: - supports-color dev: true + /jest-haste-map/28.1.3: + resolution: {integrity: sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + '@types/graceful-fs': 4.1.5 + '@types/node': 18.11.9 + anymatch: 3.1.2 + fb-watchman: 2.0.2 + graceful-fs: 4.2.10 + jest-regex-util: 28.0.2 + jest-util: 28.1.3 + jest-worker: 28.1.3 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + dev: true + /jest-haste-map/29.3.1: resolution: {integrity: sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10812,6 +11626,42 @@ packages: fsevents: 2.3.2 dev: true + /jest-image-snapshot/6.1.0_jest@29.3.1: + resolution: {integrity: sha512-LZYoks6V1HAkYqyi80gUjMWVsa++Oy0fckAGMLBQseVweZT9AmJNKAINwHLqX1fpeMy2hTG5CCEe4IUX2N3Nmg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + jest: '>=20 <=29' + dependencies: + chalk: 4.1.2 + get-stdin: 5.0.1 + glur: 1.1.2 + jest: 29.3.1_odkjkoia5xunhxkdrka32ib6vi + lodash: 4.17.21 + mkdirp: 0.5.6 + pixelmatch: 5.3.0 + pngjs: 3.4.0 + rimraf: 2.7.1 + ssim.js: 3.5.0 + dev: true + + /jest-junit/14.0.1: + resolution: {integrity: sha512-h7/wwzPbllgpQhhVcRzRC76/cc89GlazThoV1fDxcALkf26IIlRsu/AcTG64f4nR2WPE3Cbd+i/sVf+NCUHrWQ==} + engines: {node: '>=10.12.0'} + dependencies: + mkdirp: 1.0.4 + strip-ansi: 6.0.1 + uuid: 8.3.2 + xml: 1.0.1 + dev: true + + /jest-leak-detector/28.1.3: + resolution: {integrity: sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + jest-get-type: 28.0.2 + pretty-format: 28.1.3 + dev: true + /jest-leak-detector/29.3.1: resolution: {integrity: sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10820,6 +11670,16 @@ packages: pretty-format: 29.3.1 dev: true + /jest-matcher-utils/28.1.3: + resolution: {integrity: sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 28.1.3 + jest-get-type: 28.0.2 + pretty-format: 28.1.3 + dev: true + /jest-matcher-utils/29.3.1: resolution: {integrity: sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10830,6 +11690,21 @@ packages: pretty-format: 29.3.1 dev: true + /jest-message-util/28.1.3: + resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@babel/code-frame': 7.18.6 + '@jest/types': 28.1.3 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.10 + micromatch: 4.0.5 + pretty-format: 28.1.3 + slash: 3.0.0 + stack-utils: 2.0.5 + dev: true + /jest-message-util/29.3.1: resolution: {integrity: sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10845,6 +11720,14 @@ packages: stack-utils: 2.0.5 dev: true + /jest-mock/28.1.3: + resolution: {integrity: sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + '@types/node': 18.11.9 + dev: true + /jest-mock/29.3.1: resolution: {integrity: sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10854,6 +11737,41 @@ packages: jest-util: 29.3.1 dev: true + /jest-playwright-preset/2.0.0_qruclkpwe5tgscr3gxibacztji: + resolution: {integrity: sha512-pV5ruTJJMen3lwshUL4dlSqLlP8z4q9MXqWJkmy+sB6HYfzXoqBHzhl+5hslznhnSVTe4Dwu+reiiwcUJpYUbw==} + peerDependencies: + jest: ^28.0.0 + jest-circus: ^28.0.0 + jest-environment-node: ^28.0.0 + jest-runner: ^28.0.0 + dependencies: + expect-playwright: 0.8.0 + jest: 28.1.3_odkjkoia5xunhxkdrka32ib6vi + jest-circus: 28.1.3 + jest-environment-node: 28.1.3 + jest-process-manager: 0.3.1 + jest-runner: 28.1.3 + nyc: 15.1.0 + playwright-core: 1.29.2 + rimraf: 3.0.2 + uuid: 8.3.2 + transitivePeerDependencies: + - debug + - supports-color + dev: true + + /jest-pnp-resolver/1.2.2_jest-resolve@28.1.3: + resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 28.1.3 + dev: true + /jest-pnp-resolver/1.2.2_jest-resolve@29.3.1: resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} engines: {node: '>=6'} @@ -10866,16 +11784,49 @@ packages: jest-resolve: 29.3.1 dev: true + /jest-process-manager/0.3.1: + resolution: {integrity: sha512-x9W54UgZ7IkzUHgXtnI1x4GKOVjxtwW0CA/7yGbTHtT/YhENO0Lic2yfVyC/gekn7OIEMcQmy0L1r9WLQABfqw==} + dependencies: + '@types/wait-on': 5.3.1 + chalk: 4.1.2 + cwd: 0.10.0 + exit: 0.1.2 + find-process: 1.4.7 + prompts: 2.4.2 + signal-exit: 3.0.7 + spawnd: 5.0.0 + tree-kill: 1.2.2 + wait-on: 5.3.0 + transitivePeerDependencies: + - debug + - supports-color + dev: true + /jest-regex-util/26.0.0: resolution: {integrity: sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==} engines: {node: '>= 10.14.2'} dev: true + /jest-regex-util/28.0.2: + resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dev: true + /jest-regex-util/29.2.0: resolution: {integrity: sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true + /jest-resolve-dependencies/28.1.3: + resolution: {integrity: sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + jest-regex-util: 28.0.2 + jest-snapshot: 28.1.3 + transitivePeerDependencies: + - supports-color + dev: true + /jest-resolve-dependencies/29.3.1: resolution: {integrity: sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10886,6 +11837,21 @@ packages: - supports-color dev: true + /jest-resolve/28.1.3: + resolution: {integrity: sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.10 + jest-haste-map: 28.1.3 + jest-pnp-resolver: 1.2.2_jest-resolve@28.1.3 + jest-util: 28.1.3 + jest-validate: 28.1.3 + resolve: 1.22.1 + resolve.exports: 1.1.0 + slash: 3.0.0 + dev: true + /jest-resolve/29.3.1: resolution: {integrity: sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10901,6 +11867,35 @@ packages: slash: 3.0.0 dev: true + /jest-runner/28.1.3: + resolution: {integrity: sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/console': 28.1.3 + '@jest/environment': 28.1.3 + '@jest/test-result': 28.1.3 + '@jest/transform': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.11.9 + chalk: 4.1.2 + emittery: 0.10.2 + graceful-fs: 4.2.10 + jest-docblock: 28.1.1 + jest-environment-node: 28.1.3 + jest-haste-map: 28.1.3 + jest-leak-detector: 28.1.3 + jest-message-util: 28.1.3 + jest-resolve: 28.1.3 + jest-runtime: 28.1.3 + jest-util: 28.1.3 + jest-watcher: 28.1.3 + jest-worker: 28.1.3 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + /jest-runner/29.3.1: resolution: {integrity: sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10930,6 +11925,36 @@ packages: - supports-color dev: true + /jest-runtime/28.1.3: + resolution: {integrity: sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/environment': 28.1.3 + '@jest/fake-timers': 28.1.3 + '@jest/globals': 28.1.3 + '@jest/source-map': 28.1.2 + '@jest/test-result': 28.1.3 + '@jest/transform': 28.1.3 + '@jest/types': 28.1.3 + chalk: 4.1.2 + cjs-module-lexer: 1.2.2 + collect-v8-coverage: 1.0.1 + execa: 5.1.1 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-haste-map: 28.1.3 + jest-message-util: 28.1.3 + jest-mock: 28.1.3 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.3 + jest-snapshot: 28.1.3 + jest-util: 28.1.3 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /jest-runtime/29.3.1: resolution: {integrity: sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10960,6 +11985,12 @@ packages: - supports-color dev: true + /jest-serializer-html/7.1.0: + resolution: {integrity: sha512-xYL2qC7kmoYHJo8MYqJkzrl/Fdlx+fat4U1AqYg+kafqwcKPiMkOcjWHPKhueuNEgr+uemhGc+jqXYiwCyRyLA==} + dependencies: + diffable-html: 4.1.0 + dev: true + /jest-serializer/26.6.2: resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} engines: {node: '>= 10.14.2'} @@ -10968,6 +11999,37 @@ packages: graceful-fs: 4.2.10 dev: true + /jest-snapshot/28.1.3: + resolution: {integrity: sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@babel/core': 7.20.2 + '@babel/generator': 7.20.2 + '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.2 + '@babel/traverse': 7.20.1 + '@babel/types': 7.20.2 + '@jest/expect-utils': 28.1.3 + '@jest/transform': 28.1.3 + '@jest/types': 28.1.3 + '@types/babel__traverse': 7.18.2 + '@types/prettier': 2.7.1 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.2 + chalk: 4.1.2 + expect: 28.1.3 + graceful-fs: 4.2.10 + jest-diff: 28.1.3 + jest-get-type: 28.0.2 + jest-haste-map: 28.1.3 + jest-matcher-utils: 28.1.3 + jest-message-util: 28.1.3 + jest-util: 28.1.3 + natural-compare: 1.4.0 + pretty-format: 28.1.3 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + dev: true + /jest-snapshot/29.3.1: resolution: {integrity: sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -11012,6 +12074,18 @@ packages: micromatch: 4.0.5 dev: true + /jest-util/28.1.3: + resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + '@types/node': 18.11.9 + chalk: 4.1.2 + ci-info: 3.5.0 + graceful-fs: 4.2.10 + picomatch: 2.3.1 + dev: true + /jest-util/29.3.1: resolution: {integrity: sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -11024,6 +12098,18 @@ packages: picomatch: 2.3.1 dev: true + /jest-validate/28.1.3: + resolution: {integrity: sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 28.0.2 + leven: 3.1.0 + pretty-format: 28.1.3 + dev: true + /jest-validate/29.3.1: resolution: {integrity: sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -11036,6 +12122,36 @@ packages: pretty-format: 29.3.1 dev: true + /jest-watch-typeahead/2.2.2_jest@28.1.3: + resolution: {integrity: sha512-+QgOFW4o5Xlgd6jGS5X37i08tuuXNW8X0CV9WNFi+3n8ExCIP+E1melYhvYLjv5fE6D0yyzk74vsSO8I6GqtvQ==} + engines: {node: ^14.17.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + jest: ^27.0.0 || ^28.0.0 || ^29.0.0 + dependencies: + ansi-escapes: 6.0.0 + chalk: 5.2.0 + jest: 28.1.3_odkjkoia5xunhxkdrka32ib6vi + jest-regex-util: 29.2.0 + jest-watcher: 29.3.1 + slash: 5.0.0 + string-length: 5.0.1 + strip-ansi: 7.0.1 + dev: true + + /jest-watcher/28.1.3: + resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/test-result': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.11.9 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.10.2 + jest-util: 28.1.3 + string-length: 4.0.2 + dev: true + /jest-watcher/29.3.1: resolution: {integrity: sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -11059,6 +12175,15 @@ packages: supports-color: 7.2.0 dev: true + /jest-worker/28.1.3: + resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@types/node': 18.11.9 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + /jest-worker/29.3.1: resolution: {integrity: sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -11069,6 +12194,26 @@ packages: supports-color: 8.1.1 dev: true + /jest/28.1.3_odkjkoia5xunhxkdrka32ib6vi: + resolution: {integrity: sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 28.1.3_ts-node@10.9.1 + '@jest/types': 28.1.3 + import-local: 3.1.0 + jest-cli: 28.1.3_odkjkoia5xunhxkdrka32ib6vi + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + /jest/29.3.1_odkjkoia5xunhxkdrka32ib6vi: resolution: {integrity: sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -11089,6 +12234,16 @@ packages: - ts-node dev: true + /joi/17.7.0: + resolution: {integrity: sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==} + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.4 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + dev: true + /js-cookie/2.2.1: resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} dev: false @@ -11601,6 +12756,10 @@ packages: /lodash.debounce/4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + /lodash.flattendeep/4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + dev: true + /lodash.flow/3.5.0: resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} dev: false @@ -12333,6 +13492,13 @@ packages: vm-browserify: 1.1.2 dev: true + /node-preload/0.2.1: + resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} + engines: {node: '>=8'} + dependencies: + process-on-spawn: 1.0.0 + dev: true + /node-releases/2.0.6: resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} @@ -12409,6 +13575,42 @@ packages: resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==} dev: true + /nyc/15.1.0: + resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} + engines: {node: '>=8.9'} + hasBin: true + dependencies: + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + caching-transform: 4.0.0 + convert-source-map: 1.9.0 + decamelize: 1.2.0 + find-cache-dir: 3.3.2 + find-up: 4.1.0 + foreground-child: 2.0.0 + get-package-type: 0.1.0 + glob: 7.2.3 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-hook: 3.0.0 + istanbul-lib-instrument: 4.0.3 + istanbul-lib-processinfo: 2.0.3 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.5 + make-dir: 3.1.0 + node-preload: 0.2.1 + p-map: 3.0.0 + process-on-spawn: 1.0.0 + resolve-from: 5.0.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + spawn-wrap: 2.0.0 + test-exclude: 6.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - supports-color + dev: true + /object-assign/4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -12595,7 +13797,6 @@ packages: resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} engines: {node: '>=0.10.0'} dev: true - optional: true /os-tmpdir/1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} @@ -12702,6 +13903,16 @@ packages: engines: {node: '>=6'} dev: true + /package-hash/4.0.0: + resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} + engines: {node: '>=8'} + dependencies: + graceful-fs: 4.2.10 + hasha: 5.2.2 + lodash.flattendeep: 4.4.0 + release-zalgo: 1.0.0 + dev: true + /pako/1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} dev: true @@ -12779,6 +13990,11 @@ packages: engines: {node: '>= 0.10'} dev: false + /parse-passwd/1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + dev: true + /parse5/6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} dev: true @@ -12973,11 +14189,20 @@ packages: find-up: 5.0.0 dev: true - /playwright-core/1.28.1: - resolution: {integrity: sha512-3PixLnGPno0E8rSBJjtwqTwJe3Yw72QwBBBxNoukIj3lEeBNXwbNiKrNuB1oyQgTBw5QHUhNO3SteEtHaMK6ag==} + /playwright-core/1.29.2: + resolution: {integrity: sha512-94QXm4PMgFoHAhlCuoWyaBYKb92yOcGVHdQLoxQ7Wjlc7Flg4aC/jbFW7xMR52OfXMVkWicue4WXE7QEegbIRA==} engines: {node: '>=14'} hasBin: true - dev: false + dev: true + + /playwright/1.29.2: + resolution: {integrity: sha512-hKBYJUtdmYzcjdhYDkP9WGtORwwZBBKAW8+Lz7sr0ZMxtJr04ASXVzH5eBWtDkdb0c3LLFsehfPBTRfvlfKJOA==} + engines: {node: '>=14'} + hasBin: true + requiresBuild: true + dependencies: + playwright-core: 1.29.2 + dev: true /please-upgrade-node/3.2.0: resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==} @@ -12985,6 +14210,11 @@ packages: semver-compare: 1.0.0 dev: true + /pngjs/3.4.0: + resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} + engines: {node: '>=4.0.0'} + dev: true + /pngjs/6.0.0: resolution: {integrity: sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==} engines: {node: '>=12.13.0'} @@ -13428,6 +14658,16 @@ packages: ansi-styles: 5.2.0 react-is: 17.0.2 + /pretty-format/28.1.3: + resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/schemas': 28.1.3 + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + /pretty-format/29.3.1: resolution: {integrity: sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -13454,6 +14694,13 @@ packages: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true + /process-on-spawn/1.0.0: + resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} + engines: {node: '>=8'} + dependencies: + fromentries: 1.3.2 + dev: true + /process/0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -14768,6 +16015,13 @@ packages: engines: {node: '>= 0.10'} dev: true + /release-zalgo/1.0.0: + resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} + engines: {node: '>=4'} + dependencies: + es6-error: 4.1.1 + dev: true + /remark-external-links/8.0.0: resolution: {integrity: sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==} dependencies: @@ -14915,6 +16169,14 @@ packages: resolve-from: 5.0.0 dev: true + /resolve-dir/0.1.1: + resolution: {integrity: sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 1.2.2 + global-modules: 0.2.3 + dev: true + /resolve-from/3.0.0: resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} engines: {node: '>=4'} @@ -15393,6 +16655,11 @@ packages: engines: {node: '>=8'} dev: true + /slash/5.0.0: + resolution: {integrity: sha512-n6KkmvKS0623igEVj3FF0OZs1gYYJ0o0Hj939yc1fyxl2xt+xYpLnzJB6xBSqOfV9ZFLEWodBBN/heZJahuIJQ==} + engines: {node: '>=14.16'} + dev: true + /slice-ansi/3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} @@ -15511,6 +16778,29 @@ packages: resolution: {integrity: sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==} dev: true + /spawn-wrap/2.0.0: + resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} + engines: {node: '>=8'} + dependencies: + foreground-child: 2.0.0 + is-windows: 1.0.2 + make-dir: 3.1.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + which: 2.0.2 + dev: true + + /spawnd/5.0.0: + resolution: {integrity: sha512-28+AJr82moMVWolQvlAIv3JcYDkjkFTEmfDc503wxrF5l2rQ3dFz6DpbXp3kD4zmgGGldfM4xM4v1sFj/ZaIOA==} + dependencies: + exit: 0.1.2 + signal-exit: 3.0.7 + tree-kill: 1.2.2 + wait-port: 0.2.14 + transitivePeerDependencies: + - supports-color + dev: true + /spdx-correct/3.1.1: resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} dependencies: @@ -15560,6 +16850,10 @@ packages: tweetnacl: 0.14.5 dev: true + /ssim.js/3.5.0: + resolution: {integrity: sha512-Aj6Jl2z6oDmgYFFbQqK7fght19bXdOxY7Tj03nF+03M9gCBAjeIiO8/PlEGMfKDwYpw4q6iBqVq2YuREorGg/g==} + dev: true + /ssri/6.0.2: resolution: {integrity: sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==} dependencies: @@ -15709,6 +17003,14 @@ packages: strip-ansi: 6.0.1 dev: true + /string-length/5.0.1: + resolution: {integrity: sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==} + engines: {node: '>=12.20'} + dependencies: + char-regex: 2.0.1 + strip-ansi: 7.0.1 + dev: true + /string-width/3.1.0: resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} engines: {node: '>=6'} @@ -15816,6 +17118,13 @@ packages: ansi-regex: 5.0.1 dev: true + /strip-ansi/7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + /strip-bom/2.0.0: resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} engines: {node: '>=0.10.0'} @@ -15940,6 +17249,14 @@ packages: has-flag: 4.0.0 dev: true + /supports-hyperlinks/2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -16024,6 +17341,30 @@ packages: memoizerific: 1.11.3 dev: true + /temp-dir/2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + dev: true + + /tempy/1.0.1: + resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==} + engines: {node: '>=10'} + dependencies: + del: 6.1.1 + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 + dev: true + + /terminal-link/2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + dev: true + /terser-webpack-plugin/1.4.5_webpack@4.46.0: resolution: {integrity: sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==} engines: {node: '>= 6.9.0'} @@ -16394,6 +17735,11 @@ packages: engines: {node: '>=4'} dev: true + /type-fest/0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + dev: true + /type-fest/0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -16424,6 +17770,11 @@ packages: engines: {node: '>=12.20'} dev: true + /type-fest/3.5.3: + resolution: {integrity: sha512-V2+og4j/rWReWvaFrse3s9g2xvUv/K9Azm/xo6CjIuq7oeGqsoimC7+9/A3tfvNcbQf8RPSVj/HV81fB4DJrjA==} + engines: {node: '>=14.16'} + dev: true + /type-is/1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -16556,6 +17907,13 @@ packages: imurmurhash: 0.1.4 dev: true + /unique-string/2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + dependencies: + crypto-random-string: 2.0.0 + dev: true + /unist-builder/2.0.3: resolution: {integrity: sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==} dev: true @@ -16908,6 +18266,32 @@ packages: xml-name-validator: 4.0.0 dev: true + /wait-on/5.3.0: + resolution: {integrity: sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==} + engines: {node: '>=8.9.0'} + hasBin: true + dependencies: + axios: 0.21.4 + joi: 17.7.0 + lodash: 4.17.21 + minimist: 1.2.7 + rxjs: 6.6.7 + transitivePeerDependencies: + - debug + dev: true + + /wait-port/0.2.14: + resolution: {integrity: sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ==} + engines: {node: '>=8'} + hasBin: true + dependencies: + chalk: 2.4.2 + commander: 3.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + /walker/1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: @@ -17310,6 +18694,10 @@ packages: engines: {node: '>=12'} dev: true + /xml/1.0.1: + resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} + dev: true + /xmlchars/2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true @@ -17347,6 +18735,14 @@ packages: decamelize: 1.2.0 dev: true + /yargs-parser/18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: true + /yargs-parser/20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -17372,6 +18768,23 @@ packages: yargs-parser: 13.1.2 dev: true + /yargs/15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.0 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: true + /yargs/16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'}