diff --git a/.changeset/thin-experts-ring.md b/.changeset/thin-experts-ring.md new file mode 100644 index 00000000..13276359 --- /dev/null +++ b/.changeset/thin-experts-ring.md @@ -0,0 +1,6 @@ +--- +"@interactors/material-ui": patch +"@interactors/with-storybook": patch +--- + +Add Storybook addon `with-storybook` package diff --git a/package.json b/package.json index 36bca341..076893e8 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,8 @@ "packages/keyboard", "packages/html", "packages/material-ui", - "packages/with-cypress" + "packages/with-cypress", + "packages/with-storybook" ] }, "scripts": { diff --git a/packages/core/package.json b/packages/core/package.json index ce074ff7..b8a4e27c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -33,7 +33,7 @@ "prepack:commonjs": "tsc --project ./tsconfig.build.json --outdir dist/cjs --module commonjs" }, "dependencies": { - "@effection/core": "2.2.0", + "@effection/core": "^2.2.0", "@interactors/globals": "1.0.0-rc1.1", "@testing-library/dom": "^8.5.0", "@testing-library/user-event": "^13.2.1", diff --git a/packages/core/src/interaction.ts b/packages/core/src/interaction.ts index 8a39c174..f5fa4381 100644 --- a/packages/core/src/interaction.ts +++ b/packages/core/src/interaction.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { Operation, Task, run, Symbol } from '@effection/core'; -import { InteractionOptions as SerializedInteractionOptions, globals, InteractionType } from '@interactors/globals'; +import { globals, CommonInteraction, InteractionType } from '@interactors/globals'; import type { Interactor, FilterObject, FilterFn, FilterParams } from './specification'; import { serializeInteractionOptions } from './serialize'; @@ -21,36 +21,19 @@ export function isInteraction(x: unknown): x is Interaction { * * @typeParam T the return value of the promise that this interaction evaluates to. */ -export interface Interaction extends Promise { - type: InteractionType; - +export type Interaction = CommonInteraction & { interactor: Interactor; + run: (interactor: Interactor) => Operation; - /** - * Return a description of the interaction - */ - description: string; - /** - * Return a code representation of the interaction - */ - code: () => string; - /** - * Return a serialized options of the interaction - */ - options: SerializedInteractionOptions; /** * Perform the interaction */ action: () => Task; - check?: () => Task; - - halt: () => Promise; - [interactionSymbol]: true; } -export interface ActionInteraction extends Interaction { +export type ActionInteraction = Interaction & { type: "action"; check: undefined; } @@ -60,7 +43,7 @@ export interface ActionInteraction extends Interact * * @typeParam T the return value of the promise that this interaction evaluates to. */ -export interface AssertionInteraction extends Interaction { +export type AssertionInteraction = Interaction & { type: "assertion"; /** * Perform the check diff --git a/packages/globals/package.json b/packages/globals/package.json index c21ea396..2eb1239d 100644 --- a/packages/globals/package.json +++ b/packages/globals/package.json @@ -39,6 +39,6 @@ "yarn": "1.22.11" }, "dependencies": { - "@effection/core": "2.2.0" + "@effection/core": "^2.2.0" } } diff --git a/packages/globals/src/globals.ts b/packages/globals/src/globals.ts index 040d04d7..851a7985 100644 --- a/packages/globals/src/globals.ts +++ b/packages/globals/src/globals.ts @@ -4,14 +4,25 @@ import { KeyboardLayout } from "./keyboard-layout"; export type InteractionType = "action" | "assertion"; -type Interaction = Operation & { +export type CommonInteraction = Promise & Operation & { type: InteractionType; + /** + * Return a description of the interaction + */ description: string; - options: InteractionOptions; - interactor: unknown; // we can't type this any better here + /** + * Return a code representation of the interaction + */ code: () => string; + /** + * Return a serialized options of the interaction + */ + options: InteractionOptions; + /** + * Cancel interaction execution + */ halt: () => Promise; -}; +} interface Globals { readonly document: Document; @@ -41,7 +52,7 @@ export type InteractionOptions = InteractorOptions & { ancestors?: InteractorOptions[]; }; -export type InteractionWrapper = (perform: () => Promise, interaction: Interaction) => Operation; +export type InteractionWrapper = (perform: () => Promise, interaction: CommonInteraction) => Operation; declare global { // eslint-disable-next-line @typescript-eslint/no-namespace, @typescript-eslint/prefer-namespace-keyword @@ -52,7 +63,7 @@ declare global { } if (!globalThis.__interactors) { - let wrapInteraction = (perform: () => Promise, interaction: Interaction): Operation => { + let wrapInteraction = (perform: () => Promise, interaction: CommonInteraction): Operation => { return (scope) => { let current = perform; for (let wrapper of getGlobals().interactionWrappers) { @@ -131,7 +142,7 @@ export function addActionWrapper( wrapper: (description: string, perform: () => Promise, type: InteractionType) => Operation ): () => boolean { return addInteractionWrapper( - (perform: () => Promise, interaction: Interaction): Operation => + (perform: () => Promise, interaction: CommonInteraction): Operation => wrapper(interaction.description, perform, interaction.type) ); } diff --git a/packages/globals/test/globals.test.ts b/packages/globals/test/globals.test.ts index 80348e09..36c70104 100644 --- a/packages/globals/test/globals.test.ts +++ b/packages/globals/test/globals.test.ts @@ -1,9 +1,8 @@ import { describe, it } from "mocha"; import expect from "expect"; import { JSDOM } from "jsdom"; -import { Symbol } from "@effection/core"; -import { globals, setDocumentResolver, addInteractionWrapper, setInteractorTimeout } from "../src"; +import { globals, setDocumentResolver, addInteractionWrapper, setInteractorTimeout, CommonInteraction } from "../src"; function makeDocument(body = ""): Document { return new JSDOM(`${body}`).window.document; @@ -46,7 +45,6 @@ describe("@interactors/globals", () => { type: "action", interactor: "Interactor", description: "plain action", - action, code: () => "", halt: () => Promise.resolve(), options: { @@ -55,8 +53,7 @@ describe("@interactors/globals", () => { type: "action", code: () => "", }, - [Symbol.operation]: Promise.resolve(), - } + } as unknown as CommonInteraction ) as () => unknown)() ).toBe(action); }); @@ -70,7 +67,6 @@ describe("@interactors/globals", () => { type: "action", interactor: "Interactor", description: "foo action", - action, code: () => "", halt: () => Promise.resolve(), options: { @@ -79,8 +75,7 @@ describe("@interactors/globals", () => { type: "action", code: () => "", }, - [Symbol.operation]: Promise.resolve(), - }, + } as unknown as CommonInteraction, ); removeWrapper(); diff --git a/packages/material-ui/.storybook/main.js b/packages/material-ui/.storybook/main.js index cd552cf7..97f556eb 100644 --- a/packages/material-ui/.storybook/main.js +++ b/packages/material-ui/.storybook/main.js @@ -1,6 +1,12 @@ module.exports = { stories: ["../stories/**/*.stories.@(md|ts)x"], - addons: ["@storybook/addon-postcss", "@storybook/addon-essentials"], - features: { previewCsfV3: true }, + addons: [ + "@storybook/addon-postcss", + "@storybook/addon-essentials", + "@storybook/addon-interactions", + "@interactors/with-storybook", + ], + features: { previewCsfV3: true, interactionsDebugger: true }, core: { builder: "webpack5" }, + typescript: { reactDocgen: false }, }; diff --git a/packages/material-ui/package.json b/packages/material-ui/package.json index 772781a0..bf68cba8 100644 --- a/packages/material-ui/package.json +++ b/packages/material-ui/package.json @@ -43,12 +43,13 @@ "@material-ui/icons": "^4.11.2", "@material-ui/pickers": "^3.3.10", "@material-ui/styles": "^4.11.4", - "@storybook/addon-docs": "6.4.0-alpha.30", - "@storybook/addon-essentials": "6.4.0-alpha.30", + "@storybook/addon-docs": "6.4.19", + "@storybook/addon-essentials": "6.4.19", + "@storybook/addon-interactions": "^6.4.19", "@storybook/addon-postcss": "^2.0.0", - "@storybook/builder-webpack5": "6.4.0-alpha.30", - "@storybook/manager-webpack5": "6.4.0-alpha.30", - "@storybook/react": "6.4.0-alpha.30", + "@storybook/builder-webpack5": "6.4.19", + "@storybook/manager-webpack5": "6.4.19", + "@storybook/react": "6.4.19", "@testing-library/react": "^12.0.0", "@types/react": "^17.0.19", "bigtest": "^0.16.0", @@ -64,6 +65,8 @@ "webpack": "^5.53.0" }, "dependencies": { - "@interactors/html": "1.0.0-rc1.2" + "effection": "^2.0.4", + "@interactors/html": "1.0.0-rc1.2", + "@interactors/with-storybook": "1.0.0-rc1.2" } } diff --git a/packages/material-ui/src/body.ts b/packages/material-ui/src/body.ts index 4f990377..f28c71fd 100644 --- a/packages/material-ui/src/body.ts +++ b/packages/material-ui/src/body.ts @@ -3,7 +3,7 @@ import { HTML } from "@interactors/html"; export const Body = HTML.extend("Body") .selector("body") .actions({ - click: ({ perform }) => + click: async ({ perform }) => perform((element) => { if (document.activeElement && "blur" in document.activeElement) { (document.activeElement as HTMLElement).blur(); diff --git a/packages/material-ui/src/bottom-navigation.ts b/packages/material-ui/src/bottom-navigation.ts index c6052229..3316baaf 100644 --- a/packages/material-ui/src/bottom-navigation.ts +++ b/packages/material-ui/src/bottom-navigation.ts @@ -7,7 +7,7 @@ const BottomNavigationAction = createInteractor("MUIBottomNav let label = element.querySelector('[class*="MuiBottomNavigationAction-label"]'); return isHTMLElement(label) ? innerText(label) : ""; }) - .actions({ click: ({ perform }) => perform((element) => click(element)) }); + .actions({ click: async ({ perform }) => perform((element) => click(element)) }); const BottomNavigationInteractor = createInteractor("MUIBottomNavigation") .selector('[class*="MuiBottomNavigation-root"]') @@ -18,7 +18,7 @@ const BottomNavigationInteractor = createInteractor("MUIBottomNavig }, }) .actions({ - navigate: (interactor, value: string) => interactor.find(BottomNavigationAction(value)).click(), + navigate: async (interactor, value: string) => interactor.find(BottomNavigationAction(value)).click(), }); /** diff --git a/packages/material-ui/src/checkbox.ts b/packages/material-ui/src/checkbox.ts index 5946d556..26a500d6 100644 --- a/packages/material-ui/src/checkbox.ts +++ b/packages/material-ui/src/checkbox.ts @@ -18,7 +18,7 @@ const CheckboxInteractor = BaseCheckbox.extend("MUICheckbox") }, }) .actions({ - click: ({ perform }) => + click: async ({ perform }) => perform((element) => { element.focus(); click(element); diff --git a/packages/material-ui/src/date-field.ts b/packages/material-ui/src/date-field.ts index 4d8ba403..2244c861 100644 --- a/packages/material-ui/src/date-field.ts +++ b/packages/material-ui/src/date-field.ts @@ -8,7 +8,7 @@ const DateFieldInteractor = TextField.extend("DateField") timestamp: (element) => element.valueAsNumber, }) .actions({ - fillIn: ({ perform }, value: string | Date) => + fillIn: async ({ perform }, value: string | Date) => perform((element) => { setValue(element, typeof value == "string" ? value : value.toISOString().replace(/T.*$/, "")); dispatchChange(element); diff --git a/packages/material-ui/src/datetime-field.ts b/packages/material-ui/src/datetime-field.ts index 1e184eda..e8010c5b 100644 --- a/packages/material-ui/src/datetime-field.ts +++ b/packages/material-ui/src/datetime-field.ts @@ -5,7 +5,7 @@ const DateTimeFieldInteractor = TextField.extend("DateTimeFiel .selector('input[type="datetime-local"]') .filters({ timestamp: (element) => element.valueAsNumber }) .actions({ - fillIn: ({ perform }, value: string | Date) => + fillIn: async ({ perform }, value: string | Date) => perform((element) => { setValue(element, typeof value == "string" ? value : value.toISOString().replace(/Z$/, "")); dispatchChange(element); diff --git a/packages/material-ui/src/dialog.ts b/packages/material-ui/src/dialog.ts index dfb6d6a1..a4186aba 100644 --- a/packages/material-ui/src/dialog.ts +++ b/packages/material-ui/src/dialog.ts @@ -11,7 +11,7 @@ const DialogInteractor = HTML.extend("MUIDialog") return isHTMLElement(titleElement) ? innerText(titleElement) : ""; }) .actions({ - close: ({ perform }) => + close: async ({ perform }) => perform((element) => { let backdrop = element.querySelector('[class*="MuiBackdrop-root"]'); if (isHTMLElement(backdrop)) click(backdrop); diff --git a/packages/material-ui/stories/accordion.stories.tsx b/packages/material-ui/stories/accordion.stories.tsx new file mode 100644 index 00000000..8b977504 --- /dev/null +++ b/packages/material-ui/stories/accordion.stories.tsx @@ -0,0 +1,71 @@ +import { ComponentMeta, ComponentStoryObj } from '@storybook/react' +import { Accordion, matching, some } from "../src"; +import { + Accordion as Component, + AccordionSummary, + AccordionDetails, + AccordionActions, + Button +} from "@material-ui/core"; +import { renderComponent } from "./helpers"; +import { cloneElement } from "react"; + +export default { + title: 'Accordion', + component: renderComponent(Component, {}, ({ props, children }) => ( + cloneElement( + children(props), + {}, + Expand, + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Suspendisse malesuada lacus ex, sit amet blandit leo lobortis eget. + , + + + + ) + )) +} as ComponentMeta + +const accordion = Accordion("accordion"); + +export const Default: ComponentStoryObj = { + async play() { + await accordion.exists(); + await accordion.is({ expanded: false }) + await accordion.has({ classList: some(matching(/MuiAccordion-root(-\d+)?/)) }) + await Accordion({ disabled: false }).exists() + } +} + +export const TestExpandAction: ComponentStoryObj = { + async play() { + await accordion.expand() + await accordion.is({ expanded: true }) + } +} + +export const TestCollapseAction: ComponentStoryObj = { + async play() { + await accordion.expand() + await accordion.collapse() + await accordion.is({ expanded: false }) + } +} + +export const TestToggleAction: ComponentStoryObj = { + async play() { + await accordion.toggle() + await accordion.is({ expanded: true }) + await accordion.toggle() + await accordion.is({ expanded: false }) + } +} + +export const Disabled: ComponentStoryObj = { + args: { disabled: true }, + async play() { + await Accordion({ disabled: true }).exists() + } +} diff --git a/packages/material-ui/stories/bottom-navigation.stories.tsx b/packages/material-ui/stories/bottom-navigation.stories.tsx new file mode 100644 index 00000000..1563f6e6 --- /dev/null +++ b/packages/material-ui/stories/bottom-navigation.stories.tsx @@ -0,0 +1,38 @@ +import { cloneElement, useState } from "react"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; +import { Restore, Favorite, LocationOn } from "@material-ui/icons"; +import { BottomNavigation as Component, BottomNavigationAction } from "@material-ui/core"; +import { BottomNavigation } from "../src"; +import { renderComponent } from "./helpers"; + +export default { + title: "BottomNavigation", + component: renderComponent(Component, {}, ({ props, children }) => { + let [value, setValue] = useState(0); + + return cloneElement( + children(props), + { value, onChange: (_: unknown, newValue: number) => setValue(newValue) }, + ...[ + } />, + } />, + } />, + ] + ); + }), +} as ComponentMeta; + +const bottomNavigation = BottomNavigation(); + +export const Default: ComponentStoryObj = { + async play() { + await bottomNavigation.has({ value: "Recents" }); + }, +}; + +export const NavigateAction: ComponentStoryObj = { + async play() { + await bottomNavigation.navigate("Favorites"); + await bottomNavigation.has({ value: "Favorites" }); + }, +}; diff --git a/packages/material-ui/stories/button.stories.tsx b/packages/material-ui/stories/button.stories.tsx new file mode 100644 index 00000000..2a7205b1 --- /dev/null +++ b/packages/material-ui/stories/button.stories.tsx @@ -0,0 +1,271 @@ +import { Button, including, not, HTML } from "../src"; +import { Button as Component } from "@material-ui/core"; +import { renderComponent } from "./helpers"; +import { ComponentProps } from "react"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; + +export default { + title: "Button", + component: renderComponent(Component, { children: "My Button" }), +} as ComponentMeta; + +const button = Button(including("My Button".toUpperCase())); + +export const Default: ComponentStoryObj = { + async play() { + await button.exists(); + await button.has({ text: "My Button".toUpperCase() }); + await button.has({ className: including("MuiButton-root") }); + await button.has({ className: including("MuiButton-text") }); + await button.has({ className: not(including("MuiButton-textSecondary")) }); + await button.has({ className: not(including("MuiButton-outlined")) }); + await button.has({ className: not(including("MuiButton-contained")) }); + }, +}; + +export const Secondary: ComponentStoryObj = { + args: { color: "secondary" }, + async play() { + await button.has({ className: including("MuiButton-root") }); + await button.has({ className: including("MuiButton-text") }); + await button.has({ className: not(including("MuiButton-contained")) }); + await button.has({ className: not(including("MuiButton-textPrimary")) }); + }, +}; + +export const Outlined: ComponentStoryObj = { + args: { variant: "outlined" }, + async play() { + await button.has({ className: including("MuiButton-outlined") }); + await button.has({ className: not(including("MuiButton-text")) }); + await button.has({ className: not(including("MuiButton-contained")) }); + }, +}; + +export const PrimaryOutlined: ComponentStoryObj = { + args: { variant: "outlined", color: "primary" }, + async play() { + await button.has({ className: including("MuiButton-outlined") }); + await button.has({ className: including("MuiButton-outlinedPrimary") }); + }, +}; + +export const SecondaryOutlined: ComponentStoryObj = { + args: { variant: "outlined", color: "secondary" }, + async play() { + await button.has({ className: including("MuiButton-outlined") }); + await button.has({ className: including("MuiButton-outlinedSecondary") }); + }, +}; + +export const InheritOutlined: ComponentStoryObj = { + args: { variant: "outlined", color: "inherit" }, + async play() { + await button.has({ className: including("MuiButton-root") }); + await button.has({ className: including("MuiButton-outlined") }); + await button.has({ className: including("MuiButton-colorInherit") }); + await button.has({ className: not(including("MuiButton-text")) }); + await button.has({ className: not(including("MuiButton-textSecondary")) }); + await button.has({ className: not(including("MuiButton-contained")) }); + }, +}; + +export const Contained: ComponentStoryObj = { + args: { variant: "contained" }, + async play() { + await button.has({ className: including("MuiButton-root") }); + await button.has({ className: including("MuiButton-contained") }); + await button.has({ className: not(including("MuiButton-textPrimary")) }); + await button.has({ className: not(including("MuiButton-textSecondary")) }); + }, +}; + +export const ContainedPrimary: ComponentStoryObj = { + args: { variant: "contained", color: "primary" }, + async play() { + await button.has({ className: including("MuiButton-root") }); + await button.has({ className: including("MuiButton-contained") }); + await button.has({ className: including("MuiButton-containedPrimary") }); + await button.has({ className: not(including("MuiButton-text")) }); + await button.has({ className: not(including("MuiButton-containedSecondary")) }); + }, +}; + +export const ContainedSecondary: ComponentStoryObj = { + args: { variant: "contained", color: "secondary" }, + async play() { + await button.has({ className: including("MuiButton-root") }); + await button.has({ className: including("MuiButton-contained") }); + await button.has({ className: including("MuiButton-containedSecondary") }); + await button.has({ className: not(including("MuiButton-text")) }); + await button.has({ className: not(including("MuiButton-containedPrimary")) }); + }, +}; + +export const SmallText: ComponentStoryObj = { + args: { size: "small" }, + async play() { + await button.has({ className: including("MuiButton-root") }); + await button.has({ className: including("MuiButton-text") }); + await button.has({ className: including("MuiButton-textSizeSmall") }); + await button.has({ className: not(including("MuiButton-textSizeLarge")) }); + await button.has({ className: not(including("MuiButton-outlinedSizeSmall")) }); + await button.has({ className: not(including("MuiButton-outlinedSizeLarge")) }); + await button.has({ className: not(including("MuiButton-containedSizeSmall")) }); + await button.has({ className: not(including("MuiButton-containedSizeLarge")) }); + }, +}; + +export const LargeText: ComponentStoryObj = { + args: { size: "large" }, + async play() { + await button.has({ className: including("MuiButton-root") }); + await button.has({ className: including("MuiButton-text") }); + await button.has({ className: including("MuiButton-textSizeLarge") }); + await button.has({ className: not(including("MuiButton-textSizeSmall")) }); + await button.has({ className: not(including("MuiButton-outlinedSizeSmall")) }); + await button.has({ className: not(including("MuiButton-outlinedSizeLarge")) }); + await button.has({ className: not(including("MuiButton-containedSizeSmall")) }); + await button.has({ className: not(including("MuiButton-containedSizeLarge")) }); + }, +}; + +export const SmallOutlined: ComponentStoryObj = { + args: { variant: "outlined", size: "small" }, + async play() { + await button.has({ className: including("MuiButton-root") }); + await button.has({ className: including("MuiButton-outlined") }); + await button.has({ className: including("MuiButton-outlinedSizeSmall") }); + await button.has({ className: not(including("MuiButton-textSizeSmall")) }); + await button.has({ className: not(including("MuiButton-outlinedSizeLarge")) }); + await button.has({ className: not(including("MuiButton-containedSizeSmall")) }); + await button.has({ className: not(including("MuiButton-containedSizeLarge")) }); + }, +}; + +export const LargeOutlined: ComponentStoryObj = { + args: { variant: "outlined", size: "large" }, + async play() { + await button.has({ className: including("MuiButton-root") }); + await button.has({ className: including("MuiButton-outlined") }); + await button.has({ className: including("MuiButton-outlinedSizeLarge") }); + await button.has({ className: not(including("MuiButton-textSizeSmall")) }); + await button.has({ className: not(including("MuiButton-textSizeLarge")) }); + await button.has({ className: not(including("MuiButton-outlinedSizeSmall")) }); + await button.has({ className: not(including("MuiButton-containedSizeLarge")) }); + await button.has({ className: not(including("MuiButton-containedSizeSmall")) }); + }, +}; + +export const SmallContained: ComponentStoryObj = { + args: { variant: "contained", size: "small" }, + async play() { + await button.has({ className: including("MuiButton-root") }); + await button.has({ className: including("MuiButton-contained") }); + await button.has({ className: including("MuiButton-containedSizeSmall") }); + await button.has({ className: not(including("MuiButton-textSizeSmall")) }); + await button.has({ className: not(including("MuiButton-textSizeLarge")) }); + await button.has({ className: not(including("MuiButton-outlinedSizeSmall")) }); + await button.has({ className: not(including("MuiButton-outlinedSizeLarge")) }); + await button.has({ className: not(including("MuiButton-containedSizeLarge")) }); + }, +}; + +export const LargeContained: ComponentStoryObj = { + args: { variant: "contained", size: "large" }, + async play() { + await button.has({ className: including("MuiButton-root") }); + await button.has({ className: including("MuiButton-contained") }); + await button.has({ className: including("MuiButton-containedSizeLarge") }); + await button.has({ className: not(including("MuiButton-textSizeSmall")) }); + await button.has({ className: not(including("MuiButton-textSizeLarge")) }); + await button.has({ className: not(including("MuiButton-outlinedSizeSmall")) }); + await button.has({ className: not(including("MuiButton-outlinedSizeLarge")) }); + await button.has({ className: not(including("MuiButton-containedSizeSmall")) }); + }, +}; + +export const StartIcon: ComponentStoryObj = { + args: { startIcon: icon }, + async play() { + await button.has({ className: including("MuiButton-root") }); + await button.has({ className: including("MuiButton-text") }); + await button.find(HTML({ className: including("MuiButton-startIcon") })).exists(); + await button.find(HTML({ className: not(including("MuiButton-endIcon")) })).exists(); + }, +}; + +export const EndIcon: ComponentStoryObj = { + args: { endIcon: icon }, + async play() { + await button.has({ className: including("MuiButton-root") }); + await button.has({ className: including("MuiButton-text") }); + await button.find(HTML({ className: including("MuiButton-endIcon") })).exists(); + await button.find(HTML({ className: not(including("MuiButton-startIcon")) })).exists(); + }, +}; + +export const Ripple: ComponentStoryObj = { + args: { TouchRippleProps: { className: "touch-ripple" } }, + async play() { + await button.find(HTML({ className: including("touch-ripple") })).exists(); + }, +}; + +export const DisableRipple: ComponentStoryObj = { + args: { disableRipple: true, TouchRippleProps: { className: "touch-ripple" } }, + async play() { + await button.find(HTML({ className: including("touch-ripple") })).absent(); + }, +}; + +export const DisableElevation: ComponentStoryObj = { + args: { disableElevation: true }, + async play() { + await button.has({ className: including("MuiButton-disableElevation") }); + }, +}; + +export const FocusRipple: ComponentStoryObj = { + args: { TouchRippleProps: { classes: { ripplePulsate: "pulstat-focus-visible" } } }, + async play() { + await button.focus(); + await button.find(HTML({ className: including("pulstat-focus-visible") })).exists(); + }, +}; + +export const DisableFocusRipple: ComponentStoryObj = { + args: { + disableFocusRipple: true, + TouchRippleProps: { classes: { ripplePulsate: "pulstat-focus-visible" } }, + }, + async play() { + await button.focus(); + await button.find(HTML({ className: including("MuiTouchRipple-rippleVisible") })).absent(); + }, +}; + +export const Anchor: ComponentStoryObj = { + args: { href: "https://google.com" }, + async play() { + await button.has({ + className: including("MuiButton-root"), + href: including("https://google.com"), + }); + }, +}; + +export const ForwardClasses: ComponentStoryObj = { + args: { disabled: true, classes: { disabled: "disabledClassName" } }, + async play() { + await Button({ disabled: true }).has({ className: including("disabledClassName"), disabled: true }); + }, +}; + +export const Span: ComponentStoryObj = { + args: { component: "span" } as ComponentProps, + async play() { + await button.exists(); + await HTML.selector("span")({ className: including("MuiButton-root") }).exists(); + }, +}; diff --git a/packages/material-ui/stories/calendar.stories.tsx b/packages/material-ui/stories/calendar.stories.tsx new file mode 100644 index 00000000..5cb9216a --- /dev/null +++ b/packages/material-ui/stories/calendar.stories.tsx @@ -0,0 +1,117 @@ +import { Calendar as Component } from "@material-ui/pickers"; +import { Calendar, createCalendar } from "../src"; +import { renderPickerComponent } from "./helpers"; +import DateFnsUtils from "@date-io/date-fns"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; + +export default { + title: "Calendar", + component: renderPickerComponent(Component), +} as ComponentMeta; + +const CalendarWithUtils = createCalendar(new DateFnsUtils()); +const calendar = Calendar("18 August 2014"); + +export const Default: ComponentStoryObj = { + async play() { + await calendar.exists(); + await calendar.has({ title: "August 2014" }); + await calendar.has({ month: "August" }); + await calendar.has({ year: 2014 }); + await calendar.has({ day: 18 }); + await calendar.has({ weekDay: "Mo" }); + await CalendarWithUtils({ date: new Date("2014-08-18T00:00:00.000Z") }).exists(); + }, +}; + +export const NextMonthAction: ComponentStoryObj = { + async play() { + await calendar.nextMonth(); + await Calendar().has({ title: "September 2014" }); + }, +}; + +export const PrevMonthAction: ComponentStoryObj = { + async play() { + await calendar.prevMonth(); + await Calendar().has({ title: "July 2014" }); + }, +}; + +export const SetYearActionFuture: ComponentStoryObj = { + async play() { + // NOTE: Using here `Calendar("18 August 2014")` leads to issue where the second nextMonth step throws NoSuchElementError + await Calendar().setYear(2015); + await Calendar().has({ title: "August 2015" }); + }, +}; + +export const SetYearActionPast: ComponentStoryObj = { + async play() { + await Calendar().setYear(2013); + await Calendar().has({ title: "August 2013" }); + }, +}; + +export const SetMonthActionFuture: ComponentStoryObj = { + async play() { + await Calendar().setMonth("September"); + await Calendar().has({ title: "September 2014" }); + }, +}; + +export const SetMonthActionPast: ComponentStoryObj = { + async play() { + await Calendar().setMonth("July"); + await Calendar().has({ title: "July 2014" }); + }, +}; + +export const SetMonthActionFutureWithUtils: ComponentStoryObj = { + async play() { + await CalendarWithUtils().setMonth("September"); + await Calendar().has({ title: "September 2014" }); + }, +}; + +export const SetMonthActionPastWithUtils: ComponentStoryObj = { + async play() { + await CalendarWithUtils().setMonth("July"); + await Calendar().has({ title: "July 2014" }); + }, +}; + +export const SetDayAction: ComponentStoryObj = { + async play() { + await calendar.setDay(15); + await Calendar("15 August 2014").exists(); + }, +}; + +export const SetDayActionCustomDayRender: ComponentStoryObj = { + args: { + renderDay: (day, _selectedDate, dayInCurrentMonth) => , + }, + async play() { + await Calendar().setDay(20); + // NOTE There is no way to filter by selected day with a fully custom day render + // But we still be able do day clicks, just can't test it ¯\_(ツ)_/¯ + await Calendar("August 2014").exists(); + }, +}; + +export const NextMonthActionCustomIcon: ComponentStoryObj = { + args: { rightArrowIcon: }, + async play() { + await calendar.nextMonth(); + await Calendar().has({ title: "September 2014" }); + }, +}; + +export const PrevMonthActionCustomIcon: ComponentStoryObj = { + args: { leftArrowIcon: }, + async play() { + await calendar.prevMonth(); + await Calendar().has({ title: "July 2014" }); + }, +}; diff --git a/packages/material-ui/stories/checkbox.stories.tsx b/packages/material-ui/stories/checkbox.stories.tsx new file mode 100644 index 00000000..b73bd6b0 --- /dev/null +++ b/packages/material-ui/stories/checkbox.stories.tsx @@ -0,0 +1,107 @@ +import { Body } from "../src/body"; +import { Checkbox } from "../src"; +import { Checkbox as Component, FormControlLabel } from "@material-ui/core"; +import { renderComponent } from "./helpers"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; + +export default { + title: "Checkbox", + component: renderComponent(Component, {}, ({ props, children }) => ( + + )), +} as ComponentMeta; + +const checkbox = Checkbox("checkbox"); + +export const Default: ComponentStoryObj = { + async play() { + await checkbox.exists() + await checkbox.is({ checked: false }) + await checkbox.is({ focused: false }) + await Checkbox({ disabled: false }).exists() + } +} + +export const ClickAction: ComponentStoryObj = { + async play() { + await checkbox.click() + await checkbox.is({ checked: true, focused: true }) + } +} + +export const FocusAction: ComponentStoryObj = { + async play() { + await checkbox.focus() + await checkbox.is({ focused: true }) + } +} + +export const CheckAction: ComponentStoryObj = { + async play() { + await checkbox.check() + await checkbox.is({ checked: true }) + } +} + +export const ToggleAction: ComponentStoryObj = { + async play() { + await checkbox.toggle() + await checkbox.is({ checked: true }) + await checkbox.toggle() + await checkbox.is({ checked: false }) + } +} + +export const Indeterminate: ComponentStoryObj = { + args: { indeterminate: true }, + async play() { + await checkbox.is({ indeterminate: true }) + } +} + +export const Checked: ComponentStoryObj = { + render: () => } />, + async play() { + await checkbox.is({ checked: true }) + } +} + +export const Disabled: ComponentStoryObj = { + render: () => } />, + async play() { + await Checkbox({ disabled: true }).exists() + } +} + +export const Visible: ComponentStoryObj = { + render: () => , + async play() { + await Checkbox({ visible: false }).exists() + } +} + +export const UncheckAction: ComponentStoryObj = { + args: { defaultChecked: true }, + async play() { + await checkbox.uncheck() + await checkbox.is({ checked: false }) + } +} + +export const BlurActionAutoFocus: ComponentStoryObj = { + args: { autoFocus: true }, + async play() { + await checkbox.is({ focused: true }) + await checkbox.blur() + await checkbox.is({ focused: false }) + } +} + +export const BodyClickAutoFocus: ComponentStoryObj = { + args: { autoFocus: true }, + async play() { + await checkbox.is({ focused: true }) + await Body().click() + await checkbox.is({ focused: false }) + } +} diff --git a/packages/material-ui/stories/accordion.tsx b/packages/material-ui/stories/components/accordion.tsx similarity index 100% rename from packages/material-ui/stories/accordion.tsx rename to packages/material-ui/stories/components/accordion.tsx diff --git a/packages/material-ui/stories/bottom-navigation.tsx b/packages/material-ui/stories/components/bottom-navigation.tsx similarity index 100% rename from packages/material-ui/stories/bottom-navigation.tsx rename to packages/material-ui/stories/components/bottom-navigation.tsx diff --git a/packages/material-ui/stories/button.tsx b/packages/material-ui/stories/components/button.tsx similarity index 100% rename from packages/material-ui/stories/button.tsx rename to packages/material-ui/stories/components/button.tsx diff --git a/packages/material-ui/stories/calendar.tsx b/packages/material-ui/stories/components/calendar.tsx similarity index 100% rename from packages/material-ui/stories/calendar.tsx rename to packages/material-ui/stories/components/calendar.tsx diff --git a/packages/material-ui/stories/checkbox.tsx b/packages/material-ui/stories/components/checkbox.tsx similarity index 100% rename from packages/material-ui/stories/checkbox.tsx rename to packages/material-ui/stories/components/checkbox.tsx diff --git a/packages/material-ui/stories/data-field.tsx b/packages/material-ui/stories/components/data-field.tsx similarity index 100% rename from packages/material-ui/stories/data-field.tsx rename to packages/material-ui/stories/components/data-field.tsx diff --git a/packages/material-ui/stories/datatime-field.tsx b/packages/material-ui/stories/components/datatime-field.tsx similarity index 100% rename from packages/material-ui/stories/datatime-field.tsx rename to packages/material-ui/stories/components/datatime-field.tsx diff --git a/packages/material-ui/stories/dialog.tsx b/packages/material-ui/stories/components/dialog.tsx similarity index 100% rename from packages/material-ui/stories/dialog.tsx rename to packages/material-ui/stories/components/dialog.tsx diff --git a/packages/material-ui/stories/fab.tsx b/packages/material-ui/stories/components/fab.tsx similarity index 100% rename from packages/material-ui/stories/fab.tsx rename to packages/material-ui/stories/components/fab.tsx diff --git a/packages/material-ui/stories/components/index.ts b/packages/material-ui/stories/components/index.ts new file mode 100644 index 00000000..f1abf234 --- /dev/null +++ b/packages/material-ui/stories/components/index.ts @@ -0,0 +1,21 @@ +export { SimpleAccordion } from "./accordion"; +export { SimpleBottomNavigation } from "./bottom-navigation"; +export { ContainedButtons } from "./button"; +export { StaticDatePicker } from "./calendar"; +export { CheckboxLabels } from "./checkbox"; +export { DateFields } from "./data-field"; +export { DateTimeFields } from "./datatime-field"; +export { FormDialog } from "./dialog"; +export { FloatingActionButtons } from "./fab"; +export { Links } from "./link"; +export { NestedList } from "./list"; +export { SimpleMenu } from "./menu"; +export { SimplePopover } from "./popover"; +export { RadioButtonsGroup } from "./radio"; +export { SimpleSelect } from "./select"; +export { Sliders } from "./slider"; +export { SimpleSnackbar } from "./snackbar"; +export { SwitchLabels } from "./switch"; +export { SimpleTabs } from "./tabs"; +export { BasicTextFields } from "./text-field"; +export { TimePickers } from "./time-field"; diff --git a/packages/material-ui/stories/link.tsx b/packages/material-ui/stories/components/link.tsx similarity index 100% rename from packages/material-ui/stories/link.tsx rename to packages/material-ui/stories/components/link.tsx diff --git a/packages/material-ui/stories/list.tsx b/packages/material-ui/stories/components/list.tsx similarity index 100% rename from packages/material-ui/stories/list.tsx rename to packages/material-ui/stories/components/list.tsx diff --git a/packages/material-ui/stories/menu.tsx b/packages/material-ui/stories/components/menu.tsx similarity index 100% rename from packages/material-ui/stories/menu.tsx rename to packages/material-ui/stories/components/menu.tsx diff --git a/packages/material-ui/stories/popover.tsx b/packages/material-ui/stories/components/popover.tsx similarity index 100% rename from packages/material-ui/stories/popover.tsx rename to packages/material-ui/stories/components/popover.tsx diff --git a/packages/material-ui/stories/radio.tsx b/packages/material-ui/stories/components/radio.tsx similarity index 100% rename from packages/material-ui/stories/radio.tsx rename to packages/material-ui/stories/components/radio.tsx diff --git a/packages/material-ui/stories/select.tsx b/packages/material-ui/stories/components/select.tsx similarity index 100% rename from packages/material-ui/stories/select.tsx rename to packages/material-ui/stories/components/select.tsx diff --git a/packages/material-ui/stories/slider.tsx b/packages/material-ui/stories/components/slider.tsx similarity index 100% rename from packages/material-ui/stories/slider.tsx rename to packages/material-ui/stories/components/slider.tsx diff --git a/packages/material-ui/stories/snackbar.tsx b/packages/material-ui/stories/components/snackbar.tsx similarity index 100% rename from packages/material-ui/stories/snackbar.tsx rename to packages/material-ui/stories/components/snackbar.tsx diff --git a/packages/material-ui/stories/switch.tsx b/packages/material-ui/stories/components/switch.tsx similarity index 100% rename from packages/material-ui/stories/switch.tsx rename to packages/material-ui/stories/components/switch.tsx diff --git a/packages/material-ui/stories/tabs.tsx b/packages/material-ui/stories/components/tabs.tsx similarity index 100% rename from packages/material-ui/stories/tabs.tsx rename to packages/material-ui/stories/components/tabs.tsx diff --git a/packages/material-ui/stories/text-field.tsx b/packages/material-ui/stories/components/text-field.tsx similarity index 100% rename from packages/material-ui/stories/text-field.tsx rename to packages/material-ui/stories/components/text-field.tsx diff --git a/packages/material-ui/stories/time-field.tsx b/packages/material-ui/stories/components/time-field.tsx similarity index 100% rename from packages/material-ui/stories/time-field.tsx rename to packages/material-ui/stories/components/time-field.tsx diff --git a/packages/material-ui/stories/date-field.stories.tsx b/packages/material-ui/stories/date-field.stories.tsx new file mode 100644 index 00000000..6276d200 --- /dev/null +++ b/packages/material-ui/stories/date-field.stories.tsx @@ -0,0 +1,58 @@ +import { TextField as Component } from "@material-ui/core"; +import { DateField, matching, some } from "../src"; +import { renderComponent } from "./helpers"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; + +export default { + title: "DateField", + component: renderComponent(Component, { id: "datefield", label: "datefield", type: "date" }), +} as ComponentMeta; + +const datefield = DateField("datefield"); + +export const Default: ComponentStoryObj = { + async play() { + await datefield.has({ value: "" }); + await datefield.has({ classList: some(matching(/MuiInput-input(-\d+)?/)) }); + }, +}; + +export const FillInActionString: ComponentStoryObj = { + async play() { + await datefield.fillIn("2014-08-18"); + await datefield.has({ value: "2014-08-18" }); + await datefield.has({ date: new Date("2014-08-18") }); + await datefield.has({ timestamp: new Date("2014-08-18").getTime() }); + }, +}; + +export const FillInActionDate: ComponentStoryObj = { + async play() { + await datefield.fillIn(new Date("2014-08-18")); + await datefield.has({ value: "2014-08-18" }); + }, +}; + +export const FillInActionWithMinMax: ComponentStoryObj = { + args: { inputProps: { min: "2013-07-15", max: "2015-09-21" } }, + async play() { + await datefield.fillIn("2014-08-18"); + await datefield.has({ value: "2014-08-18" }); + }, +}; + +export const FillInActionBelowMin: ComponentStoryObj = { + args: { inputProps: { min: "2013-07-15", max: "2015-09-21" } }, + async play() { + await datefield.fillIn("2012-06-13"); + await datefield.has({ value: "2012-06-13" }); + }, +}; + +export const FillInActionAboveMax: ComponentStoryObj = { + args: { inputProps: { min: "2013-07-15", max: "2015-09-21" } }, + async play() { + await datefield.fillIn("2016-10-26"); + await datefield.has({ value: "2016-10-26" }); + }, +}; diff --git a/packages/material-ui/stories/datetime-field.stories.tsx b/packages/material-ui/stories/datetime-field.stories.tsx new file mode 100644 index 00000000..a273b964 --- /dev/null +++ b/packages/material-ui/stories/datetime-field.stories.tsx @@ -0,0 +1,51 @@ +import { TextField as Component } from "@material-ui/core"; +import { DateTimeField, matching, some } from "../src"; +import { renderComponent } from "./helpers"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; + +export default { + title: "DateTimeField", + component: renderComponent(Component, { + id: "datetimefield", + label: "datetimefield", + type: "datetime-local", + }), +} as ComponentMeta; + +const datetimefield = DateTimeField("datetimefield"); + +export const Default: ComponentStoryObj = { + async play() { + await datetimefield.has({ value: "" }); + await datetimefield.has({ classList: some(matching(/MuiInput-input(-\d+)?/)) }); + }, +}; + +export const FillInActionString: ComponentStoryObj = { + async play() { + await datetimefield.fillIn("2014-08-18T09:13:37.512"); + await datetimefield.has({ value: "2014-08-18T09:13:37.512" }); + await datetimefield.has({ timestamp: new Date("2014-08-18T09:13:37.512Z").getTime() }); + }, +}; + +export const FillInActionDate: ComponentStoryObj = { + async play() { + await datetimefield.fillIn(new Date("2014-08-18T09:13:37.512Z")); + await datetimefield.has({ value: "2014-08-18T09:13:37.512" }); + }, +}; + +export const FillInActionWithoutSeconds: ComponentStoryObj = { + async play() { + await datetimefield.fillIn("2014-08-18T09:13"); + await datetimefield.has({ value: "2014-08-18T09:13" }); + }, +}; + +export const FillInActionWithSeconds: ComponentStoryObj = { + async play() { + await datetimefield.fillIn("2014-08-18T09:13:37"); + await datetimefield.has({ value: "2014-08-18T09:13:37" }); + }, +}; diff --git a/packages/material-ui/stories/dialog.stories.tsx b/packages/material-ui/stories/dialog.stories.tsx new file mode 100644 index 00000000..0f49a0d9 --- /dev/null +++ b/packages/material-ui/stories/dialog.stories.tsx @@ -0,0 +1,53 @@ +import { Button, Dialog, matching, some, including } from "../src"; +import { + Button as ButtonComponent, + Dialog as Component, + DialogActions, + DialogContent, + DialogTitle, +} from "@material-ui/core"; +import { renderComponent } from "./helpers"; +import { cloneElement, useCallback, useState } from "react"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; + +export default { + title: "Dialog", + component: renderComponent( + Component, + { + "aria-labelledby": "dialog-title", + }, + ({ props, children }) => { + let [open, setOpen] = useState(true); + let onClose = useCallback(() => setOpen(false), []); + + return cloneElement( + children(props), + { open, onClose }, + dialog, + Content, + + Save + + ); + } + ), +} as ComponentMeta; + +const dialog = Dialog("dialog"); + +export const Default: ComponentStoryObj = { + async play() { + await dialog.exists(); + await dialog.has({ text: including("Content") }); + await dialog.has({ classList: some(matching(/MuiDialog-root(-\d+)?/)) }); + await dialog.find(Button("Save".toUpperCase())).exists(); + }, +}; + +export const CloseAction: ComponentStoryObj = { + async play() { + await dialog.close(); + await Dialog("dialog").absent(); + }, +}; diff --git a/packages/material-ui/stories/docs.stories.mdx b/packages/material-ui/stories/docs.stories.mdx index 0d2dd5d0..a18d8f52 100644 --- a/packages/material-ui/stories/docs.stories.mdx +++ b/packages/material-ui/stories/docs.stories.mdx @@ -21,10 +21,10 @@ import { Tabs, TextField, TimeField, -} from "./interactors.stories"; +} from "./showcase.stories"; import { InteractiveStory as Story } from "./interactive-story"; - + diff --git a/packages/material-ui/stories/fab.stories.tsx b/packages/material-ui/stories/fab.stories.tsx new file mode 100644 index 00000000..61a1f71b --- /dev/null +++ b/packages/material-ui/stories/fab.stories.tsx @@ -0,0 +1,44 @@ +import { Fab, including, HTML, some, matching } from "../src"; +import { Fab as Component, Icon } from "@material-ui/core"; +import { Add } from "@material-ui/icons"; +import { renderComponent } from "./helpers"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; + +export default { + title: "Fab", + component: renderComponent(Component, { children: "My Fab" }), +} as ComponentMeta; + +const fab = Fab("My Fab".toUpperCase()); +const Span = HTML.selector("span"); + +export const Default: ComponentStoryObj = { + async play() { + await fab.exists(); + await fab.has({ classList: some(matching(/MuiFab-root(-\d+)?/)) }); + await fab.has({ text: "My Fab".toUpperCase() }); + }, +}; + +export const Extended: ComponentStoryObj = { + args: { variant: "extended" }, + async play() { + await fab.has({ className: including("MuiFab-extended") }); + }, +}; + +export const WithIcon: ComponentStoryObj = { + args: { children: }, + async play() { + await Fab() + .find(Span({ className: including("child-woof") })) + .exists(); + }, +}; + +export const WithAriaLabel: ComponentStoryObj = { + args: { color: "primary", "aria-label": "add", children: }, + async play() { + await Fab("add").has({ svgIcon: true }); + }, +}; diff --git a/packages/material-ui/stories/form-control.stories.tsx b/packages/material-ui/stories/form-control.stories.tsx new file mode 100644 index 00000000..166a87a9 --- /dev/null +++ b/packages/material-ui/stories/form-control.stories.tsx @@ -0,0 +1,62 @@ +import { FormControl, matching, some, Switch } from "../src"; +import { + FormControl as Component, + InputLabel, + FormHelperText, + Switch as SwitchComponent, + FormControlLabel, +} from "@material-ui/core"; +import { renderComponent } from "./helpers"; +import { cloneElement, useCallback, useState } from "react"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; + +export default { + title: "FormControl", + component: renderComponent(Component, {}, ({ props, children }) => { + let [error, setError] = useState(false); + let onChange = useCallback( + (_event: React.ChangeEvent, checked: boolean) => setError(checked), + [] + ); + + return cloneElement( + children(props), + { error }, + Toggler, + + } + label="Switch" + />, + {error ? "Error" : "Toggle error"} + ); + }), +} as ComponentMeta; + +const formControl = FormControl("Toggler"); + +export const Default: ComponentStoryObj = { + async play() { + await formControl.exists(); + await formControl.is({ valid: true }); + await formControl.has({ classList: some(matching(/MuiFormControl-root(-\d+)?/)) }); + await formControl.has({ description: "Toggle error" }); + await formControl.find(Switch("Switch")).exists(); + }, +}; + +export const InvalidForm: ComponentStoryObj = { + async play() { + await formControl.find(Switch("Switch")).toggle(); + await formControl.is({ valid: false }); + await formControl.has({ description: "Error" }); + }, +}; diff --git a/packages/material-ui/stories/helpers.tsx b/packages/material-ui/stories/helpers.tsx new file mode 100644 index 00000000..8125955e --- /dev/null +++ b/packages/material-ui/stories/helpers.tsx @@ -0,0 +1,64 @@ +import "date-fns"; +import { ComponentProps, ComponentType, ReactElement, useState } from "react"; +import { MuiPickersUtilsProvider } from "@material-ui/pickers"; +import DateFnsUtils from "@date-io/date-fns"; + + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export interface WrapperProps> { + getProps?: Partial> | ((props?: Partial>) => Partial>); + props?: Partial>; + children: (props?: Partial>) => ReactElement, CT>; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function renderComponent>( + Component: CT, + defaultProps: Partial> = {}, + Wrapper: ComponentType> = ({ getProps, children }) => + children(typeof getProps == "function" ? getProps() : getProps) +) { + return (getProps?: WrapperProps["getProps"]) => ( + + {(props) => )} />} + + ); +} + +// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any +export function renderPickerComponent>(PickerComponent: T) { + let Wrapper = ({ getProps, children }: WrapperProps) => { + let props = typeof getProps == "function" ? getProps() : getProps; + let initialDate = (props?.date ?? new Date("2014-08-18")) as Date; + let [dateValue] = initialDate + .toISOString() + .replace(/\.\d{3}Z$/, "") + .split("T"); + let [selectedDate, setSelectedDate] = useState(initialDate); + return ( + + {/* @ts-expect-error the component generic doesn't fit properly */} + {children({ + onChange: setSelectedDate, + date: selectedDate, + value: selectedDate, + id: dateValue, + label: dateValue, + ...(typeof getProps == "function" + ? getProps( + // @ts-expect-error the component generic doesn't fit properly + { onChange: setSelectedDate } + ) + : getProps), + })} + + ); + }; + + let component = renderComponent(PickerComponent, {}, Wrapper); + return ( + getProps?: + | Partial> + | ((onChange?: (date: Date) => void) => Partial>) + ) => component(typeof getProps == "function" ? ({ onChange } = {}) => getProps(onChange) : getProps); +} diff --git a/packages/material-ui/stories/icon-button.stories.tsx b/packages/material-ui/stories/icon-button.stories.tsx new file mode 100644 index 00000000..e675e36f --- /dev/null +++ b/packages/material-ui/stories/icon-button.stories.tsx @@ -0,0 +1,24 @@ +import { createInteractor, including } from "@interactors/html"; +import { Button } from "../src"; +import { IconButton as Component } from "@material-ui/core"; +import { PhotoCamera } from "@material-ui/icons"; +import { renderComponent } from "./helpers"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; + +export default { + title: "IconButton", + component: renderComponent(Component, { "aria-label": "upload picture", children: }), +} as ComponentMeta; + +const button = Button("upload picture"); + +const SVG = createInteractor("svg") + .selector("svg") + .filters({ className: (element) => element.classList.toString() }); + +export const Default: ComponentStoryObj = { + async play() { + await button.exists(); + await button.find(SVG()).has({ className: including("MuiSvgIcon-root") }); + }, +}; diff --git a/packages/material-ui/stories/link.stories.tsx b/packages/material-ui/stories/link.stories.tsx new file mode 100644 index 00000000..3e92a121 --- /dev/null +++ b/packages/material-ui/stories/link.stories.tsx @@ -0,0 +1,19 @@ +import { Link as Component } from "@material-ui/core"; +import { Link, matching, some } from "../src"; +import { renderComponent } from "./helpers"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; + +export default { + title: "Link", + component: renderComponent(Component, { children: "link", href: "https://material-ui.com/components/links/" }), +} as ComponentMeta; + +const link = Link("link"); + +export const Default: ComponentStoryObj = { + async play() { + await link.exists(); + await link.has({ classList: some(matching(/MuiLink-root(-\d+)?/)) }); + await link.has({ href: "https://material-ui.com/components/links/" }); + }, +}; diff --git a/packages/material-ui/stories/list.stories.tsx b/packages/material-ui/stories/list.stories.tsx new file mode 100644 index 00000000..0f7bcece --- /dev/null +++ b/packages/material-ui/stories/list.stories.tsx @@ -0,0 +1,29 @@ +import { List, ListItem } from "../src"; +import { List as Component, ListItem as ComponentItem } from "@material-ui/core"; +import { renderComponent } from "./helpers"; +import { cloneElement } from "react"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; + +export default { + title: "List", + component: renderComponent(Component, { "aria-label": "Three items list" }, ({ props, children }) => { + return cloneElement( + children(props), + {}, + One, + Two, + Three + ); + }), +} as ComponentMeta; + +const list = List("Three items list"); + +export const Default: ComponentStoryObj = { + async play() { + await list.exists(); + await list.find(ListItem("One")).exists(); + await list.find(ListItem("Three", { disabled: true })).exists(); + await list.find(ListItem("Two")).is({ index: 1 }); + }, +}; diff --git a/packages/material-ui/stories/menu.stories.tsx b/packages/material-ui/stories/menu.stories.tsx new file mode 100644 index 00000000..a22b5a55 --- /dev/null +++ b/packages/material-ui/stories/menu.stories.tsx @@ -0,0 +1,61 @@ +import { matching, Menu, MenuItem, MenuList, some, HTML } from "../src"; +import { Menu as Component, Button, MenuItem as ComponentItem } from "@material-ui/core"; +import { renderComponent } from "./helpers"; +import { cloneElement, MouseEvent, useState } from "react"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; + +export default { + title: "Menu", + component: renderComponent(Component, { id: "menu-id" }, ({ props, children }) => { + let [menuItem, setMenuItem] = useState("Empty"); + let [anchorEl, setAnchorEl] = useState(null); + + let handleClick = (event: MouseEvent) => setAnchorEl(event.currentTarget); + let handleClose = (event: MouseEvent) => { + setMenuItem(event.currentTarget.innerText); + setAnchorEl(null); + }; + + return ( + <> + {menuItem} + + {cloneElement( + children(props), + { open: Boolean(anchorEl), anchorEl, onClose: handleClose }, + Profile, + My account, + Logout + )} + + ); + }), +} as ComponentMeta; + +const menu = Menu("OPEN MENU"); + +export const Default: ComponentStoryObj = { + async play() { + await menu.exists(); + await HTML({ id: "menu-item" }).has({ text: "Empty" }); + }, +}; + +export const OpenAction: ComponentStoryObj = { + async play() { + await menu.open(); + await MenuList("menu-id").find(MenuItem("Logout")).exists(); + await MenuList("menu-id") + .find(MenuItem("Logout")) + .has({ classList: some(matching(/MuiMenuItem-root(-\d+)?/)) }); + }, +}; + +export const ClickAction: ComponentStoryObj = { + async play() { + await menu.click("Profile"); + await HTML({ id: "menu-item" }).has({ text: "Profile" }); + }, +}; diff --git a/packages/material-ui/stories/native-select.stories.tsx b/packages/material-ui/stories/native-select.stories.tsx new file mode 100644 index 00000000..d0b4d894 --- /dev/null +++ b/packages/material-ui/stories/native-select.stories.tsx @@ -0,0 +1,115 @@ +import { NativeSelect, NativeMultiSelect, some, matching } from "../src"; +import { Select as Component, FormControl, InputLabel } from "@material-ui/core"; +import { renderComponent } from "./helpers"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; + +const plainOptions = ( + <> + + + + +); + +export default { + title: "NativeSelect", + component: renderComponent( + Component, + { + native: true, + defaultValue: "", + inputProps: { id: "select-id" }, + children: plainOptions, + }, + ({ props, children }) => ( + + select + {children(props)} + + ) + ), +} as ComponentMeta; + +const select = NativeSelect("select"); +const multiSelect = NativeMultiSelect("select"); + +export const Default: ComponentStoryObj = { + async play() { + await select.exists(); + await select.has({ required: false }); + await select.has({ focused: false }); + await select.has({ valid: true }); + await select.has({ value: "" }); + await select.has({ classList: some(matching(/MuiSelect-root(-\d+)?/)) }); + await NativeSelect({ disabled: false }).exists(); + }, +}; + +export const FocusAction: ComponentStoryObj = { + async play() { + await select.focus(); + await select.has({ focused: true }); + }, +}; + +export const ChooseAction: ComponentStoryObj = { + async play() { + await select.choose("one"); + await select.has({ value: "one" }); + }, +}; + +export const Required: ComponentStoryObj = { + args: { required: true }, + async play() { + await select.has({ required: true }); + }, +}; + +export const DefaultMultiple: ComponentStoryObj = { + args: { multiple: true }, + async play() { + await multiSelect.exists(); + await multiSelect.has({ required: false }); + await multiSelect.has({ focused: false }); + await multiSelect.has({ valid: true }); + await multiSelect.has({ values: [] }); + await multiSelect.has({ classList: some(matching(/MuiSelect-root(-\d+)?/)) }); + await NativeMultiSelect({ disabled: false }).exists(); + }, +}; + +export const FocusActionMultiple: ComponentStoryObj = { + args: { multiple: true }, + async play() { + await multiSelect.focus(); + await multiSelect.has({ focused: true }); + }, +}; + +export const ChooseActionMultiple: ComponentStoryObj = { + args: { multiple: true }, + async play() { + await multiSelect.choose("one"); + await multiSelect.has({ values: ["one"] }); + }, +}; + +export const SelectActionMultiple: ComponentStoryObj = { + args: { multiple: true }, + async play() { + await multiSelect.select("one"); + await multiSelect.select("two"); + await multiSelect.has({ values: ["one", "two"] }); + await multiSelect.deselect("one"); + await multiSelect.has({ values: ["two"] }); + }, +}; + +export const RequiredMultiple: ComponentStoryObj = { + args: { required: true, multiple: true }, + async play() { + await multiSelect.has({ required: true }); + }, +}; diff --git a/packages/material-ui/stories/popover.stories.tsx b/packages/material-ui/stories/popover.stories.tsx new file mode 100644 index 00000000..77ed1beb --- /dev/null +++ b/packages/material-ui/stories/popover.stories.tsx @@ -0,0 +1,36 @@ +import { Popover } from "../src"; +import { Button, Popover as Component } from "@material-ui/core"; +import { renderComponent } from "./helpers"; +import { cloneElement, useRef, useState } from "react"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; + +export default { + title: "Popover", + component: renderComponent(Component, { children: "Content" }, ({ props, children }) => { + let [isOpen, setIsOpen] = useState(true); + + let buttonRef = useRef(null); + + let handleClick = () => setIsOpen(true); + let handleClose = () => setIsOpen(false); + + return ( + <> + + {cloneElement(children(props), { open: isOpen, anchorEl: buttonRef.current, onClose: handleClose })} + + ); + }), +} as ComponentMeta; + +const popover = Popover("Content"); + +export const Default: ComponentStoryObj = { + async play() { + await popover.exists(); + await popover.close(); + await popover.absent(); + }, +}; diff --git a/packages/material-ui/stories/radio.stories.tsx b/packages/material-ui/stories/radio.stories.tsx new file mode 100644 index 00000000..bff6f9d2 --- /dev/null +++ b/packages/material-ui/stories/radio.stories.tsx @@ -0,0 +1,18 @@ +import { Radio } from "../src"; +import { Radio as Component } from "@material-ui/core"; +import { renderComponent } from "./helpers"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; + +export default { + title: "Radio", + component: renderComponent(Component), +} as ComponentMeta; + +const radio = Radio(); + +export const Default: ComponentStoryObj = { + async play() { + await radio.exists(); + await radio.is({ checked: false }); + }, +}; diff --git a/packages/material-ui/stories/select.stories.tsx b/packages/material-ui/stories/select.stories.tsx new file mode 100644 index 00000000..a20b9267 --- /dev/null +++ b/packages/material-ui/stories/select.stories.tsx @@ -0,0 +1,118 @@ +import { Select, MultiSelect, some, matching } from "../src"; +import { Select as Component, FormControl, InputLabel, MenuItem, Chip, FormHelperText } from "@material-ui/core"; +import { renderComponent } from "./helpers"; +import { cloneElement } from "react"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; + +const plainOptions = [ + , + one, + two, + three, +]; + +export default { + title: "Select", + component: renderComponent( + Component, + { + id: "select-id", + labelId: "label-id", + defaultValue: "", + inputProps: { id: "input-id" }, + renderValue: (selected) => ( + <> + {(typeof selected == "string" ? [selected] : (selected as string[])).map((value) => ( + + ))} + + ), + }, + ({ props, children }) => ( + + + select + + {cloneElement(children(props), {}, ...plainOptions)} + SelectField + + ) + ), +} as ComponentMeta; + +const select = Select("select"); +const multiSelect = MultiSelect("select"); + +export const Default: ComponentStoryObj = { + async play() { + await select.exists(); + await select.has({ required: false }); + await select.has({ valid: true }); + await select.has({ value: "\u200B" }); + await select.has({ description: "SelectField" }); + await select.has({ classList: some(matching(/MuiInputBase-root(-\d+)?/)) }); + await Select({ disabled: false }).exists(); + }, +}; + +export const ChooseAction: ComponentStoryObj = { + async play() { + await select.choose("one"); + await select.has({ value: "one" }); + }, +}; + +export const Required: ComponentStoryObj = { + args: { required: true }, + async play() { + await select.has({ required: true }); + }, +}; + +export const InputPropsUndefined: ComponentStoryObj = { + args: { inputProps: undefined }, + async play() { + await select.exists(); + await select.has({ description: "SelectField" }); + }, +}; + +export const LabelIdUndefined: ComponentStoryObj = { + args: { inputProps: undefined, labelId: undefined }, + async play() { + await select.exists(); + }, +}; + +export const DefaultMultiple: ComponentStoryObj = { + args: { multiple: true, defaultValue: [] }, + async play() { + await multiSelect.exists(); + await multiSelect.has({ required: false }); + await multiSelect.has({ valid: true }); + await multiSelect.has({ values: [] }); + await multiSelect.has({ classList: some(matching(/MuiInputBase-root(-\d+)?/)) }); + await multiSelect.has({ description: "SelectField" }); + await MultiSelect({ disabled: false }).exists(); + }, +}; + +export const SelectActionMultiple: ComponentStoryObj = { + args: { multiple: true, defaultValue: [] }, + async play() { + await multiSelect.select("one"); + await multiSelect.select("two"); + await multiSelect.has({ values: ["one", "two"] }); + await multiSelect.deselect("one"); + await multiSelect.has({ values: ["two"] }); + await multiSelect.choose("three"); + await multiSelect.has({ values: ["three"] }); + }, +}; + +export const RequiredMultiple: ComponentStoryObj = { + args: { multiple: true, required: true, defaultValue: [] }, + async play() { + await multiSelect.has({ required: true }); + }, +}; diff --git a/packages/material-ui/stories/interactors.stories.tsx b/packages/material-ui/stories/showcase.stories.tsx similarity index 71% rename from packages/material-ui/stories/interactors.stories.tsx rename to packages/material-ui/stories/showcase.stories.tsx index 9aac75c6..42f946c8 100644 --- a/packages/material-ui/stories/interactors.stories.tsx +++ b/packages/material-ui/stories/showcase.stories.tsx @@ -1,4 +1,4 @@ -import { ComponentStory } from "@storybook/react"; +import { ComponentStoryObj } from "@storybook/react"; import { Accordion as AccordionInteractor, BottomNavigation as BottomNavigationInteractor, @@ -25,37 +25,36 @@ import { TextField as TextFieldInteractor, TimeField as TimeFieldInteractor, } from "../src"; -import { SimpleAccordion } from "./accordion"; -import { SimpleBottomNavigation } from "./bottom-navigation"; -import { ContainedButtons } from "./button"; -import { StaticDatePicker } from "./calendar"; -import { CheckboxLabels } from "./checkbox"; -import { DateFields } from "./data-field"; -import { DateTimeFields } from "./datatime-field"; -import { FormDialog } from "./dialog"; -import { FloatingActionButtons } from "./fab"; -import { Links } from "./link"; -import { NestedList } from "./list"; -import { SimpleMenu } from "./menu"; -import { SimplePopover } from "./popover"; -import { RadioButtonsGroup } from "./radio"; -import { SimpleSelect } from "./select"; -import { Sliders } from "./slider"; -import { SimpleSnackbar } from "./snackbar"; -import { SwitchLabels } from "./switch"; -import { SimpleTabs } from "./tabs"; -import { BasicTextFields } from "./text-field"; -import { TimePickers } from "./time-field"; - -const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); +import { + SimpleAccordion, + SimpleBottomNavigation, + ContainedButtons, + StaticDatePicker, + CheckboxLabels, + DateFields, + DateTimeFields, + FormDialog, + FloatingActionButtons, + Links, + NestedList, + SimpleMenu, + SimplePopover, + RadioButtonsGroup, + SimpleSelect, + Sliders, + SimpleSnackbar, + SwitchLabels, + SimpleTabs, + BasicTextFields, + TimePickers, +} from "./components"; -export default { title: "Interactors" }; +export default { title: "Showcase" }; -export const Accordion: ComponentStory = { +export const Accordion: ComponentStoryObj = { render: () => , async play(): Promise { await AccordionInteractor("Accordion 1").toggle(); - await delay(500); await AccordionInteractor("Accordion 2").toggle(); }, parameters: { @@ -63,18 +62,16 @@ export const Accordion: ComponentStory = { source: { code: ` await AccordionInteractor("Accordion 1").toggle(); -await delay(500); await AccordionInteractor("Accordion 2").toggle(); `, }, }, }, }; -export const BottomNavigation: ComponentStory = { +export const BottomNavigation: ComponentStoryObj = { render: () => , async play(): Promise { await BottomNavigationInteractor().navigate("Favorites"); - await delay(500); await BottomNavigationInteractor().navigate("Nearby"); }, parameters: { @@ -82,7 +79,6 @@ export const BottomNavigation: ComponentStory = { source: { code: ` await BottomNavigationInteractor().navigate("Favorites"); -await delay(500); await BottomNavigationInteractor().navigate("Nearby"); `, }, @@ -90,16 +86,12 @@ await BottomNavigationInteractor().navigate("Nearby"); }, }; -// TODO Show clicks somehow -export const Button: ComponentStory = { +export const Button: ComponentStoryObj = { render: () => , async play(): Promise { await ButtonInteractor("DEFAULT").click(); - await delay(100); await ButtonInteractor("PRIMARY").click(); - await delay(100); await ButtonInteractor("SECONDARY").click(); - await delay(100); await ButtonInteractor("LINK").click(); }, parameters: { @@ -107,11 +99,8 @@ export const Button: ComponentStory = { source: { code: ` await ButtonInteractor("DEFAULT").click(); -await delay(100); await ButtonInteractor("PRIMARY").click(); -await delay(100); await ButtonInteractor("SECONDARY").click(); -await delay(100); await ButtonInteractor("LINK").click(); `, }, @@ -119,15 +108,12 @@ await ButtonInteractor("LINK").click(); }, }; -export const Calendar: ComponentStory = { +export const Calendar: ComponentStoryObj = { render: () => , async play(): Promise { await CalendarInteractor().nextMonth(); - await delay(500); await CalendarInteractor().prevMonth(); - await delay(500); await CalendarInteractor().prevMonth(); - await delay(500); await CalendarInteractor().setDay(23); }, parameters: { @@ -135,11 +121,8 @@ export const Calendar: ComponentStory = { source: { code: ` await CalendarInteractor().nextMonth(); -await delay(500); await CalendarInteractor().prevMonth(); -await delay(500); await CalendarInteractor().prevMonth(); -await delay(500); await CalendarInteractor().setDay(23); `, }, @@ -147,21 +130,15 @@ await CalendarInteractor().setDay(23); }, }; -export const Checkbox: ComponentStory = { +export const Checkbox: ComponentStoryObj = { render: () => , async play(): Promise { await CheckboxInteractor("Secondary").click(); - await delay(500); await CheckboxInteractor("Primary").click(); - await delay(500); await CheckboxInteractor("Uncontrolled").click(); - await delay(500); await CheckboxInteractor("Indeterminate").click(); - await delay(500); await CheckboxInteractor("Custom color").click(); - await delay(500); await CheckboxInteractor("Custom icon").click(); - await delay(500); await CheckboxInteractor("Custom size").click(); }, parameters: { @@ -169,17 +146,11 @@ export const Checkbox: ComponentStory = { source: { code: ` await CheckboxInteractor("Secondary").click(); -await delay(500); await CheckboxInteractor("Primary").click(); -await delay(500); await CheckboxInteractor("Uncontrolled").click(); -await delay(500); await CheckboxInteractor("Indeterminate").click(); -await delay(500); await CheckboxInteractor("Custom color").click(); -await delay(500); await CheckboxInteractor("Custom icon").click(); -await delay(500); await CheckboxInteractor("Custom size").click(); `, }, @@ -187,7 +158,7 @@ await CheckboxInteractor("Custom size").click(); }, }; -export const DateField: ComponentStory = { +export const DateField: ComponentStoryObj = { render: () => , async play(): Promise { await DateFieldInteractor().fillIn("1999-08-17"); @@ -201,7 +172,7 @@ export const DateField: ComponentStory = { }, }; -export const DateTimeField: ComponentStory = { +export const DateTimeField: ComponentStoryObj = { render: () => , async play(): Promise { await DateTimeFieldInteractor().fillIn("1999-08-17T13:24:35"); @@ -215,11 +186,10 @@ export const DateTimeField: ComponentStory = { }, }; -export const Dialog: ComponentStory = { +export const Dialog: ComponentStoryObj = { render: () => , async play(): Promise { await ButtonInteractor("OPEN FORM DIALOG").click(); - await delay(1000); await DialogInteractor().close(); }, parameters: { @@ -227,7 +197,6 @@ export const Dialog: ComponentStory = { source: { code: ` await ButtonInteractor("OPEN FORM DIALOG").click(); -await delay(1000); await DialogInteractor().close(); `, }, @@ -235,13 +204,11 @@ await DialogInteractor().close(); }, }; -export const Fab: ComponentStory = { +export const Fab: ComponentStoryObj = { render: () => , async play(): Promise { await FabInteractor("add").click(); - await delay(100); await FabInteractor("edit").click(); - await delay(100); await FabInteractor("NAVIGATE").click(); }, parameters: { @@ -249,9 +216,7 @@ export const Fab: ComponentStory = { source: { code: ` await FabInteractor("add").click(); -await delay(100); await FabInteractor("edit").click(); -await delay(100); await FabInteractor("NAVIGATE").click(); `, }, @@ -259,13 +224,11 @@ await FabInteractor("NAVIGATE").click(); }, }; -export const Link: ComponentStory = { +export const Link: ComponentStoryObj = { render: () => , async play(): Promise { await LinkInteractor("Link").click(); - await delay(100); await LinkInteractor('color="inherit"').click(); - await delay(100); await LinkInteractor('variant="body2"').click(); }, parameters: { @@ -273,9 +236,7 @@ export const Link: ComponentStory = { source: { code: ` await LinkInteractor("Link").click(); -await delay(100); await LinkInteractor('color="inherit"').click(); -await delay(100); await LinkInteractor('variant="body2"').click(); `, }, @@ -283,11 +244,10 @@ await LinkInteractor('variant="body2"').click(); }, }; -export const List: ComponentStory = { +export const List: ComponentStoryObj = { render: () => , async play(): Promise { await ListItemInteractor("Inbox").click(); - await delay(1000); await ListItemInteractor("Inbox").click(); }, parameters: { @@ -295,7 +255,6 @@ export const List: ComponentStory = { source: { code: ` await ListItemInteractor('Inbox').click(); -await delay(1000); await ListItemInteractor('Inbox').click(); `, }, @@ -303,11 +262,10 @@ await ListItemInteractor('Inbox').click(); }, }; -export const Menu: ComponentStory = { +export const Menu: ComponentStoryObj = { render: () => , async play(): Promise { await MenuInteractor("OPEN MENU").open(); - await delay(1000); await MenuItemInteractor("Profile").click(); }, parameters: { @@ -315,7 +273,6 @@ export const Menu: ComponentStory = { source: { code: ` await MenuInteractor("OPEN MENU").open(); -await delay(1000); await MenuItemInteractor("Profile").click(); `, }, @@ -323,11 +280,10 @@ await MenuItemInteractor("Profile").click(); }, }; -export const Popover: ComponentStory = { +export const Popover: ComponentStoryObj = { render: () => , async play(): Promise { await ButtonInteractor("OPEN POPOVER").click(); - await delay(1000); await PopoverInteractor().close(); }, parameters: { @@ -335,7 +291,6 @@ export const Popover: ComponentStory = { source: { code: ` await ButtonInteractor("OPEN POPOVER").click(); -await delay(1000); await PopoverInteractor().close(); `, }, @@ -343,11 +298,10 @@ await PopoverInteractor().close(); }, }; -export const Radio: ComponentStory = { +export const Radio: ComponentStoryObj = { render: () => , async play(): Promise { await RadioInteractor("Male").choose(); - await delay(500); await RadioInteractor("Other").choose(); }, parameters: { @@ -355,7 +309,6 @@ export const Radio: ComponentStory = { source: { code: ` await RadioInteractor("Male").choose(); -await delay(500); await RadioInteractor("Other").choose(); `, }, @@ -363,19 +316,14 @@ await RadioInteractor("Other").choose(); }, }; -export const Select: ComponentStory = { +export const Select: ComponentStoryObj = { render: () => , async play(): Promise { await SelectInteractor("Age").choose("Ten"); - await delay(500); await SelectInteractor("Age").choose("Twenty"); - await delay(500); await SelectInteractor("Age").choose("Thirty"); - await delay(500); await MultiSelectInteractor("Name").select("Oliver Hansen"); - await delay(500); await MultiSelectInteractor("Name").select("April Tucker"); - await delay(500); await MultiSelectInteractor("Name").select("Omar Alexander"); // TODO For some unknown reason options "Ralph Hubbard", "Omar Alexander" and "Carlos Abbott" aren't visible }, @@ -384,15 +332,10 @@ export const Select: ComponentStory = { source: { code: ` await SelectInteractor("Age").choose("Ten"); -await delay(500); await SelectInteractor("Age").choose("Twenty"); -await delay(500); await SelectInteractor("Age").choose("Thirty"); -await delay(500); await MultiSelectInteractor("Name").select("Oliver Hansen"); -await delay(500); await MultiSelectInteractor("Name").select("April Tucker"); -await delay(500); await MultiSelectInteractor("Name").select("Omar Alexander"); `, }, @@ -400,21 +343,15 @@ await MultiSelectInteractor("Name").select("Omar Alexander"); }, }; -export const Slider: ComponentStory = { +export const Slider: ComponentStoryObj = { render: () => , async play(): Promise { await SliderInteractor("Volume").increase(10); - await delay(500); await SliderInteractor("Volume").setMax(); - await delay(500); await SliderInteractor("Volume").decrease(25); - await delay(500); await ThumbInteractor("1").increase(10); - await delay(500); await ThumbInteractor("1").decrease(20); - await delay(500); await ThumbInteractor("0").increase(30); - await delay(500); await ThumbInteractor("0").decrease(10); }, parameters: { @@ -422,17 +359,11 @@ export const Slider: ComponentStory = { source: { code: ` await SliderInteractor("Volume").increase(10); -await delay(500); await SliderInteractor("Volume").setMax(); -await delay(500); await SliderInteractor("Volume").decrease(25); -await delay(500); await ThumbInteractor("1").increase(10); -await delay(500); await ThumbInteractor("1").decrease(20); -await delay(500); await ThumbInteractor("0").increase(30); -await delay(500); await ThumbInteractor("0").decrease(10); `, }, @@ -440,11 +371,10 @@ await ThumbInteractor("0").decrease(10); }, }; -export const Snackbar: ComponentStory = { +export const Snackbar: ComponentStoryObj = { render: () => , async play(): Promise { await ButtonInteractor("OPEN SIMPLE SNACKBAR").click(); - await delay(1000); await SnackbarInteractor().find(ButtonInteractor("UNDO")).click(); }, parameters: { @@ -452,7 +382,6 @@ export const Snackbar: ComponentStory = { source: { code: ` await ButtonInteractor("OPEN SIMPLE SNACKBAR").click(); -await delay(1000); await SnackbarInteractor().find(ButtonInteractor('UNDO')).click(); `, }, @@ -460,13 +389,11 @@ await SnackbarInteractor().find(ButtonInteractor('UNDO')).click(); }, }; -export const Switch: ComponentStory = { +export const Switch: ComponentStoryObj = { render: () => , async play(): Promise { await SwitchInteractor("Secondary").toggle(); - await delay(500); await SwitchInteractor("Primary").toggle(); - await delay(500); await SwitchInteractor("Uncontrolled").toggle(); }, parameters: { @@ -474,9 +401,7 @@ export const Switch: ComponentStory = { source: { code: ` await SwitchInteractor("Secondary").toggle(); -await delay(500); await SwitchInteractor("Primary").toggle(); -await delay(500); await SwitchInteractor("Uncontrolled").toggle(); `, }, @@ -484,11 +409,10 @@ await SwitchInteractor("Uncontrolled").toggle(); }, }; -export const Tabs: ComponentStory = { +export const Tabs: ComponentStoryObj = { render: () => , async play(): Promise { await TabsInteractor("simple tabs example").click("ITEM TWO"); - await delay(500); await TabsInteractor("simple tabs example").click("ITEM THREE"); }, parameters: { @@ -496,7 +420,6 @@ export const Tabs: ComponentStory = { source: { code: ` await TabsInteractor("simple tabs example").click("ITEM TWO"); -await delay(500); await TabsInteractor("simple tabs example").click("ITEM THREE"); `, }, @@ -504,13 +427,11 @@ await TabsInteractor("simple tabs example").click("ITEM THREE"); }, }; -export const TextField: ComponentStory = { +export const TextField: ComponentStoryObj = { render: () => , async play(): Promise { await TextFieldInteractor("Standard").fillIn("Hello World"); - await delay(500); await TextFieldInteractor("Filled").fillIn("Hello World"); - await delay(500); await TextFieldInteractor("Outlined").fillIn("Hello World"); }, parameters: { @@ -518,9 +439,7 @@ export const TextField: ComponentStory = { source: { code: ` await TextFieldInteractor("Standard").fillIn("Hello World"); -await delay(500); await TextFieldInteractor("Filled").fillIn("Hello World"); -await delay(500); await TextFieldInteractor("Outlined").fillIn("Hello World"); `, }, @@ -528,7 +447,7 @@ await TextFieldInteractor("Outlined").fillIn("Hello World"); }, }; -export const TimeField: ComponentStory = { +export const TimeField: ComponentStoryObj = { render: () => , async play(): Promise { await TimeFieldInteractor().fillIn("13:24:35"); diff --git a/packages/material-ui/stories/slider.stories.tsx b/packages/material-ui/stories/slider.stories.tsx new file mode 100644 index 00000000..fa2afea8 --- /dev/null +++ b/packages/material-ui/stories/slider.stories.tsx @@ -0,0 +1,581 @@ +import { Slider as Component } from "@material-ui/core"; +import { Slider, Thumb } from "../src"; +import { renderComponent } from "./helpers"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; +import { ComponentProps } from "react"; + +export default { + title: "Slider", + component: renderComponent( + Component, + { + min: -100, + max: 200, + defaultValue: 0, + getAriaLabel: (index) => (index == 0 ? "1st" : index == 1 ? "2nd" : index == 2 ? "3rd" : "nth"), + getAriaValueText: (value) => `${value}°C`, + }, + ({ props, children }) => ( +
+ Slider Label + {children(props)} +
+ ) + ), +} as ComponentMeta; + +const slider = Slider(); +const firstThumb = slider.find(Thumb("1st")); +const secondThumb = slider.find(Thumb("2nd")); +const thirdThumb = slider.find(Thumb("3rd")); +const disabledSlider = Slider({ disabled: true }); +const disabledThumb = Thumb({ disabled: true }); + +export const Default: ComponentStoryObj = { + async play() { + await slider.exists(), await slider.has({ orientation: "horizontal" }); + await slider.has({ value: 0 }); + await slider.has({ textValue: "0°C" }); + await slider.has({ minValue: -100 }); + await slider.has({ maxValue: 200 }); + await slider.is({ horizontal: true }); + await slider.is({ vertical: false }); + await slider.is({ min: false }); + await slider.is({ max: false }); + await slider.find(Thumb()).has({ index: 0 }); + await slider.find(Thumb()).has({ value: 0 }); + await slider.find(Thumb()).has({ textValue: "0°C" }); + await slider.find(Thumb("1st")).exists(); + await slider.find(Thumb({ disabled: false })).exists(); + await Slider("1st").exists(); + await Slider({ disabled: false }).exists(); + await Slider("My Slider").absent(); + }, +}; + +export const DecreaseAction: ComponentStoryObj = { + async play() { + await slider.decrease(); + await slider.has({ value: -1 }); + await slider.has({ textValue: "-1°C" }); + }, +}; + +export const DecreaseActionBy10: ComponentStoryObj = { + async play() { + await slider.decrease(10); + + await slider.has({ value: -10 }); + await slider.has({ textValue: "-10°C" }); + }, +}; + +export const DecreaseActionBy200: ComponentStoryObj = { + async play() { + await slider.decrease(200); + + await slider.has({ value: -100 }); + await slider.has({ textValue: "-100°C" }); + await slider.is({ min: true }); + }, +}; + +export const IncreaseAction: ComponentStoryObj = { + async play() { + await slider.increase(); + await slider.has({ value: 1 }); + await slider.has({ textValue: "1°C" }); + }, +}; + +export const IncreaseActionBy10: ComponentStoryObj = { + async play() { + await slider.increase(10); + + await slider.has({ value: 10 }); + await slider.has({ textValue: "10°C" }); + }, +}; + +export const IncreaseActionBy300: ComponentStoryObj = { + async play() { + await slider.increase(300); + await slider.has({ value: 200 }); + await slider.has({ textValue: "200°C" }); + await slider.is({ max: true }); + }, +}; + +export const SetMinAction: ComponentStoryObj = { + async play() { + await slider.setMin(); + await slider.is({ min: true }); + }, +}; + +export const SetMaxAction: ComponentStoryObj = { + async play() { + await slider.setMax(); + await slider.is({ max: true }); + }, +}; + +export const SetValueAction: ComponentStoryObj = { + async play() { + await slider.setValue(100); + // NOTE: This is expected behavior because the slide's step width is less than 1 px + await slider.has({ value: 101 }); + }, +}; + +export const SetValueActionBelowMin: ComponentStoryObj = { + async play() { + await slider.setValue(-200); + await slider.has({ value: -100 }); + }, +}; + +export const SetValueActionAboveMax: ComponentStoryObj = { + async play() { + await slider.setValue(300); + await slider.has({ value: 200 }); + }, +}; + +export const WithAriaLabel: ComponentStoryObj = { + args: { "aria-label": "My Slider", getAriaLabel: undefined }, + async play() { + await Slider("My Slider").exists(); + }, +}; + +export const WithAriaLabeledBy: ComponentStoryObj = { + args: { "aria-labelledby": "label-id" }, + async play() { + await Slider("Slider Label").exists(); + }, +}; + +export const WithoutGetAriaLabel: ComponentStoryObj = { + args: { getAriaLabel: undefined }, + async play() { + await slider.find(Thumb("0°C")).exists(); + }, +}; + +export const OrientationVertical: ComponentStoryObj = { + args: { orientation: "vertical" }, + async play() { + await slider.has({ orientation: "vertical" }); + await slider.is({ horizontal: false }); + await slider.is({ vertical: true }); + }, +}; + +export const DecreaseActionVertical: ComponentStoryObj = { + args: { orientation: "vertical" }, + async play() { + await slider.decrease(); + await slider.has({ value: -1 }); + }, +}; + +export const DecreaseActionBy10Vertical: ComponentStoryObj = { + args: { orientation: "vertical" }, + async play() { + await slider.decrease(10); + await slider.has({ value: -10 }); + }, +}; + +export const DecreaseActionBy200Vertical: ComponentStoryObj = { + args: { orientation: "vertical" }, + async play() { + await slider.decrease(200); + await slider.has({ value: -100 }); + await slider.is({ min: true }); + }, +}; + +export const IncreaseActionVertical: ComponentStoryObj = { + args: { orientation: "vertical" }, + async play() { + await slider.increase(); + await slider.has({ value: 1 }); + }, +}; + +export const IncreaseActionBy10Vertical: ComponentStoryObj = { + args: { orientation: "vertical" }, + async play() { + await slider.increase(10); + await slider.has({ value: 10 }); + }, +}; + +export const IncreaseActionBy300Vertical: ComponentStoryObj = { + args: { orientation: "vertical" }, + async play() { + await slider.increase(300); + await slider.has({ value: 200 }); + await slider.is({ max: true }); + }, +}; + +export const SetMinActionVertical: ComponentStoryObj = { + args: { orientation: "vertical" }, + async play() { + await slider.setMin(); + await slider.is({ min: true }); + }, +}; + +export const SetMaxActionVertical: ComponentStoryObj = { + args: { orientation: "vertical" }, + async play() { + await slider.setMax(); + await slider.is({ max: true }); + }, +}; + +export const SetValueActionVertical: ComponentStoryObj = { + args: { orientation: "vertical" }, + async play() { + await slider.setValue(100); + // NOTE: This is expected behavior because the slide's step width is less than 1 px + await slider.has({ value: 101 }); + }, +}; + +export const SetValueActionBelowMinVertical: ComponentStoryObj = { + args: { orientation: "vertical" }, + async play() { + await slider.setValue(-200); + await slider.has({ value: -100 }); + }, +}; + +export const SetValueActionAboveMaxVertical: ComponentStoryObj = { + args: { orientation: "vertical" }, + async play() { + await slider.setValue(300); + await slider.has({ value: 200 }); + }, +}; + +const sliderMarkProps: ComponentProps = { + step: null, + marks: [-100, -75, -50, -25, -10, 0, 25, 50, 100, 150, 200].map((value) => ({ value, label: `${value}°C` })), +}; + +export const DecreaseActionWithMarks: ComponentStoryObj = { + args: sliderMarkProps, + async play() { + await slider.decrease(); + await slider.has({ value: -10 }); + }, +}; + +export const DecreaseActionBy3WithMarks: ComponentStoryObj = { + args: sliderMarkProps, + async play() { + await slider.decrease(3); + await slider.has({ value: -50 }); + }, +}; + +export const DecreaseActionBy10WithMarks: ComponentStoryObj = { + args: sliderMarkProps, + async play() { + await slider.decrease(10); + + await slider.has({ value: -100 }); + await slider.is({ min: true }); + }, +}; + +export const IncreaseActionWithMarks: ComponentStoryObj = { + args: sliderMarkProps, + async play() { + await slider.increase(); + await slider.has({ value: 25 }); + }, +}; + +export const IncreaseActionBy3WithMarks: ComponentStoryObj = { + args: sliderMarkProps, + async play() { + await slider.increase(3); + await slider.has({ value: 100 }); + }, +}; + +export const IncreaseActionBy10WithMarks: ComponentStoryObj = { + args: sliderMarkProps, + async play() { + await slider.increase(10); + await slider.has({ value: 200 }); + await slider.is({ max: true }); + }, +}; + +export const SetMinActionWithMarks: ComponentStoryObj = { + args: sliderMarkProps, + async play() { + await slider.setMin(); + await slider.is({ min: true }); + }, +}; + +export const SetMaxActionWithMarks: ComponentStoryObj = { + args: sliderMarkProps, + async play() { + await slider.setMax(); + await slider.is({ max: true }); + }, +}; + +export const SetValueActionWithMarks: ComponentStoryObj = { + args: sliderMarkProps, + async play() { + await slider.setValue(100); + await slider.has({ value: 100 }); + }, +}; + +export const SetValueActionBelowMark: ComponentStoryObj = { + args: sliderMarkProps, + async play() { + await slider.setValue(90); + await slider.has({ value: 100 }); + }, +}; + +export const SetValueActionAboveMark: ComponentStoryObj = { + args: sliderMarkProps, + async play() { + await slider.setValue(110); + await slider.has({ value: 100 }); + }, +}; + +export const SetValueActionBelowMinWithMarks: ComponentStoryObj = { + args: sliderMarkProps, + async play() { + await slider.setValue(-200); + await slider.has({ value: -100 }); + }, +}; + +export const SetValueActionAboveMarkWithMarks: ComponentStoryObj = { + args: sliderMarkProps, + async play() { + await slider.setValue(300); + await slider.has({ value: 200 }); + }, +}; + +export const Disabled: ComponentStoryObj = { + args: { disabled: true }, + async play() { + await slider.absent(), await disabledSlider.exists(); + }, +}; + +export const DecreaseActionDisabled: ComponentStoryObj = { + args: { disabled: true }, + async play() { + await disabledThumb.decrease(); + await Slider({ disabled: true, value: 0 }).exists(); + }, +}; + +export const IncreaseActionDisabled: ComponentStoryObj = { + args: { disabled: true }, + async play() { + await disabledThumb.increase(); + await Slider({ disabled: true, value: 0 }).exists(); + }, +}; + +export const SetMinActionDisabled: ComponentStoryObj = { + args: { disabled: true }, + async play() { + await disabledThumb.setMin(); + await Slider({ disabled: true, min: false }).exists(); + }, +}; + +export const SetMaxActionDisabled: ComponentStoryObj = { + args: { disabled: true }, + async play() { + await disabledThumb.setMax(); + await Slider({ disabled: true, max: false }).exists(); + }, +}; + +export const SetValueActionDisabled: ComponentStoryObj = { + args: { disabled: true }, + async play() { + await disabledThumb.setValue(100); + await Slider({ disabled: true, value: 0 }).exists(); + }, +}; + +const thumbProps: ComponentProps = { defaultValue: [-50, 0, 100] }; + +export const MultipleThumbs: ComponentStoryObj = { + args: thumbProps, + async play() { + await slider.has({ orientation: "horizontal" }); + await slider.has({ value: [-50, 0, 100] }); + await slider.has({ textValue: ["-50°C", "0°C", "100°C"] }); + await slider.has({ minValue: -100 }); + await slider.has({ maxValue: 200 }); + await slider.is({ horizontal: true }); + await slider.is({ vertical: false }); + await slider.is({ min: false }); + await slider.is({ max: false }); + await firstThumb.has({ index: 0, value: -50, textValue: "-50°C" }); + await secondThumb.has({ index: 1, value: 0, textValue: "0°C" }); + await thirdThumb.has({ index: 2, value: 100, textValue: "100°C" }); + await slider.find(Thumb("nth")).absent(); + }, +}; + +export const DecreaseActionMultipleThumbs: ComponentStoryObj = { + args: thumbProps, + async play() { + await secondThumb.decrease(); + await secondThumb.has({ value: -1 }); + await secondThumb.has({ textValue: "-1°C" }); + }, +}; + +export const DecreaseActionBy10MultipleThumbs: ComponentStoryObj = { + args: thumbProps, + async play() { + await secondThumb.decrease(10); + await secondThumb.has({ value: -10 }); + await secondThumb.has({ textValue: "-10°C" }); + }, +}; + +export const DecreaseActionBy200MultipleThumbs: ComponentStoryObj = { + args: thumbProps, + async play() { + await secondThumb.decrease(200); + await slider.has({ value: [-100, -50, 100] }); + await secondThumb.has({ value: -50 }); + await secondThumb.has({ textValue: "-50°C" }); + await secondThumb.is({ min: false }); + await firstThumb.has({ value: -100 }); + await firstThumb.has({ textValue: "-100°C" }); + await firstThumb.is({ min: true }); + }, +}; + +export const IncreaseActionMultipleThumbs: ComponentStoryObj = { + args: thumbProps, + async play() { + await secondThumb.increase(); + await secondThumb.has({ value: 1 }); + await secondThumb.has({ textValue: "1°C" }); + }, +}; + +export const IncreaseActionBy10MultipleThumbs: ComponentStoryObj = { + args: thumbProps, + async play() { + await secondThumb.increase(10); + await secondThumb.has({ value: 10 }); + await secondThumb.has({ textValue: "10°C" }); + }, +}; + +export const IncreaseActionBy300MultipleThumbs: ComponentStoryObj = { + args: thumbProps, + async play() { + await secondThumb.increase(300); + await slider.has({ value: [-50, 100, 200] }); + await secondThumb.has({ value: 100 }); + await secondThumb.has({ textValue: "100°C" }); + await secondThumb.is({ max: false }); + await thirdThumb.has({ value: 200 }); + await thirdThumb.has({ textValue: "200°C" }); + await thirdThumb.is({ max: true }); + }, +}; + +export const SetMinActionMultipleThumbs: ComponentStoryObj = { + args: thumbProps, + async play() { + await secondThumb.setMin(); + await slider.is({ min: false }); + await secondThumb.is({ min: false }); + await firstThumb.is({ min: true }); + }, +}; + +export const SetMinActionAllThumbs: ComponentStoryObj = { + args: thumbProps, + async play() { + await firstThumb.setMin(); + await secondThumb.setMin(); + await thirdThumb.setMin(); + + await slider.is({ min: true }); + await firstThumb.is({ min: true }); + await secondThumb.is({ min: true }); + await thirdThumb.is({ min: true }); + }, +}; + +export const SetMaxActionMultipleThumbs: ComponentStoryObj = { + args: thumbProps, + async play() { + await secondThumb.setMax(); + await slider.is({ max: false }); + await secondThumb.is({ max: false }); + await thirdThumb.is({ max: true }); + }, +}; + +export const SetMaxActionAllThumbs: ComponentStoryObj = { + args: thumbProps, + async play() { + await thirdThumb.setMax(); + await secondThumb.setMax(); + await firstThumb.setMax(); + await slider.is({ max: true }); + await firstThumb.is({ max: true }); + await secondThumb.is({ max: true }); + await thirdThumb.is({ max: true }); + }, +}; + +export const SetValueActionMultipleThumbs: ComponentStoryObj = { + args: thumbProps, + async play() { + await secondThumb.setValue(50); + await secondThumb.has({ value: 50 }); + }, +}; + +export const SetValueActionBelowMinMultipleThumbs: ComponentStoryObj = { + args: thumbProps, + async play() { + await secondThumb.setValue(-200); + await secondThumb.has({ value: -50 }); + await firstThumb.has({ value: -100 }); + }, +}; + +export const SetValueActionAboveMaxMultipleThumbs: ComponentStoryObj = { + args: thumbProps, + async play() { + await secondThumb.setValue(300); + await secondThumb.has({ value: 100 }); + await thirdThumb.has({ value: 200 }); + }, +}; diff --git a/packages/material-ui/stories/snackbar.stories.tsx b/packages/material-ui/stories/snackbar.stories.tsx new file mode 100644 index 00000000..94dc4b1d --- /dev/null +++ b/packages/material-ui/stories/snackbar.stories.tsx @@ -0,0 +1,18 @@ +import { matching, Snackbar, some } from "../src"; +import { Snackbar as Component } from "@material-ui/core"; +import { renderComponent } from "./helpers"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; + +export default { + title: "Snackbar", + component: renderComponent(Component, { message: "Snackbar", open: true }), +} as ComponentMeta; + +const snackbar = Snackbar("Snackbar"); + +export const Default: ComponentStoryObj = { + async play() { + await snackbar.exists(); + await snackbar.has({ classList: some(matching(/MuiSnackbar-root(-\d+)?/)) }); + }, +}; diff --git a/packages/material-ui/stories/switch.stories.tsx b/packages/material-ui/stories/switch.stories.tsx new file mode 100644 index 00000000..dc56b8bf --- /dev/null +++ b/packages/material-ui/stories/switch.stories.tsx @@ -0,0 +1,106 @@ +import { Body } from "../src/body"; +import { matching, some, Switch } from "../src"; +import { Switch as Component, FormControlLabel } from "@material-ui/core"; +import { renderComponent } from "./helpers"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; + +export default { + title: "Switch", + component: renderComponent(Component, {}, ({ props, children }) => ( + + )), +} as ComponentMeta; + +const switcher = Switch("switch"); + +export const Default: ComponentStoryObj = { + async play() { + await switcher.exists(); + await switcher.is({ checked: false }); + await switcher.is({ focused: false }); + await switcher.has({ classList: some(matching(/MuiSwitch-input(-\d+)?/)) }); + await Switch({ disabled: false }).exists(); + }, +}; + +export const ClickAction: ComponentStoryObj = { + async play() { + await switcher.click(); + await switcher.is({ checked: true, focused: true }); + }, +}; + +export const FocusAction: ComponentStoryObj = { + async play() { + await switcher.focus(); + await switcher.is({ focused: true }); + }, +}; + +export const CheckAction: ComponentStoryObj = { + async play() { + await switcher.check(); + await switcher.is({ checked: true }); + }, +}; + +export const ToggleAction: ComponentStoryObj = { + async play() { + await switcher.toggle(); + await switcher.is({ checked: true }); + await switcher.toggle(); + await switcher.is({ checked: false }); + }, +}; + +export const Checked: ComponentStoryObj = { + render: () => } />, + async play() { + await switcher.is({ checked: true }); + }, +}; + +export const Disabled: ComponentStoryObj = { + render: () => } />, + async play() { + await Switch({ disabled: true }).exists(); + }, +}; + +export const Visible: ComponentStoryObj = { + render: () => , + async play() { + await Switch({ visible: false }).exists(); + }, +}; + +export const UncheckAction: ComponentStoryObj = { + args: { defaultChecked: true }, + async play() { + await switcher.uncheck(); + await switcher.is({ checked: false }); + }, +}; + +export const AutoFocus: ComponentStoryObj = { + args: { autoFocus: true }, + async play() { + await switcher.is({ focused: true }); + }, +}; + +export const BlurActionAutoFocus: ComponentStoryObj = { + args: { autoFocus: true }, + async play() { + await switcher.blur(); + await switcher.is({ focused: false }); + }, +}; + +export const BodyClickAutoFocus: ComponentStoryObj = { + args: { autoFocus: true }, + async play() { + await Body().click(); + await switcher.is({ focused: false }); + }, +}; diff --git a/packages/material-ui/stories/tabs.stories.tsx b/packages/material-ui/stories/tabs.stories.tsx new file mode 100644 index 00000000..17f3cf59 --- /dev/null +++ b/packages/material-ui/stories/tabs.stories.tsx @@ -0,0 +1,46 @@ +import { matching, some, Tab, Tabs } from "../src"; +import { Tabs as Component, Tab as TabComponent } from "@material-ui/core"; +import { renderComponent } from "./helpers"; +import { cloneElement, useState } from "react"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; + +export default { + title: "Tabs", + component: renderComponent( + Component, + { + "aria-label": "tabs", + }, + ({ props, children }) => { + let [value, setValue] = useState(2); + + let handleChange = (_event: unknown, newValue: number) => setValue(newValue); + + return cloneElement( + children(props), + { value, onChange: handleChange }, + , + , + + ); + } + ), +} as ComponentMeta; + +const tabs = Tabs("tabs"); + +export const Default: ComponentStoryObj = { + async play() { + await tabs.exists(); + await tabs.has({ value: "THREE" }); + await tabs.has({ classList: some(matching(/MuiTabs-root(-\d+)?/)) }); + await tabs.find(Tab({ disabled: true })).exists(); + }, +}; + +export const ClickAction: ComponentStoryObj = { + async play() { + await tabs.click("ONE"); + await tabs.has({ value: "ONE" }); + }, +}; diff --git a/packages/material-ui/stories/text-field.stories.tsx b/packages/material-ui/stories/text-field.stories.tsx new file mode 100644 index 00000000..990c2c9d --- /dev/null +++ b/packages/material-ui/stories/text-field.stories.tsx @@ -0,0 +1,87 @@ +import { some, TextField, matching } from "../src"; +import { TextField as Component } from "@material-ui/core"; +import { renderComponent } from "./helpers"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; + +export default { + title: "TextField", + component: renderComponent(Component, { + id: "text-field-id", + label: "textfield", + helperText: "TextField", + placeholder: "Enter text", + }), +} as ComponentMeta; + +const textfield = TextField("textfield"); + +export const Default: ComponentStoryObj = { + async play() { + await textfield.exists(); + await textfield.has({ value: "" }); + await textfield.has({ placeholder: "Enter text" }); + await textfield.has({ description: "TextField" }); + await textfield.has({ classList: some(matching(/MuiInputBase-input(-\d+)?/)) }); + await textfield.is({ valid: true }); + await textfield.is({ focused: false }); + await TextField({ disabled: false }).exists(); + }, +}; + +export const FillInAction: ComponentStoryObj = { + async play() { + await textfield.fillIn("Hello from BigTest"); + await textfield.has({ value: "Hello from BigTest" }); + }, +}; + +export const FocusAction: ComponentStoryObj = { + async play() { + await textfield.focus(); + await textfield.is({ focused: true }); + }, +}; + +export const Required: ComponentStoryObj = { + args: { required: true }, + async play() { + await TextField(matching(/textfield\s\*/)).is({ required: true }); + }, +}; + +export const Error: ComponentStoryObj = { + args: { error: true }, + async play() { + await textfield.is({ valid: false }); + }, +}; + +export const Disabled: ComponentStoryObj = { + args: { disabled: true }, + async play() { + await textfield.absent(); + await TextField({ disabled: true }).exists(); + }, +}; + +export const Multiline: ComponentStoryObj = { + args: { multiline: true }, + async play() { + await textfield.exists(); + }, +}; + +export const IdUndefined: ComponentStoryObj = { + args: { id: undefined }, + async play() { + await textfield.exists(); + }, +}; + +export const LabelUndefined: ComponentStoryObj = { + args: { id: undefined, label: undefined }, + async play() { + await textfield.absent(); + await TextField("Enter text").exists(); + }, +}; diff --git a/packages/material-ui/stories/time-field.stories.tsx b/packages/material-ui/stories/time-field.stories.tsx new file mode 100644 index 00000000..58abcee5 --- /dev/null +++ b/packages/material-ui/stories/time-field.stories.tsx @@ -0,0 +1,48 @@ +import { TextField as Component } from "@material-ui/core"; +import { matching, some, TimeField } from "../src"; +import { renderComponent } from "./helpers"; +import { ComponentMeta, ComponentStoryObj } from "@storybook/react"; + +export default { + title: "TimeField", + component: renderComponent(Component, { id: "timefield", label: "timefield", type: "time" }), +} as ComponentMeta; + +const timefield = TimeField("timefield"); + +export const Default: ComponentStoryObj = { + async play() { + await timefield.has({ value: "" }); + await timefield.has({ classList: some(matching(/MuiInputBase-input(-\d+)?/)) }); + }, +}; + +export const FillInActionString: ComponentStoryObj = { + async play() { + await timefield.fillIn("09:13:37.512"); + await timefield.has({ value: "09:13:37.512" }); + await timefield.has({ date: new Date("1970-01-01T09:13:37.512Z") }); + await timefield.has({ timestamp: new Date("1970-01-01T09:13:37.512Z").getTime() }); + }, +}; + +export const FillInActionDate: ComponentStoryObj = { + async play() { + await timefield.fillIn(new Date("2014-08-18T09:13:37.512Z")); + await timefield.has({ value: "09:13:37.512" }); + }, +}; + +export const FillInActionWithoutSeconds: ComponentStoryObj = { + async play() { + await timefield.fillIn("09:13"); + await timefield.has({ value: "09:13" }); + }, +}; + +export const FillInActionWithSeconds: ComponentStoryObj = { + async play() { + await timefield.fillIn("09:13:37"); + await timefield.has({ value: "09:13:37" }); + }, +}; diff --git a/packages/material-ui/test/button.test.tsx b/packages/material-ui/test/button.test.tsx index 8716a810..3b4e8255 100644 --- a/packages/material-ui/test/button.test.tsx +++ b/packages/material-ui/test/button.test.tsx @@ -130,15 +130,15 @@ export default test("Button") .assertion(button.has({ className: not(including("MuiButton-containedSizeLarge")) })) ) .child('renders a large contained button', (test) => test - .step(renderButton({ variant: "contained", size: "small" })) + .step(renderButton({ variant: "contained", size: "large" })) .assertion(button.has({ className: including("MuiButton-root") })) .assertion(button.has({ className: including("MuiButton-contained") })) - .assertion(button.has({ className: including("MuiButton-containedSizeSmall") })) + .assertion(button.has({ className: including("MuiButton-containedSizeLarge") })) .assertion(button.has({ className: not(including("MuiButton-textSizeSmall")) })) .assertion(button.has({ className: not(including("MuiButton-textSizeLarge")) })) .assertion(button.has({ className: not(including("MuiButton-outlinedSizeSmall")) })) .assertion(button.has({ className: not(including("MuiButton-outlinedSizeLarge")) })) - .assertion(button.has({ className: not(including("MuiButton-containedSizeLarge")) })) + .assertion(button.has({ className: not(including("MuiButton-containedSizeSmall")) })) ) .child('renders button with startIcon', (test) => test .step(renderButton({ startIcon: icon })) diff --git a/packages/material-ui/tsconfig.build.json b/packages/material-ui/tsconfig.build.json index 4429ddbe..11cbe46b 100644 --- a/packages/material-ui/tsconfig.build.json +++ b/packages/material-ui/tsconfig.build.json @@ -10,6 +10,7 @@ "types" ], "references": [ + { "path": "../globals/tsconfig.build.json" }, { "path": "../html/tsconfig.build.json" } ] } diff --git a/packages/with-storybook/.gitignore b/packages/with-storybook/.gitignore new file mode 100644 index 00000000..db4c6d9b --- /dev/null +++ b/packages/with-storybook/.gitignore @@ -0,0 +1,2 @@ +dist +node_modules \ No newline at end of file diff --git a/packages/with-storybook/CHANGELOG.md b/packages/with-storybook/CHANGELOG.md new file mode 100644 index 00000000..7863f5e2 --- /dev/null +++ b/packages/with-storybook/CHANGELOG.md @@ -0,0 +1 @@ +# @interactors/with-storybook diff --git a/packages/with-storybook/README.md b/packages/with-storybook/README.md new file mode 100644 index 00000000..641d3c38 --- /dev/null +++ b/packages/with-storybook/README.md @@ -0,0 +1,13 @@ +## @interactors/with-storybook + +[![npm](https://img.shields.io/npm/v/@interactors/with-storybook.svg)](https://www.npmjs.com/package/@interactors/with-storybook) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +[![Created by Frontside](https://img.shields.io/badge/created%20by-frontside-26abe8.svg)](https://frontside.com) +[![Chat on Discord](https://img.shields.io/discord/700803887132704931?Label=Discord)](https://discord.gg/mv4uxxcAKd) + +[Interactors][] are Page Objects for component libraries and design systems. +This package lets you use them seamlessly within [Storybook][] interactive stories. Learn more at +[https://frontside.com/interactors/docs/integrations#storybook](https://frontside.com/interactors/docs/integrations#storybook) + +[Interactors]: https://frontside.com/interactors +[Storybook]: https://storybook.js.org diff --git a/packages/with-storybook/package.json b/packages/with-storybook/package.json new file mode 100644 index 00000000..c1dbbf00 --- /dev/null +++ b/packages/with-storybook/package.json @@ -0,0 +1,46 @@ +{ + "name": "@interactors/with-storybook", + "version": "1.0.0-rc1.2", + "description": "Storybook addon integration for Interactors", + "main": "dist/index.js", + "module": "dist/index.js", + "types": "dist/index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/thefrontside/interactors.git" + }, + "homepage": "https://frontside.com/interactors", + "author": "Frontside Engineering ", + "license": "MIT", + "files": [ + "dist/**/*", + "src/**/*", + "preset.js", + "README.md" + ], + "dependencies": { + "@interactors/globals": "^1.0.0-rc1.1" + }, + "peerDependencies": { + "@storybook/addon-interactions": "*" + }, + "scripts": { + "clean": "rm -rf dist *.tsbuildinfo", + "lint": "eslint \"src/**/*.ts\"", + "prepack": "tsc --build ./tsconfig.build.json && yarn prepack:es2015 && yarn prepack:commonjs", + "prepack:es2015": "tsc --project ./tsconfig.build.json --outdir dist/esm --module es2015", + "prepack:commonjs": "tsc --project ./tsconfig.build.json --outdir dist/cjs --module commonjs" + }, + "devDependencies": { + "@frontside/eslint-config": "^2.1.0", + "@frontside/tsconfig": "^1.2.0", + "@frontside/typescript": "^1.1.1" + }, + "volta": { + "node": "14.17.5", + "yarn": "1.22.11" + }, + "keywords": ["storybook", "addons", "interactors", "testing", "debug"], + "displayName": "Interactors inspector", + "icon": "https://frontside.com/interactors/img/interactors-logo@4x.png" +} diff --git a/packages/with-storybook/preset.js b/packages/with-storybook/preset.js new file mode 100644 index 00000000..aeb5343e --- /dev/null +++ b/packages/with-storybook/preset.js @@ -0,0 +1,5 @@ +module.exports = { + config(entry = []) { + return [...entry, require.resolve('./dist/esm/wrapper')]; + } +} diff --git a/packages/with-storybook/src/wrapper.ts b/packages/with-storybook/src/wrapper.ts new file mode 100644 index 00000000..5dbc4305 --- /dev/null +++ b/packages/with-storybook/src/wrapper.ts @@ -0,0 +1,41 @@ +import Events from "@storybook/core-events"; +import { addons } from "@storybook/addons"; +import { instrument } from "@storybook/instrumenter"; +import { addInteractionWrapper } from "@interactors/globals"; + +// NOTE: Dummy call to initialize instrumenter. See: https://github.com/storybookjs/storybook/blob/next/lib/instrumenter/src/instrumenter.ts#L512 +instrument({}); + +let isRoot = true; + +addInteractionWrapper((perform, interaction) => { + if (!isRoot) { + return perform; + } + return async () => { + let channel = addons.getChannel(); + let cancel = (event: { newPhase?: 'aborted' | 'errored' }) => { + if (!event.newPhase || event.newPhase == "aborted" || event.newPhase == "errored") { + channel.off(Events.FORCE_REMOUNT, cancel); + channel.off(Events.STORY_RENDER_PHASE_CHANGED, cancel); + interaction.halt(); + isRoot = true; + } + }; + channel.on(Events.FORCE_REMOUNT, cancel); + channel.on(Events.STORY_RENDER_PHASE_CHANGED, cancel); + try { + // @ts-expect-error Storybook hasn't exposed instrumenter's API to public, yet + return await global.window.__STORYBOOK_ADDON_INTERACTIONS_INSTRUMENTER__.track( + interaction.code(), + async () => perform(), + [], + { intercept: () => !(isRoot = false) } + ); + } finally { + isRoot = true; + channel.off(Events.FORCE_REMOUNT, cancel); + channel.off(Events.STORY_RENDER_PHASE_CHANGED, cancel); + } + }; +}); diff --git a/packages/with-storybook/tsconfig.build.json b/packages/with-storybook/tsconfig.build.json new file mode 100644 index 00000000..defb5be9 --- /dev/null +++ b/packages/with-storybook/tsconfig.build.json @@ -0,0 +1,14 @@ +{ + "extends": "../../tsconfig-base.json", + "compilerOptions": { + "outDir": "dist/cjs", + "rootDir": "./src", + "declarationDir": "dist" + }, + "include": [ + "src/**/*.ts" + ], + "references": [ + { "path": "../globals/tsconfig.build.json" } + ] +} diff --git a/packages/with-storybook/tsconfig.json b/packages/with-storybook/tsconfig.json new file mode 100644 index 00000000..c04c6762 --- /dev/null +++ b/packages/with-storybook/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "@frontside/tsconfig", + "exclude": ["types/**/*.ts"] +} diff --git a/website/docs/storybook.md b/website/docs/storybook.md index 92736e58..b5c82b0e 100644 --- a/website/docs/storybook.md +++ b/website/docs/storybook.md @@ -3,7 +3,7 @@ id: storybook title: Storybook --- -Interactors not only make writing tests easier, it can also help you develop UI components. With the upcoming release of [`Component Story Format 3.0`](https://storybook.js.org/blog/component-story-format-3-0/), you will be able to use Interactors in [`Storybook`](https://storybook.js.org/). +Interactors not only make writing tests easier, it can also help you develop UI components. Since [`Storybook`](https://storybook.js.org/) 6.4 you will be able to write [`interactive stories`](https://storybook.js.org/blog/interactive-stories-beta/) and use Interactors for them. This requires no additional setup. Just install `@interactors/html` to your project, and then you can use interactors in your stories immediately. @@ -38,6 +38,42 @@ export const FormSignIn = { }; ``` +## Interaction testing + +You can also use Interactors as part of your [Storybook interaction testing](https://storybook.js.org/blog/interaction-testing-with-storybook/). + +To use Interactors to test your Storybook interactions, install the following Storybook addons: + +```sh +yarn add -D @storybook/addon-interactions +yarn add -D @interactors/with-storybook +``` + +Add them to your Storybook config and enable the Interactions debugger feature: + +```js +// .storybook/main.js +module.exports = { + addons: ['@storybook/addon-interactions', '@interactors/with-storybook'] + features: { interactionsDebugger: true }, +}; +``` + +Now, you'll be able to start asserting with Interactors within Storybook. Check out what the example from the previous section looks like after adding a `Heading('Welcome Homer!').exists()` assertion: + +```js +import { Button, Heading, TextField } from '@interactors/html'; + +export const FormSignIn = { + play: async () => { + await TextField('Email').fillIn('homer@gmail.com'); + await TextField('Password').fillIn('donuts123'); + await Button('Sign In').click(); + await Heading('Welcome Homer!').exists(); + } +}; +``` + ## Up Next On this page we have gone over how Interactors can enhance your experience with Storybook. If you use `Material UI` to design your apps, you will be pleased to know that `Material UI` too can be used with Interactors and Storybook. diff --git a/website/static/img/interactors-logo@4x.png b/website/static/img/interactors-logo@4x.png new file mode 100644 index 00000000..ec956d94 Binary files /dev/null and b/website/static/img/interactors-logo@4x.png differ diff --git a/yarn.lock b/yarn.lock index 8b5bac40..abd47f31 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,13 +2,6 @@ # yarn lockfile v1 -"@babel/code-frame@7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== - dependencies: - "@babel/highlight" "^7.10.4" - "@babel/code-frame@7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" @@ -1311,10 +1304,10 @@ "@babel/helper-validator-identifier" "^7.15.7" to-fast-properties "^2.0.0" -"@base2/pretty-print-object@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.0.tgz#860ce718b0b73f4009e153541faff2cb6b85d047" - integrity sha512-4Th98KlMHr5+JkxfcoDT//6vY8vM+iSPrLNpHhRyLx2CFYi8e2RfqPLdpbnpo0Q5lQC5hNB79yes07zb02fvCw== +"@base2/pretty-print-object@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz#371ba8be66d556812dc7fb169ebc3c08378f69d4" + integrity sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA== "@bcoe/v8-coverage@^0.2.3": version "0.2.3" @@ -1784,6 +1777,11 @@ tar "^2.2.2" tar-stream "^2.1.4" +"@discoveryjs/json-ext@^0.5.3": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + "@effection/atom@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@effection/atom/-/atom-2.0.1.tgz#e1ec9b24f84e7d32304f76c9d289cba0d099d851" @@ -1803,12 +1801,21 @@ "@effection/events" "2.0.1" "@effection/stream" "2.0.1" +"@effection/channel@2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@effection/channel/-/channel-2.0.3.tgz#825ade1a4a09b860efdf7077fc02f81d6c7614bb" + integrity sha512-HZE2q7dtErIur0g+BVMPqa+dVBgrIIaYMrzMBNM1UoIB6urMGgr+uPWXwgQb3Vzm4Il9SCiCzoM3RE3gDiV1Ig== + dependencies: + "@effection/core" "2.2.0" + "@effection/events" "2.0.3" + "@effection/stream" "2.0.3" + "@effection/core@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@effection/core/-/core-2.0.1.tgz#f200e4df020666ec5dc232da3057bafb63aa19af" integrity sha512-Bl2pfu9gbTwlieTgcEhFOwz70QDPXpyVRuOiOqccGVBvZpa3/mzepH6LFZSCyothnc7YO0b31xXV551POiLEow== -"@effection/core@2.2.0": +"@effection/core@2.2.0", "@effection/core@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@effection/core/-/core-2.2.0.tgz#4d11d7948144aecd70a26daf8abaa29ee89bc259" integrity sha512-1RBMrDS0Ya02NEM0TQQRwzlGDSZmwoHhuD3qmWp9NLjZowhO1gJBZ16fQL2NbKvcpS71xho+oZsDedId+C1q8Q== @@ -1830,6 +1837,14 @@ "@effection/core" "2.0.1" "@effection/stream" "2.0.1" +"@effection/events@2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@effection/events/-/events-2.0.3.tgz#cf212748f8e433dcf776e5e1dd0145716213a7bc" + integrity sha512-x8NBNXHZxI4SJ/db1zy7zs6BRtMIKu8NgymUMpbyrRdapPSIu6rmf4WgXyWrk1uvQPSViEkxOXPw8B2MLu/YnA== + dependencies: + "@effection/core" "2.2.0" + "@effection/stream" "2.0.3" + "@effection/fetch@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@effection/fetch/-/fetch-2.0.1.tgz#f67a307ef6b4450007bbf2207c6be00c143d4ce2" @@ -1840,6 +1855,14 @@ cross-fetch "^3.0.4" node-fetch "^2.6.1" +"@effection/fetch@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@effection/fetch/-/fetch-2.0.4.tgz#8f76f0b630b3974ef267bd8803599448db956cda" + integrity sha512-IhUYqSAM0stEB6VCWK9Mz8F56jWFFpM9yQ4boxGs4F/sdoHnY/9KKW1zxAY05jyYPUHxuUky7sazZVFJm5xRmw== + dependencies: + "@effection/core" "2.2.0" + cross-fetch "3.1.5" + "@effection/main@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@effection/main/-/main-2.0.1.tgz#becbaf0b28665e401b05e429d4cad8c2c5c84ee2" @@ -1849,6 +1872,15 @@ chalk "^4.1.2" stacktrace-parser "^0.1.10" +"@effection/main@2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@effection/main/-/main-2.0.3.tgz#10dceb9c8340fd98b7c6704db0b6e8f652f32802" + integrity sha512-UHMRECFMzX+OU6I0Mg2653MyxNTIT8qXpRtl0bZT4E0rSoYnxsV+gSCEbTZFkDIZWFakp0K6awYvtyYhCeugpg== + dependencies: + "@effection/core" "2.2.0" + chalk "^4.1.2" + stacktrace-parser "^0.1.10" + "@effection/process@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@effection/process/-/process-2.0.1.tgz#fd88dc56d9b1b524121c4c6289555dca03bd1585" @@ -1867,6 +1899,14 @@ "@effection/core" "2.0.1" "@effection/subscription" "2.0.1" +"@effection/stream@2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@effection/stream/-/stream-2.0.3.tgz#c1610c63dfe6d10b0b6aeda6969fea24018364b0" + integrity sha512-l1A8PUfxR04eyUBOD1H5gdCu4U5OMwUh2TB/O/IeUlfVoP9tg64daTu7zpZGij9uDcDWV5IP9LJYoWe2lVGbKg== + dependencies: + "@effection/core" "2.2.0" + "@effection/subscription" "2.0.3" + "@effection/subscription@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@effection/subscription/-/subscription-2.0.1.tgz#677cfdaa21a0a16f5aee4834e9da10afbfb5678b" @@ -1874,6 +1914,13 @@ dependencies: "@effection/core" "2.0.1" +"@effection/subscription@2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@effection/subscription/-/subscription-2.0.3.tgz#ab6e56bf52663b769eb00d0022195b2e753a127d" + integrity sha512-P+bAh0iqCduvzAM+0hbn29HJ+J4TT+lkJTDydw3tI6lSe/OVX9+FJhX/zx2QW3APjFpseMJphjRiEyzf21b/Xw== + dependencies: + "@effection/core" "2.2.0" + "@emotion/cache@^10.0.27": version "10.0.29" resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.29.tgz#87e7e64f412c060102d589fe7c6dc042e6f9d1e0" @@ -2180,6 +2227,17 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + "@manypkg/find-root@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@manypkg/find-root/-/find-root-1.1.0.tgz#a62d8ed1cd7e7d4c11d9d52a8397460b5d4ad29f" @@ -3098,12 +3156,12 @@ chrome-trace-event "^1.0.2" nullthrows "^1.1.1" -"@pmmmwh/react-refresh-webpack-plugin@^0.5.0-rc.2": - version "0.5.0-rc.6" - resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.0-rc.6.tgz#6c44da4a63655ed4c52f1336bb5b050d6bc6285e" - integrity sha512-EU+iDjTp5oFTK2Rw7SgBD8RdKTUpcUcLFCeHZG7/5shkKRMuHTMOzigaf5/C9oLRfWDeCo0mW67dovP03V7SgA== +"@pmmmwh/react-refresh-webpack-plugin@^0.5.1": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.4.tgz#df0d0d855fc527db48aac93c218a0bf4ada41f99" + integrity sha512-zZbZeHQDnoTlt2AF+diQT0wsSXpvWiaIOZwBRdltNFhG1+I3ozyaw7U/nBiUwyJ0D+zwdXp0E3bWOl38Ag2BMw== dependencies: - ansi-html "^0.0.7" + ansi-html-community "^0.0.8" common-path-prefix "^3.0.0" core-js-pure "^3.8.1" error-stack-parser "^2.0.6" @@ -3118,16 +3176,6 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.10.0.tgz#6f2f845cbb8f8f897236d9bf221379f14429c608" integrity sha512-QWvCHtYwNIR3C/mxW9jGzOu1gbaZkq/6is2OedayPH7HsxI4CVuVzAZ1PmxRElXLwwwCN7aMjRhxtTAGLEZ8IQ== -"@reach/router@^1.3.4": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@reach/router/-/router-1.3.4.tgz#d2574b19370a70c80480ed91f3da840136d10f8c" - integrity sha512-+mtn9wjlB9NN2CNnnC/BRYtwdKBfSyyasPYraNAyvaV1occr/5NnB4CVzjEZipNHwYebQwcndGUmpFzxAUoqSA== - dependencies: - create-react-context "0.3.0" - invariant "^2.2.3" - prop-types "^15.6.1" - react-lifecycles-compat "^3.0.4" - "@rollup/plugin-babel@^5.2.1": version "5.3.0" resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz#9cb1c5146ddd6a4968ad96f209c50c62f92f9879" @@ -3199,40 +3247,42 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.2.0.tgz#667bfc6186ae7c9e0b45a08960c551437176e1ca" integrity sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw== -"@storybook/addon-actions@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-6.4.0-alpha.30.tgz#487961f93a077cd3fd58130a99737b70bb1f867f" - integrity sha512-jTC8+Lq2Vs2AnRo0ilmBcfk3xELO0gdeYEPjohZxEeJBTrEOm22zCFLoT9sHnUdtx5QgdszQjto8zhZ+vTKAmg== - dependencies: - "@storybook/addons" "6.4.0-alpha.30" - "@storybook/api" "6.4.0-alpha.30" - "@storybook/client-api" "6.4.0-alpha.30" - "@storybook/components" "6.4.0-alpha.30" - "@storybook/core-events" "6.4.0-alpha.30" - "@storybook/theming" "6.4.0-alpha.30" +"@storybook/addon-actions@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-6.4.19.tgz#10631d9c0a6669810264ea7fac3bff7201553084" + integrity sha512-GpSvP8xV8GfNkmtGJjfCgaOx6mbjtyTK0aT9FqX9pU0s+KVMmoCTrBh43b7dWrwxxas01yleBK9VpYggzhi/Fw== + dependencies: + "@storybook/addons" "6.4.19" + "@storybook/api" "6.4.19" + "@storybook/components" "6.4.19" + "@storybook/core-events" "6.4.19" + "@storybook/csf" "0.0.2--canary.87bc651.0" + "@storybook/theming" "6.4.19" core-js "^3.8.2" fast-deep-equal "^3.1.3" global "^4.4.0" - lodash "^4.17.20" + lodash "^4.17.21" polished "^4.0.5" prop-types "^15.7.2" react-inspector "^5.1.0" regenerator-runtime "^0.13.7" + telejson "^5.3.2" ts-dedent "^2.0.0" util-deprecate "^1.0.2" uuid-browser "^3.1.0" -"@storybook/addon-backgrounds@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-6.4.0-alpha.30.tgz#b23969febd40e65d8e03462bffe651ae17442a21" - integrity sha512-Pk5oTZqcZIp62I8CIYdmulM8mew5T8uCDYl4A5XFafurefkuGaSXBX4Eqnl7aguGHzoMo/wIV8+G8heaCriBAA== - dependencies: - "@storybook/addons" "6.4.0-alpha.30" - "@storybook/api" "6.4.0-alpha.30" - "@storybook/client-logger" "6.4.0-alpha.30" - "@storybook/components" "6.4.0-alpha.30" - "@storybook/core-events" "6.4.0-alpha.30" - "@storybook/theming" "6.4.0-alpha.30" +"@storybook/addon-backgrounds@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-6.4.19.tgz#76435e2037824bb3a6fed9f7d51b9df34fae8af2" + integrity sha512-yn8MTE7lctO48Rdw+DmmA1wKdf5eyAbA/vrug5ske/U2WPgGc65sApzwT8BItZfuyAMjuT5RnCWwd7o6hGRgGQ== + dependencies: + "@storybook/addons" "6.4.19" + "@storybook/api" "6.4.19" + "@storybook/client-logger" "6.4.19" + "@storybook/components" "6.4.19" + "@storybook/core-events" "6.4.19" + "@storybook/csf" "0.0.2--canary.87bc651.0" + "@storybook/theming" "6.4.19" core-js "^3.8.2" global "^4.4.0" memoizerific "^1.11.3" @@ -3240,24 +3290,28 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/addon-controls@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-6.4.0-alpha.30.tgz#dfcef3fa469b2b11d455a8c2c60bdaecb0ad0e58" - integrity sha512-YRQ+cNnfZouIy2bQhavtzIuu1Moo0JZ0qtQHDj9A6dwMit4Bzf+zNO7tO4NOSgQIYH0564pHEu5hSJpmvCjiog== - dependencies: - "@storybook/addons" "6.4.0-alpha.30" - "@storybook/api" "6.4.0-alpha.30" - "@storybook/client-api" "6.4.0-alpha.30" - "@storybook/components" "6.4.0-alpha.30" - "@storybook/node-logger" "6.4.0-alpha.30" - "@storybook/theming" "6.4.0-alpha.30" +"@storybook/addon-controls@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-6.4.19.tgz#1ebf74f7b0843ea0eccd319f5295dfa48947a975" + integrity sha512-JHi5z9i6NsgQLfG5WOeQE1AyOrM+QJLrjT+uOYx40bq+OC1yWHH7qHiphPP8kjJJhCZlaQk1qqXYkkQXgaeHSw== + dependencies: + "@storybook/addons" "6.4.19" + "@storybook/api" "6.4.19" + "@storybook/client-logger" "6.4.19" + "@storybook/components" "6.4.19" + "@storybook/core-common" "6.4.19" + "@storybook/csf" "0.0.2--canary.87bc651.0" + "@storybook/node-logger" "6.4.19" + "@storybook/store" "6.4.19" + "@storybook/theming" "6.4.19" core-js "^3.8.2" + lodash "^4.17.21" ts-dedent "^2.0.0" -"@storybook/addon-docs@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-6.4.0-alpha.30.tgz#b3299fe81aff391612826803f2b464c4e35fa474" - integrity sha512-NMgiZPeXJNff6kItRSyRX0FJxAtADatyTnyLfD+dcKxqRqs/9aXMaK0FwGceCQRB/9krvvyt+LoOUzcYmthmoQ== +"@storybook/addon-docs@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-6.4.19.tgz#229deabc74ea478c34fee96b85edb73da439680e" + integrity sha512-OEPyx/5ZXmZOPqIAWoPjlIP8Q/YfNjAmBosA8tmA8t5KCSiq/vpLcAvQhxqK6n0wk/B8Xp67Z8RpLfXjU8R3tw== dependencies: "@babel/core" "^7.12.10" "@babel/generator" "^7.12.11" @@ -3268,20 +3322,21 @@ "@mdx-js/loader" "^1.6.22" "@mdx-js/mdx" "^1.6.22" "@mdx-js/react" "^1.6.22" - "@storybook/addons" "6.4.0-alpha.30" - "@storybook/api" "6.4.0-alpha.30" - "@storybook/builder-webpack4" "6.4.0-alpha.30" - "@storybook/client-api" "6.4.0-alpha.30" - "@storybook/client-logger" "6.4.0-alpha.30" - "@storybook/components" "6.4.0-alpha.30" - "@storybook/core" "6.4.0-alpha.30" - "@storybook/core-events" "6.4.0-alpha.30" - "@storybook/csf" "0.0.1" - "@storybook/csf-tools" "6.4.0-alpha.30" - "@storybook/node-logger" "6.4.0-alpha.30" - "@storybook/postinstall" "6.4.0-alpha.30" - "@storybook/source-loader" "6.4.0-alpha.30" - "@storybook/theming" "6.4.0-alpha.30" + "@storybook/addons" "6.4.19" + "@storybook/api" "6.4.19" + "@storybook/builder-webpack4" "6.4.19" + "@storybook/client-logger" "6.4.19" + "@storybook/components" "6.4.19" + "@storybook/core" "6.4.19" + "@storybook/core-events" "6.4.19" + "@storybook/csf" "0.0.2--canary.87bc651.0" + "@storybook/csf-tools" "6.4.19" + "@storybook/node-logger" "6.4.19" + "@storybook/postinstall" "6.4.19" + "@storybook/preview-web" "6.4.19" + "@storybook/source-loader" "6.4.19" + "@storybook/store" "6.4.19" + "@storybook/theming" "6.4.19" acorn "^7.4.1" acorn-jsx "^5.3.1" acorn-walk "^7.2.0" @@ -3293,61 +3348,81 @@ html-tags "^3.1.0" js-string-escape "^1.0.1" loader-utils "^2.0.0" - lodash "^4.17.20" + lodash "^4.17.21" nanoid "^3.1.23" p-limit "^3.1.0" - prettier "^2.2.1" + prettier ">=2.2.1 <=2.3.0" prop-types "^15.7.2" - react-element-to-jsx-string "^14.3.2" + react-element-to-jsx-string "^14.3.4" regenerator-runtime "^0.13.7" remark-external-links "^8.0.0" remark-slug "^6.0.0" ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/addon-essentials@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/addon-essentials/-/addon-essentials-6.4.0-alpha.30.tgz#d199dc5176c6517f21422b6458ed2c2fc9bdf987" - integrity sha512-rMybjc9W0vqFP64gm1IF47SW/++CoBUevySa5E0SuaKcPxGDpBIAsPsJpI1EKICiIP3pdzLvvv5hGT5RxlKSKQ== - dependencies: - "@storybook/addon-actions" "6.4.0-alpha.30" - "@storybook/addon-backgrounds" "6.4.0-alpha.30" - "@storybook/addon-controls" "6.4.0-alpha.30" - "@storybook/addon-docs" "6.4.0-alpha.30" - "@storybook/addon-measure" "6.4.0-alpha.30" - "@storybook/addon-outline" "6.4.0-alpha.30" - "@storybook/addon-toolbars" "6.4.0-alpha.30" - "@storybook/addon-viewport" "6.4.0-alpha.30" - "@storybook/addons" "6.4.0-alpha.30" - "@storybook/api" "6.4.0-alpha.30" - "@storybook/node-logger" "6.4.0-alpha.30" +"@storybook/addon-essentials@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/addon-essentials/-/addon-essentials-6.4.19.tgz#20f6d65270d1f15830fb0631dfcc935fddb95137" + integrity sha512-vbV8sjepMVEuwhTDBHjO3E6vXluG7RiEeozV1QVuS9lGhjQdvUPdZ9rDNUcP6WHhTdEkS/ffTMaGIy1v8oZd7g== + dependencies: + "@storybook/addon-actions" "6.4.19" + "@storybook/addon-backgrounds" "6.4.19" + "@storybook/addon-controls" "6.4.19" + "@storybook/addon-docs" "6.4.19" + "@storybook/addon-measure" "6.4.19" + "@storybook/addon-outline" "6.4.19" + "@storybook/addon-toolbars" "6.4.19" + "@storybook/addon-viewport" "6.4.19" + "@storybook/addons" "6.4.19" + "@storybook/api" "6.4.19" + "@storybook/node-logger" "6.4.19" core-js "^3.8.2" regenerator-runtime "^0.13.7" ts-dedent "^2.0.0" -"@storybook/addon-measure@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/addon-measure/-/addon-measure-6.4.0-alpha.30.tgz#20f12113bf8f5586f197769e381f9608f7acada2" - integrity sha512-8SdzolMSAv+Qy5sGdpnP6TotabPpGT6u0oHEzl3aUeZd7y9Tcbbe9D6RDolzWfuaeFyxMx33BPOAgscw22GZ9Q== - dependencies: - "@storybook/addons" "6.4.0-alpha.30" - "@storybook/api" "6.4.0-alpha.30" - "@storybook/client-logger" "6.4.0-alpha.30" - "@storybook/components" "6.4.0-alpha.30" - "@storybook/core-events" "6.4.0-alpha.30" +"@storybook/addon-interactions@^6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/addon-interactions/-/addon-interactions-6.4.19.tgz#d39374b748e6a154e7ffff8b56db0bd88454035e" + integrity sha512-oKXxRkKL2deUI7nOLm9UvihtPaTQ2p8Y5gL2CQvJgHhTpKmUxW+e26GYNlcFUOjsx2ifXyzqNEscsZUP83BCUw== + dependencies: + "@storybook/addons" "6.4.19" + "@storybook/api" "6.4.19" + "@storybook/components" "6.4.19" + "@storybook/core-common" "6.4.19" + "@storybook/core-events" "6.4.19" + "@storybook/csf" "0.0.2--canary.87bc651.0" + "@storybook/instrumenter" "6.4.19" + "@storybook/theming" "6.4.19" + global "^4.4.0" + jest-mock "^27.0.6" + polished "^4.0.5" + ts-dedent "^2.2.0" + +"@storybook/addon-measure@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/addon-measure/-/addon-measure-6.4.19.tgz#cd648a3d07b84505863f6d9918c6023a2921a596" + integrity sha512-PXeU0AlpnGEvnzBQ6snkzmlIpwE0ci8LdFtL1Vz1V1Xk5fbuETWYuEkPuk1oZ7L9igB9cfT32SyJlE5MC1iaGg== + dependencies: + "@storybook/addons" "6.4.19" + "@storybook/api" "6.4.19" + "@storybook/client-logger" "6.4.19" + "@storybook/components" "6.4.19" + "@storybook/core-events" "6.4.19" + "@storybook/csf" "0.0.2--canary.87bc651.0" core-js "^3.8.2" global "^4.4.0" -"@storybook/addon-outline@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/addon-outline/-/addon-outline-6.4.0-alpha.30.tgz#88c7c8619f12958c7cf83fac09180a90f3a19945" - integrity sha512-T70Wjwiia/0eCIq70nZcHn+tpBJTWNUPeOcCIxUBHBlz7TSmIWgANuqp0+fttg+Skq9myR3c9+kZGUE7KaiPaA== - dependencies: - "@storybook/addons" "6.4.0-alpha.30" - "@storybook/api" "6.4.0-alpha.30" - "@storybook/client-logger" "6.4.0-alpha.30" - "@storybook/components" "6.4.0-alpha.30" - "@storybook/core-events" "6.4.0-alpha.30" +"@storybook/addon-outline@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/addon-outline/-/addon-outline-6.4.19.tgz#07990749de4286c525593cc74d49fbb120f7cf22" + integrity sha512-7ZDXo8qrms6dx0KRP9PInXIie82h5g9XCNrGOUdfZkQPvgofJVj0kNv6p+WOiGiaVfKPC5KMgIofqzBTFV+k6Q== + dependencies: + "@storybook/addons" "6.4.19" + "@storybook/api" "6.4.19" + "@storybook/client-logger" "6.4.19" + "@storybook/components" "6.4.19" + "@storybook/core-events" "6.4.19" + "@storybook/csf" "0.0.2--canary.87bc651.0" core-js "^3.8.2" global "^4.4.0" regenerator-runtime "^0.13.7" @@ -3364,81 +3439,79 @@ postcss-loader "^4.2.0" style-loader "^1.3.0" -"@storybook/addon-toolbars@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-6.4.0-alpha.30.tgz#89ee6a164bae299383ac0a456280d645cc358f79" - integrity sha512-/Caqi9d0mufq4SmRajCMgOrubPVbQjXFIkNsrcLjaaOA4QTGj3Z7LLKAJFPAfq5Vowt2YCHLwnvFjH6f+T6UYQ== +"@storybook/addon-toolbars@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-6.4.19.tgz#75a8d531c0f7bfda1c6c97d19bf95fdd2ad54d3f" + integrity sha512-2UtuX9yB1rD/CAZv1etnOnunfPTvsEKEg/J2HYMKE1lhenWC5muIUXvDXCXvwDC65WviPJ56nFNKaKK1Zz7JDg== dependencies: - "@storybook/addons" "6.4.0-alpha.30" - "@storybook/api" "6.4.0-alpha.30" - "@storybook/client-api" "6.4.0-alpha.30" - "@storybook/components" "6.4.0-alpha.30" - "@storybook/theming" "6.4.0-alpha.30" + "@storybook/addons" "6.4.19" + "@storybook/api" "6.4.19" + "@storybook/components" "6.4.19" + "@storybook/theming" "6.4.19" core-js "^3.8.2" regenerator-runtime "^0.13.7" -"@storybook/addon-viewport@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-6.4.0-alpha.30.tgz#34e48e2222d6d2bb5ebc20fb4ed5ebfe0b8d1b59" - integrity sha512-33zbNNIEyC+hF7uTFcWhIHwGNR/uEHnFM+X3kcTaZFremPznMvsYI5l0MPwaT00hSFsUiyxXaK5O6zVSw2brnw== - dependencies: - "@storybook/addons" "6.4.0-alpha.30" - "@storybook/api" "6.4.0-alpha.30" - "@storybook/client-logger" "6.4.0-alpha.30" - "@storybook/components" "6.4.0-alpha.30" - "@storybook/core-events" "6.4.0-alpha.30" - "@storybook/theming" "6.4.0-alpha.30" +"@storybook/addon-viewport@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-6.4.19.tgz#08702f5c2103c8ec5bc69344c06b85553949d274" + integrity sha512-T1hdImxbLj8suQSTbp6HSA1LLHOlqaNK5jjnqzEOoAxY0O8LNPXMJ2jKIeT2fPQ0v+tWGU3tbwf+3xFq0parVQ== + dependencies: + "@storybook/addons" "6.4.19" + "@storybook/api" "6.4.19" + "@storybook/client-logger" "6.4.19" + "@storybook/components" "6.4.19" + "@storybook/core-events" "6.4.19" + "@storybook/theming" "6.4.19" core-js "^3.8.2" global "^4.4.0" memoizerific "^1.11.3" prop-types "^15.7.2" regenerator-runtime "^0.13.7" -"@storybook/addons@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-6.4.0-alpha.30.tgz#abdb5ba7110baf600b6090082b9f25af1d4578ab" - integrity sha512-XDdNvQ13vJ5kZAFPHLXXd6p+2Dosm1n9XVtuk1hespRawYjz7xbf7ITPmwvQ0sv5L/nPfFlbogWcARJmM6/tYg== - dependencies: - "@storybook/api" "6.4.0-alpha.30" - "@storybook/channels" "6.4.0-alpha.30" - "@storybook/client-logger" "6.4.0-alpha.30" - "@storybook/core-events" "6.4.0-alpha.30" - "@storybook/router" "6.4.0-alpha.30" - "@storybook/theming" "6.4.0-alpha.30" +"@storybook/addons@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-6.4.19.tgz#797d912b8b5a86cd6e0d31fa4c42d1f80808a432" + integrity sha512-QNyRYhpqmHV8oJxxTBdkRlLSbDFhpBvfvMfIrIT1UXb/eemdBZTaCGVvXZ9UixoEEI7f8VwAQ44IvkU5B1509w== + dependencies: + "@storybook/api" "6.4.19" + "@storybook/channels" "6.4.19" + "@storybook/client-logger" "6.4.19" + "@storybook/core-events" "6.4.19" + "@storybook/csf" "0.0.2--canary.87bc651.0" + "@storybook/router" "6.4.19" + "@storybook/theming" "6.4.19" + "@types/webpack-env" "^1.16.0" core-js "^3.8.2" global "^4.4.0" regenerator-runtime "^0.13.7" -"@storybook/api@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/api/-/api-6.4.0-alpha.30.tgz#717095e9aa2febba19cb108d280d7837e575be76" - integrity sha512-BhtUu/E9lUmRczMRQ13kRTGPVs3eEinc9Acx1DFknJXv01eT0RLeF5xKbHmmhV3vEAl2vO+fInBm8EntXW0jeg== - dependencies: - "@reach/router" "^1.3.4" - "@storybook/channels" "6.4.0-alpha.30" - "@storybook/client-logger" "6.4.0-alpha.30" - "@storybook/core-events" "6.4.0-alpha.30" - "@storybook/csf" "0.0.1" - "@storybook/router" "6.4.0-alpha.30" +"@storybook/api@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/api/-/api-6.4.19.tgz#8000a0e4c52c39b910b4ccc6731419e8e71800ef" + integrity sha512-aDvea+NpQCBjpNp9YidO1Pr7fzzCp15FSdkG+2ihGQfv5raxrN+IIJnGUXecpe71nvlYiB+29UXBVK7AL0j51Q== + dependencies: + "@storybook/channels" "6.4.19" + "@storybook/client-logger" "6.4.19" + "@storybook/core-events" "6.4.19" + "@storybook/csf" "0.0.2--canary.87bc651.0" + "@storybook/router" "6.4.19" "@storybook/semver" "^7.3.2" - "@storybook/theming" "6.4.0-alpha.30" - "@types/reach__router" "^1.3.7" + "@storybook/theming" "6.4.19" core-js "^3.8.2" fast-deep-equal "^3.1.3" global "^4.4.0" - lodash "^4.17.20" + lodash "^4.17.21" memoizerific "^1.11.3" - qs "^6.10.0" regenerator-runtime "^0.13.7" store2 "^2.12.0" telejson "^5.3.2" ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/builder-webpack4@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/builder-webpack4/-/builder-webpack4-6.4.0-alpha.30.tgz#549d9fd352240653849f8c445166f449173e5780" - integrity sha512-fCvpT7pNTx+0154NWB35vGCh5l/Qbeh4DshlHaJSYV/0pfxF55HgehrxeOpc6cN/uLhJ+4ensyN0NbkceSQH/g== +"@storybook/builder-webpack4@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/builder-webpack4/-/builder-webpack4-6.4.19.tgz#ca8228639be06e50d5f1555b844dd4177e5068ad" + integrity sha512-wxA6SMH11duc9D53aeVVBwrVRemFIoxHp/dOugkkg6ZZFAb4ZmWzf/ENc3vQIZdZpfNRi7IZIZEOfoHc994cmw== dependencies: "@babel/core" "^7.12.10" "@babel/plugin-proposal-class-properties" "^7.12.1" @@ -3461,20 +3534,22 @@ "@babel/preset-env" "^7.12.11" "@babel/preset-react" "^7.12.10" "@babel/preset-typescript" "^7.12.7" - "@storybook/addons" "6.4.0-alpha.30" - "@storybook/api" "6.4.0-alpha.30" - "@storybook/channel-postmessage" "6.4.0-alpha.30" - "@storybook/channels" "6.4.0-alpha.30" - "@storybook/client-api" "6.4.0-alpha.30" - "@storybook/client-logger" "6.4.0-alpha.30" - "@storybook/components" "6.4.0-alpha.30" - "@storybook/core-common" "6.4.0-alpha.30" - "@storybook/core-events" "6.4.0-alpha.30" - "@storybook/node-logger" "6.4.0-alpha.30" - "@storybook/router" "6.4.0-alpha.30" + "@storybook/addons" "6.4.19" + "@storybook/api" "6.4.19" + "@storybook/channel-postmessage" "6.4.19" + "@storybook/channels" "6.4.19" + "@storybook/client-api" "6.4.19" + "@storybook/client-logger" "6.4.19" + "@storybook/components" "6.4.19" + "@storybook/core-common" "6.4.19" + "@storybook/core-events" "6.4.19" + "@storybook/node-logger" "6.4.19" + "@storybook/preview-web" "6.4.19" + "@storybook/router" "6.4.19" "@storybook/semver" "^7.3.2" - "@storybook/theming" "6.4.0-alpha.30" - "@storybook/ui" "6.4.0-alpha.30" + "@storybook/store" "6.4.19" + "@storybook/theming" "6.4.19" + "@storybook/ui" "6.4.19" "@types/node" "^14.0.10" "@types/webpack" "^4.41.26" autoprefixer "^9.8.6" @@ -3484,11 +3559,9 @@ case-sensitive-paths-webpack-plugin "^2.3.0" core-js "^3.8.2" css-loader "^3.6.0" - dotenv-webpack "^1.8.0" file-loader "^6.2.0" find-up "^5.0.0" fork-ts-checker-webpack-plugin "^4.1.6" - fs-extra "^9.0.1" glob "^7.1.6" glob-promise "^3.4.0" global "^4.4.0" @@ -3498,7 +3571,6 @@ postcss-flexbugs-fixes "^4.2.1" postcss-loader "^4.2.0" raw-loader "^4.0.2" - react-dev-utils "^11.0.3" stable "^0.1.8" style-loader "^1.3.0" terser-webpack-plugin "^4.2.3" @@ -3508,13 +3580,13 @@ webpack "4" webpack-dev-middleware "^3.7.3" webpack-filter-warnings-plugin "^1.2.1" - webpack-hot-middleware "^2.25.0" + webpack-hot-middleware "^2.25.1" webpack-virtual-modules "^0.2.2" -"@storybook/builder-webpack5@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/builder-webpack5/-/builder-webpack5-6.4.0-alpha.30.tgz#8dc78df8256a115ab74fad3ee6dc377a0cc9a2a7" - integrity sha512-ZJyD0H5j0SVxWHd5Cq7ys+ictt8BdZuSda2thJ4SXbqOgY1nbeeKsNwbfLj6q+PAfctl+wuI298KV3scoFu67w== +"@storybook/builder-webpack5@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/builder-webpack5/-/builder-webpack5-6.4.19.tgz#f9d3cf6e7f7769ec2eba11e226e662e4116da659" + integrity sha512-AWM4YMN1gPaf7jfntqZTCGpIQ1tF6YRU1JtczPG4ox28rTaO6NMfOBi9aRhBre/59pPOh9bF6u2gu/MIHmRW+w== dependencies: "@babel/core" "^7.12.10" "@babel/plugin-proposal-class-properties" "^7.12.1" @@ -3536,19 +3608,21 @@ "@babel/preset-env" "^7.12.11" "@babel/preset-react" "^7.12.10" "@babel/preset-typescript" "^7.12.7" - "@storybook/addons" "6.4.0-alpha.30" - "@storybook/api" "6.4.0-alpha.30" - "@storybook/channel-postmessage" "6.4.0-alpha.30" - "@storybook/channels" "6.4.0-alpha.30" - "@storybook/client-api" "6.4.0-alpha.30" - "@storybook/client-logger" "6.4.0-alpha.30" - "@storybook/components" "6.4.0-alpha.30" - "@storybook/core-common" "6.4.0-alpha.30" - "@storybook/core-events" "6.4.0-alpha.30" - "@storybook/node-logger" "6.4.0-alpha.30" - "@storybook/router" "6.4.0-alpha.30" + "@storybook/addons" "6.4.19" + "@storybook/api" "6.4.19" + "@storybook/channel-postmessage" "6.4.19" + "@storybook/channels" "6.4.19" + "@storybook/client-api" "6.4.19" + "@storybook/client-logger" "6.4.19" + "@storybook/components" "6.4.19" + "@storybook/core-common" "6.4.19" + "@storybook/core-events" "6.4.19" + "@storybook/node-logger" "6.4.19" + "@storybook/preview-web" "6.4.19" + "@storybook/router" "6.4.19" "@storybook/semver" "^7.3.2" - "@storybook/theming" "6.4.0-alpha.30" + "@storybook/store" "6.4.19" + "@storybook/theming" "6.4.19" "@types/node" "^14.0.10" babel-loader "^8.0.0" babel-plugin-macros "^3.0.1" @@ -3556,13 +3630,12 @@ case-sensitive-paths-webpack-plugin "^2.3.0" core-js "^3.8.2" css-loader "^5.0.1" - dotenv-webpack "^7.0.0" fork-ts-checker-webpack-plugin "^6.0.4" - fs-extra "^9.0.1" glob "^7.1.6" glob-promise "^3.4.0" html-webpack-plugin "^5.0.0" - react-dev-utils "^11.0.3" + path-browserify "^1.0.1" + process "^0.11.10" stable "^0.1.8" style-loader "^2.0.0" terser-webpack-plugin "^5.0.3" @@ -3570,72 +3643,85 @@ util-deprecate "^1.0.2" webpack "^5.9.0" webpack-dev-middleware "^4.1.0" - webpack-hot-middleware "^2.25.0" + webpack-hot-middleware "^2.25.1" webpack-virtual-modules "^0.4.1" -"@storybook/channel-postmessage@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-6.4.0-alpha.30.tgz#fe1d2ba04a9d2c74202c34a5a4571cd4db062771" - integrity sha512-IH/mvQL7JjBXaGQVexFGjyJKhcLaclUCarM2v9BYKiD2l8KcORcRhwURXvQHOyh1SN9zuNUm+4qZglQSHtrygg== +"@storybook/channel-postmessage@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-6.4.19.tgz#5db4e1188aaa9de05fee3ba6a6b7f3b988cade03" + integrity sha512-E5h/itFzQ/6M08LR4kqlgqqmeO3tmavI+nUAlZrkCrotpJFNMHE2i0PQHg0TkFJrRDpYcrwD+AjUW4IwdqrisQ== dependencies: - "@storybook/channels" "6.4.0-alpha.30" - "@storybook/client-logger" "6.4.0-alpha.30" - "@storybook/core-events" "6.4.0-alpha.30" + "@storybook/channels" "6.4.19" + "@storybook/client-logger" "6.4.19" + "@storybook/core-events" "6.4.19" core-js "^3.8.2" global "^4.4.0" qs "^6.10.0" telejson "^5.3.2" -"@storybook/channels@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-6.4.0-alpha.30.tgz#85afcdcf39068ab0185d656bbdf2cdef496615eb" - integrity sha512-o5Qr43ifhbNNfUpU4y4kGzDOnhj6hqzroaZ5UoSnbbT4uaKhmYeHGAKAapmI1h0rHCCXt/cocu1c4yQ4rZ0eGg== +"@storybook/channel-websocket@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/channel-websocket/-/channel-websocket-6.4.19.tgz#5b2f34f9089966bab66c55721766d3d1803edf2e" + integrity sha512-cXKwQjIXttfdUyZlcHORelUmJ5nUKswsnCA/qy7IRWpZjD8yQJcNk1dYC+tTHDVqFgdRT89pL0hRRB1rlaaR8Q== + dependencies: + "@storybook/channels" "6.4.19" + "@storybook/client-logger" "6.4.19" + core-js "^3.8.2" + global "^4.4.0" + telejson "^5.3.2" + +"@storybook/channels@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-6.4.19.tgz#095bbaee494bf5b03f7cb92d34626f2f5063cb31" + integrity sha512-EwyoncFvTfmIlfsy8jTfayCxo2XchPkZk/9txipugWSmc057HdklMKPLOHWP0z5hLH0IbVIKXzdNISABm36jwQ== dependencies: core-js "^3.8.2" ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/client-api@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-6.4.0-alpha.30.tgz#d4157f791eeace8c23331acd15a533fa90041ff8" - integrity sha512-joxsV6Y1LI96sLfIjwUIgTYxxoMHif+6srYBJwNOevO24EAr21+qp8ytu8V323VJmMWbphKNWgdYHHQM/TJEhA== - dependencies: - "@storybook/addons" "6.4.0-alpha.30" - "@storybook/channel-postmessage" "6.4.0-alpha.30" - "@storybook/channels" "6.4.0-alpha.30" - "@storybook/client-logger" "6.4.0-alpha.30" - "@storybook/core-events" "6.4.0-alpha.30" - "@storybook/csf" "0.0.1" +"@storybook/client-api@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-6.4.19.tgz#131597e160f112f51240a4e407191053e5ed972f" + integrity sha512-OCrT5Um3FDvZnimQKwWtwsaI+5agPwq2i8YiqlofrI/NPMKp0I7DEkCGwE5IRD1Q8BIKqHcMo5tTmfYi0AxyOg== + dependencies: + "@storybook/addons" "6.4.19" + "@storybook/channel-postmessage" "6.4.19" + "@storybook/channels" "6.4.19" + "@storybook/client-logger" "6.4.19" + "@storybook/core-events" "6.4.19" + "@storybook/csf" "0.0.2--canary.87bc651.0" + "@storybook/store" "6.4.19" "@types/qs" "^6.9.5" "@types/webpack-env" "^1.16.0" core-js "^3.8.2" + fast-deep-equal "^3.1.3" global "^4.4.0" - lodash "^4.17.20" + lodash "^4.17.21" memoizerific "^1.11.3" qs "^6.10.0" regenerator-runtime "^0.13.7" - stable "^0.1.8" store2 "^2.12.0" + synchronous-promise "^2.0.15" ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/client-logger@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-6.4.0-alpha.30.tgz#7ec4f841b3d3c0680effde0409cb22795a6e2d52" - integrity sha512-v0jQ7KKsMLwyqjc+YYMeT4ZMrkV4kibvxb0eOPLa3Vgdn3u8nezjdgZXsMY1iV5eL0cFKmka7l/eUQI8621xBg== +"@storybook/client-logger@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-6.4.19.tgz#b2011ad2fa446cce4a9afdb41974b2a576e9fad2" + integrity sha512-zmg/2wyc9W3uZrvxaW4BfHcr40J0v7AGslqYXk9H+ERLVwIvrR4NhxQFaS6uITjBENyRDxwzfU3Va634WcmdDQ== dependencies: core-js "^3.8.2" global "^4.4.0" -"@storybook/components@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-6.4.0-alpha.30.tgz#e64629adec5c12ee1311b1888948f1495c1fed83" - integrity sha512-16xOt6KDts7MOliSGUP0A55rQ3uIFGtW8G+LoEGyu56w3tEVoQrWV9/5GYAVbuL18KvgONB8xJQw5HKsAoVbIQ== +"@storybook/components@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-6.4.19.tgz#084ba21f26a3eeab82f45178de6899688eecb2fc" + integrity sha512-q/0V37YAJA7CNc+wSiiefeM9+3XVk8ixBNylY36QCGJgIeGQ5/79vPyUe6K4lLmsQwpmZsIq1s1Ad5+VbboeOA== dependencies: "@popperjs/core" "^2.6.0" - "@storybook/client-logger" "6.4.0-alpha.30" - "@storybook/csf" "0.0.1" - "@storybook/theming" "6.4.0-alpha.30" + "@storybook/client-logger" "6.4.19" + "@storybook/csf" "0.0.2--canary.87bc651.0" + "@storybook/theming" "6.4.19" "@types/color-convert" "^2.0.0" "@types/overlayscrollbars" "^1.12.0" "@types/react-syntax-highlighter" "11.0.5" @@ -3643,7 +3729,7 @@ core-js "^3.8.2" fast-deep-equal "^3.1.3" global "^4.4.0" - lodash "^4.17.20" + lodash "^4.17.21" markdown-to-jsx "^7.1.3" memoizerific "^1.11.3" overlayscrollbars "^1.13.1" @@ -3657,33 +3743,36 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/core-client@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/core-client/-/core-client-6.4.0-alpha.30.tgz#082b0bfb716a005e2dc1fdedb220da2050030f3b" - integrity sha512-SPZXF1A2Uc+7r5nrfPqzCM7rOAL2msdhB54lqzrRZf7kLaiRCgQpt+ZfvV3+XBpyGjrA32ok62vE1HN9Q2jh9g== - dependencies: - "@storybook/addons" "6.4.0-alpha.30" - "@storybook/channel-postmessage" "6.4.0-alpha.30" - "@storybook/client-api" "6.4.0-alpha.30" - "@storybook/client-logger" "6.4.0-alpha.30" - "@storybook/core-events" "6.4.0-alpha.30" - "@storybook/csf" "0.0.1" - "@storybook/ui" "6.4.0-alpha.30" +"@storybook/core-client@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/core-client/-/core-client-6.4.19.tgz#fc6902c4321ae9e7c2858126172bc0752a84321c" + integrity sha512-rQHRZjhArPleE7/S8ZUolgzwY+hC0smSKX/3PQxO2GcebDjnJj6+iSV3h+aSMHMmTdoCQvjYw9aBpT8scuRe+A== + dependencies: + "@storybook/addons" "6.4.19" + "@storybook/channel-postmessage" "6.4.19" + "@storybook/channel-websocket" "6.4.19" + "@storybook/client-api" "6.4.19" + "@storybook/client-logger" "6.4.19" + "@storybook/core-events" "6.4.19" + "@storybook/csf" "0.0.2--canary.87bc651.0" + "@storybook/preview-web" "6.4.19" + "@storybook/store" "6.4.19" + "@storybook/ui" "6.4.19" airbnb-js-shims "^2.2.1" ansi-to-html "^0.6.11" core-js "^3.8.2" global "^4.4.0" - lodash "^4.17.20" + lodash "^4.17.21" qs "^6.10.0" regenerator-runtime "^0.13.7" ts-dedent "^2.0.0" unfetch "^4.2.0" util-deprecate "^1.0.2" -"@storybook/core-common@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/core-common/-/core-common-6.4.0-alpha.30.tgz#f03b99a0bcc11401bfdfcd5c6a71a79001b84ee6" - integrity sha512-4lyI0xh/s0P0EYzHDYHOnLdbOpk63/pZwayrmsLMuSfGIZUV/mJmJ2kyeqY4/aLxYDfAiVlFEQ/qm3UFEiR/Hw== +"@storybook/core-common@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/core-common/-/core-common-6.4.19.tgz#18e6c6095ebd9a94b074529917c693084921d3ca" + integrity sha512-X1pJJkO48DFxl6iyEemIKqRkJ7j9/cBh3BRBUr+xZHXBvnD0GKDXIocwh0PjSxSC6XSu3UCQnqtKi3PbjRl8Dg== dependencies: "@babel/core" "^7.12.10" "@babel/plugin-proposal-class-properties" "^7.12.1" @@ -3706,9 +3795,8 @@ "@babel/preset-react" "^7.12.10" "@babel/preset-typescript" "^7.12.7" "@babel/register" "^7.12.1" - "@storybook/node-logger" "6.4.0-alpha.30" + "@storybook/node-logger" "6.4.19" "@storybook/semver" "^7.3.2" - "@types/micromatch" "^4.0.1" "@types/node" "^14.0.10" "@types/pretty-hrtime" "^1.0.0" babel-loader "^8.0.0" @@ -3720,76 +3808,89 @@ file-system-cache "^1.0.5" find-up "^5.0.0" fork-ts-checker-webpack-plugin "^6.0.4" + fs-extra "^9.0.1" glob "^7.1.6" + handlebars "^4.7.7" interpret "^2.2.0" json5 "^2.1.3" lazy-universal-dotenv "^3.0.1" - micromatch "^4.0.2" + picomatch "^2.3.0" pkg-dir "^5.0.0" pretty-hrtime "^1.0.3" resolve-from "^5.0.0" + slash "^3.0.0" + telejson "^5.3.2" ts-dedent "^2.0.0" util-deprecate "^1.0.2" webpack "4" -"@storybook/core-events@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-6.4.0-alpha.30.tgz#9566989f952bb8354ada274c3210f5cc3bf146b3" - integrity sha512-yn4I9OIQ3UeYM/sQHptrsj8HlMR0O6MxtCTpQH4t7ccQ8sgaWh8JcOjSZ3/TKXxYulYQsooOlfRdu+4IrVLP+Q== +"@storybook/core-events@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-6.4.19.tgz#d2a03156783a3cb9bd9f7ba81a06a798a5c296ae" + integrity sha512-KICzUw6XVQUJzFSCXfvhfHAuyhn4Q5J4IZEfuZkcGJS4ODkrO6tmpdYE5Cfr+so95Nfp0ErWiLUuodBsW9/rtA== dependencies: core-js "^3.8.2" -"@storybook/core-server@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/core-server/-/core-server-6.4.0-alpha.30.tgz#999cf4ee1609609fcb26c73903de37cb8e17415e" - integrity sha512-uVkg2H6dkQQDdwet0Icf4aBrnlxkMT5Vjq2/kF6KCxtJPI0tg/cW8W2J4WMHbaXy4aLnDL2btKgqBxA/iKeJSg== - dependencies: - "@storybook/builder-webpack4" "6.4.0-alpha.30" - "@storybook/core-client" "6.4.0-alpha.30" - "@storybook/core-common" "6.4.0-alpha.30" - "@storybook/csf-tools" "6.4.0-alpha.30" - "@storybook/manager-webpack4" "6.4.0-alpha.30" - "@storybook/node-logger" "6.4.0-alpha.30" +"@storybook/core-server@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/core-server/-/core-server-6.4.19.tgz#0d1b4b2094749b8bce03e3d01422e14e5fef8e66" + integrity sha512-bKsUB9f7hl5ya2JXxpIrErmbDQjoH39FVbzYZWjMo4t/b7+Xyi6vYadwyWcqlpUQmis09ZaSMv8L/Tw0TuwLAA== + dependencies: + "@discoveryjs/json-ext" "^0.5.3" + "@storybook/builder-webpack4" "6.4.19" + "@storybook/core-client" "6.4.19" + "@storybook/core-common" "6.4.19" + "@storybook/core-events" "6.4.19" + "@storybook/csf" "0.0.2--canary.87bc651.0" + "@storybook/csf-tools" "6.4.19" + "@storybook/manager-webpack4" "6.4.19" + "@storybook/node-logger" "6.4.19" "@storybook/semver" "^7.3.2" + "@storybook/store" "6.4.19" "@types/node" "^14.0.10" "@types/node-fetch" "^2.5.7" "@types/pretty-hrtime" "^1.0.0" "@types/webpack" "^4.41.26" better-opn "^2.1.1" - boxen "^4.2.0" + boxen "^5.1.2" chalk "^4.1.0" - cli-table3 "0.6.0" + cli-table3 "^0.6.1" commander "^6.2.1" compression "^1.7.4" core-js "^3.8.2" - cpy "^8.1.1" + cpy "^8.1.2" detect-port "^1.3.0" express "^4.17.1" file-system-cache "^1.0.5" fs-extra "^9.0.1" globby "^11.0.2" ip "^1.1.5" + lodash "^4.17.21" node-fetch "^2.6.1" pretty-hrtime "^1.0.3" prompts "^2.4.0" regenerator-runtime "^0.13.7" serve-favicon "^2.5.0" + slash "^3.0.0" + telejson "^5.3.3" ts-dedent "^2.0.0" util-deprecate "^1.0.2" + watchpack "^2.2.0" webpack "4" + ws "^8.2.3" -"@storybook/core@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/core/-/core-6.4.0-alpha.30.tgz#ba01198aa9ab4421ad6a811b896ae2d8f80dbbce" - integrity sha512-KoGYfQFWxfT91pF5V5Dnh/Vgim66QbbgMtbUKZWOkspj9QKRXuCXujdsRCn0Ncz9DxobNmiKoAKtnZJYdrroGA== +"@storybook/core@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/core/-/core-6.4.19.tgz#58dd055bcc0ef335e0e0d3f6eca74b4d4d49eba1" + integrity sha512-55LOQ/h/kf1jMhjN85t/pIEdIwWEG9yV7bdwv3niVvmoypCxyyjn9/QNK0RKYAeDSUtdm6FVoJ6k5CpxWz2d8w== dependencies: - "@storybook/core-client" "6.4.0-alpha.30" - "@storybook/core-server" "6.4.0-alpha.30" + "@storybook/core-client" "6.4.19" + "@storybook/core-server" "6.4.19" -"@storybook/csf-tools@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/csf-tools/-/csf-tools-6.4.0-alpha.30.tgz#2141baca7933486038388b0af56d87cb508fa8aa" - integrity sha512-3BT4QxuM57g/Xzxl14mIiZ2QnxxXkBjEDwwQf1A5pzyqaS3+Yi8GDmWiAB0/J8x4/LK71uxDsy63j9kDZUBvbQ== +"@storybook/csf-tools@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/csf-tools/-/csf-tools-6.4.19.tgz#28bdea11da17501a8bc4e761b821d7721880eaf6" + integrity sha512-gf/zRhGoAVsFwSyV2tc+jeJfZQkxF6QsaZgbUSe24/IUvGFCT/PS/jZq1qy7dECAwrTOfykgu8juyBtj6WhWyw== dependencies: "@babel/core" "^7.12.10" "@babel/generator" "^7.12.11" @@ -3799,36 +3900,47 @@ "@babel/traverse" "^7.12.11" "@babel/types" "^7.12.11" "@mdx-js/mdx" "^1.6.22" - "@storybook/csf" "^0.0.1" + "@storybook/csf" "0.0.2--canary.87bc651.0" core-js "^3.8.2" fs-extra "^9.0.1" global "^4.4.0" js-string-escape "^1.0.1" - lodash "^4.17.20" - prettier "^2.2.1" + lodash "^4.17.21" + prettier ">=2.2.1 <=2.3.0" regenerator-runtime "^0.13.7" + ts-dedent "^2.0.0" -"@storybook/csf@0.0.1", "@storybook/csf@^0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.0.1.tgz#95901507dc02f0bc6f9ac8ee1983e2fc5bb98ce6" - integrity sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw== +"@storybook/csf@0.0.2--canary.87bc651.0": + version "0.0.2--canary.87bc651.0" + resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.0.2--canary.87bc651.0.tgz#c7b99b3a344117ef67b10137b6477a3d2750cf44" + integrity sha512-ajk1Uxa+rBpFQHKrCcTmJyQBXZ5slfwHVEaKlkuFaW77it8RgbPJp/ccna3sgoi8oZ7FkkOyvv1Ve4SmwFqRqw== dependencies: lodash "^4.17.15" -"@storybook/manager-webpack4@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/manager-webpack4/-/manager-webpack4-6.4.0-alpha.30.tgz#410d001ed4069f30b20f4f7bd014b08dcd4d45c3" - integrity sha512-S6oDRildo3612IwpDc3zU5QCbDqm0DOfFUQIPuEmJwI88WXMCTvAzYG1j0ntgvm/43713QKmZImbK5C85iXdLg== +"@storybook/instrumenter@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/instrumenter/-/instrumenter-6.4.19.tgz#1586624d0315713c20f3d7b4e2c7fc595730b934" + integrity sha512-KwOJUW7tItZw1CLffUbaSfEzH1p1HdGmJs1Q42uWGJSbXbVHZ7i7bJWYb3Lf90+yHTlqQjTr1PKAymwDwHseTA== + dependencies: + "@storybook/addons" "6.4.19" + "@storybook/client-logger" "6.4.19" + "@storybook/core-events" "6.4.19" + global "^4.4.0" + +"@storybook/manager-webpack4@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/manager-webpack4/-/manager-webpack4-6.4.19.tgz#999577afb9b9a57fc478f7c5e5d95d785ea69da3" + integrity sha512-R8ugZjTYqXvlc6gDOcw909L65sIleOmIJLZR+N6/H85MivGXHu39jOwONqB7tVACufRty4FNecn8tEiQL2SAKA== dependencies: "@babel/core" "^7.12.10" "@babel/plugin-transform-template-literals" "^7.12.1" "@babel/preset-react" "^7.12.10" - "@storybook/addons" "6.4.0-alpha.30" - "@storybook/core-client" "6.4.0-alpha.30" - "@storybook/core-common" "6.4.0-alpha.30" - "@storybook/node-logger" "6.4.0-alpha.30" - "@storybook/theming" "6.4.0-alpha.30" - "@storybook/ui" "6.4.0-alpha.30" + "@storybook/addons" "6.4.19" + "@storybook/core-client" "6.4.19" + "@storybook/core-common" "6.4.19" + "@storybook/node-logger" "6.4.19" + "@storybook/theming" "6.4.19" + "@storybook/ui" "6.4.19" "@types/node" "^14.0.10" "@types/webpack" "^4.41.26" babel-loader "^8.0.0" @@ -3836,7 +3948,6 @@ chalk "^4.1.0" core-js "^3.8.2" css-loader "^3.6.0" - dotenv-webpack "^1.8.0" express "^4.17.1" file-loader "^6.2.0" file-system-cache "^1.0.5" @@ -3858,34 +3969,33 @@ webpack-dev-middleware "^3.7.3" webpack-virtual-modules "^0.2.2" -"@storybook/manager-webpack5@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/manager-webpack5/-/manager-webpack5-6.4.0-alpha.30.tgz#c820fb0960105ab7ea6eaa0fc4d6e86ce1a07bfb" - integrity sha512-6Df9F5hjzT2TLroHQ/q8FL70iBJ7Hnm4bHKthtA9ZhRXbzu2d1l78pLSDG+/P6Oc01gHHPk+c8cWhI5VhWJgEw== +"@storybook/manager-webpack5@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/manager-webpack5/-/manager-webpack5-6.4.19.tgz#161809337b69e6c4ea6a4eb6f881a32760bbeb60" + integrity sha512-hVjWhWAOgWaymBy0HeRskN+MfKLpqLP4Txfw+3Xqg1qplgexV0w2O4BQrS/SNEH4V/1qF9h8XTsk3L3oQIj3Mg== dependencies: "@babel/core" "^7.12.10" "@babel/plugin-transform-template-literals" "^7.12.1" "@babel/preset-react" "^7.12.10" - "@storybook/addons" "6.4.0-alpha.30" - "@storybook/core-client" "6.4.0-alpha.30" - "@storybook/core-common" "6.4.0-alpha.30" - "@storybook/node-logger" "6.4.0-alpha.30" - "@storybook/theming" "6.4.0-alpha.30" - "@storybook/ui" "6.4.0-alpha.30" + "@storybook/addons" "6.4.19" + "@storybook/core-client" "6.4.19" + "@storybook/core-common" "6.4.19" + "@storybook/node-logger" "6.4.19" + "@storybook/theming" "6.4.19" + "@storybook/ui" "6.4.19" "@types/node" "^14.0.10" babel-loader "^8.0.0" case-sensitive-paths-webpack-plugin "^2.3.0" chalk "^4.1.0" core-js "^3.8.2" css-loader "^5.0.1" - dotenv-webpack "^7.0.0" express "^4.17.1" - file-loader "^6.2.0" file-system-cache "^1.0.5" find-up "^5.0.0" fs-extra "^9.0.1" html-webpack-plugin "^5.0.0" node-fetch "^2.6.1" + process "^0.11.10" read-pkg-up "^7.0.1" regenerator-runtime "^0.13.7" resolve-from "^5.0.0" @@ -3893,21 +4003,20 @@ telejson "^5.3.2" terser-webpack-plugin "^5.0.3" ts-dedent "^2.0.0" - url-loader "^4.1.1" util-deprecate "^1.0.2" webpack "^5.9.0" webpack-dev-middleware "^4.1.0" webpack-virtual-modules "^0.4.1" -"@storybook/node-logger@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-6.4.0-alpha.30.tgz#bb8ef265912d427fc509bb7ae912b4cb8515dffd" - integrity sha512-NlccUzRXBOqj1BHjDEwPXKsg8762l5QktIR9QwC7IMtbDbV0+Nfo/uPQP0nOwoZaQDc0KqAt2NxBu9pTRmNQNA== +"@storybook/node-logger@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-6.4.19.tgz#554f9efad4e95ce6fa63222d026f43258293c896" + integrity sha512-hO2Aar3PgPnPtNq2fVgiuGlqo3EEVR6TKVBXMq7foL3tN2k4BQFKLDHbm5qZQQntyYKurKsRUGKPJFPuI1ov/w== dependencies: "@types/npmlog" "^4.1.2" chalk "^4.1.0" core-js "^3.8.2" - npmlog "^4.1.2" + npmlog "^5.0.1" pretty-hrtime "^1.0.3" "@storybook/node-logger@^6.1.14": @@ -3921,13 +4030,35 @@ npmlog "^4.1.2" pretty-hrtime "^1.0.3" -"@storybook/postinstall@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/postinstall/-/postinstall-6.4.0-alpha.30.tgz#6ca9a3ab84219986a76798e8702564c10b369fcf" - integrity sha512-JeY+SR+0nIyFlJwlM9PfNuaPHidN3NMRDdF45wZV3WAqpt+6tzWacTOFuNwMCnp06HZWaIgehi4iJB2adZo6OQ== +"@storybook/postinstall@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/postinstall/-/postinstall-6.4.19.tgz#ba9799e30a727e39f51168f9c193aab99ef87bdf" + integrity sha512-/0tHHxyIV82zt1rw4BW70GmrQbDVu9IJPAxOqFzGjC1fNojwJ53mK6FfUsOzbhG5mWk5p0Ip5+zr74moP119AA== dependencies: core-js "^3.8.2" +"@storybook/preview-web@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/preview-web/-/preview-web-6.4.19.tgz#bdfab7b2f760caf72140229dd64fd57617ad000b" + integrity sha512-jqltoBv5j7lvnxEfV9w8dLX9ASWGuvgz97yg8Yo5FqkftEwrHJenyvMGcTgDJKJPorF+wiz/9aIqnmd3LCAcZQ== + dependencies: + "@storybook/addons" "6.4.19" + "@storybook/channel-postmessage" "6.4.19" + "@storybook/client-logger" "6.4.19" + "@storybook/core-events" "6.4.19" + "@storybook/csf" "0.0.2--canary.87bc651.0" + "@storybook/store" "6.4.19" + ansi-to-html "^0.6.11" + core-js "^3.8.2" + global "^4.4.0" + lodash "^4.17.21" + qs "^6.10.0" + regenerator-runtime "^0.13.7" + synchronous-promise "^2.0.15" + ts-dedent "^2.0.0" + unfetch "^4.2.0" + util-deprecate "^1.0.2" + "@storybook/react-docgen-typescript-plugin@1.0.2-canary.253f8c1.0": version "1.0.2-canary.253f8c1.0" resolved "https://registry.yarnpkg.com/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.2-canary.253f8c1.0.tgz#f2da40e6aae4aa586c2fb284a4a1744602c3c7fa" @@ -3941,49 +4072,51 @@ react-docgen-typescript "^2.0.0" tslib "^2.0.0" -"@storybook/react@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/react/-/react-6.4.0-alpha.30.tgz#c6c7e27db2af5d3c5023b5f76b708aff9e3cbc0f" - integrity sha512-7vmpUvteB2vF84qb8GZdLCZ1ZvIgMLsip+yr0dp3mPr2wxoEDxZnbx8sa1bpwV4QnFc8Fe9HU4ZC20L0MQOWxg== +"@storybook/react@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/react/-/react-6.4.19.tgz#1707b785b5a65c867e291ede12113e7fd55f8998" + integrity sha512-5b3i8jkVrjQGmcxxxXwCduHPIh+cluWkfeweKeQOe+lW4BR8fuUICo3AMLrYPAtB/UcaJyYkIYmTvF2mkfepFA== dependencies: "@babel/preset-flow" "^7.12.1" "@babel/preset-react" "^7.12.10" - "@pmmmwh/react-refresh-webpack-plugin" "^0.5.0-rc.2" - "@storybook/addons" "6.4.0-alpha.30" - "@storybook/core" "6.4.0-alpha.30" - "@storybook/core-common" "6.4.0-alpha.30" - "@storybook/node-logger" "6.4.0-alpha.30" + "@pmmmwh/react-refresh-webpack-plugin" "^0.5.1" + "@storybook/addons" "6.4.19" + "@storybook/core" "6.4.19" + "@storybook/core-common" "6.4.19" + "@storybook/csf" "0.0.2--canary.87bc651.0" + "@storybook/node-logger" "6.4.19" "@storybook/react-docgen-typescript-plugin" "1.0.2-canary.253f8c1.0" "@storybook/semver" "^7.3.2" + "@storybook/store" "6.4.19" "@types/webpack-env" "^1.16.0" babel-plugin-add-react-displayname "^0.0.5" babel-plugin-named-asset-import "^0.3.1" babel-plugin-react-docgen "^4.2.1" core-js "^3.8.2" global "^4.4.0" - lodash "^4.17.20" + lodash "^4.17.21" prop-types "^15.7.2" - react-dev-utils "^11.0.3" - react-refresh "^0.10.0" + react-refresh "^0.11.0" read-pkg-up "^7.0.1" regenerator-runtime "^0.13.7" ts-dedent "^2.0.0" webpack "4" -"@storybook/router@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/router/-/router-6.4.0-alpha.30.tgz#751cb41103c468e12bc45c7008a9ee91fa657628" - integrity sha512-6Ov4vqlpTE4HfmkbGFZ2d520NGkD2EPH1EV2QPyG12kXC1UjL1YNfqno7+GLG7GfsI0kqlWIxrObGZManUib5A== +"@storybook/router@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/router/-/router-6.4.19.tgz#e653224dd9a521836bbd2610f604f609a2c77af2" + integrity sha512-KWWwIzuyeEIWVezkCihwY2A76Il9tUNg0I410g9qT7NrEsKyqXGRYOijWub7c1GGyNjLqz0jtrrehtixMcJkuA== dependencies: - "@reach/router" "^1.3.4" - "@storybook/client-logger" "6.4.0-alpha.30" - "@types/reach__router" "^1.3.7" + "@storybook/client-logger" "6.4.19" core-js "^3.8.2" fast-deep-equal "^3.1.3" global "^4.4.0" - lodash "^4.17.20" + history "5.0.0" + lodash "^4.17.21" memoizerific "^1.11.3" qs "^6.10.0" + react-router "^6.0.0" + react-router-dom "^6.0.0" ts-dedent "^2.0.0" "@storybook/semver@^7.3.2": @@ -3994,31 +4127,52 @@ core-js "^3.6.5" find-up "^4.1.0" -"@storybook/source-loader@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/source-loader/-/source-loader-6.4.0-alpha.30.tgz#65e6ce6c6e8889b85fe49ce493e34b5d59ee3994" - integrity sha512-l+2hkobWl/t7JDLhoVf27pEG50D3IxfPsgOyx+PgJFDEb4nFDfwyIIRMmCoNvtQBv92yCVJuiR0/n2VC4aOtUQ== +"@storybook/source-loader@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/source-loader/-/source-loader-6.4.19.tgz#24d134750bc41a13255b2b4a545f2d82613f004f" + integrity sha512-XqTsqddRglvfW7mhyjwoqd/B8L6samcBehhO0OEbsFp6FPWa9eXuObCxtRYIcjcSIe+ksbW3D/54ppEs1L/g1Q== dependencies: - "@storybook/addons" "6.4.0-alpha.30" - "@storybook/client-logger" "6.4.0-alpha.30" - "@storybook/csf" "0.0.1" + "@storybook/addons" "6.4.19" + "@storybook/client-logger" "6.4.19" + "@storybook/csf" "0.0.2--canary.87bc651.0" core-js "^3.8.2" estraverse "^5.2.0" global "^4.4.0" loader-utils "^2.0.0" - lodash "^4.17.20" - prettier "^2.2.1" + lodash "^4.17.21" + prettier ">=2.2.1 <=2.3.0" regenerator-runtime "^0.13.7" -"@storybook/theming@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-6.4.0-alpha.30.tgz#0619969aa256ef454c867783fcbf3a3ec8ed7b38" - integrity sha512-X0klrptnDPYRnK54xT9L9E5ktt+YcZUOVK2uCLxFHERlyV7twf3bd0CwSjY9xAGFSGES19PZVyboU5Kik4b5mw== +"@storybook/store@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/store/-/store-6.4.19.tgz#bf4031499f4d49909d7b691c03cc5ef1ec00ad74" + integrity sha512-N9/ZjemRHGfT3InPIbqQqc6snkcfnf3Qh9oOr0smbfaVGJol//KOX65kzzobtzFcid0WxtTDZ3HmgFVH+GvuhQ== + dependencies: + "@storybook/addons" "6.4.19" + "@storybook/client-logger" "6.4.19" + "@storybook/core-events" "6.4.19" + "@storybook/csf" "0.0.2--canary.87bc651.0" + core-js "^3.8.2" + fast-deep-equal "^3.1.3" + global "^4.4.0" + lodash "^4.17.21" + memoizerific "^1.11.3" + regenerator-runtime "^0.13.7" + slash "^3.0.0" + stable "^0.1.8" + synchronous-promise "^2.0.15" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/theming@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-6.4.19.tgz#0a6834d91e0b0eadbb10282e7fb2947e2bbf9e9e" + integrity sha512-V4pWmTvAxmbHR6B3jA4hPkaxZPyExHvCToy7b76DpUTpuHihijNDMAn85KhOQYIeL9q14zP/aiz899tOHsOidg== dependencies: "@emotion/core" "^10.1.1" "@emotion/is-prop-valid" "^0.8.6" "@emotion/styled" "^10.0.27" - "@storybook/client-logger" "6.4.0-alpha.30" + "@storybook/client-logger" "6.4.19" core-js "^3.8.2" deep-object-diff "^1.1.0" emotion-theming "^10.0.27" @@ -4028,21 +4182,21 @@ resolve-from "^5.0.0" ts-dedent "^2.0.0" -"@storybook/ui@6.4.0-alpha.30": - version "6.4.0-alpha.30" - resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-6.4.0-alpha.30.tgz#9cffc7782e81bebe592c5fa5f8a65dd9b0a95ecc" - integrity sha512-jAJuD5eDq9X5hqZveXpOVJTU7EH+QeOpV40IRpRb9I+LgNTilG/mx8uv3xjcxcuRCmgcBEY6DRD6a/lQTuJ3Eg== +"@storybook/ui@6.4.19": + version "6.4.19" + resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-6.4.19.tgz#1fb9f6cd875ee4937cf9d81ca45d5156800176d1" + integrity sha512-gFwdn5LA2U6oQ4bfUFLyHZnNasGQ01YVdwjbi+l6yjmnckBNtZfJoVTZ1rzGUbxSE9rK48InJRU+latTsr7xAg== dependencies: "@emotion/core" "^10.1.1" - "@storybook/addons" "6.4.0-alpha.30" - "@storybook/api" "6.4.0-alpha.30" - "@storybook/channels" "6.4.0-alpha.30" - "@storybook/client-logger" "6.4.0-alpha.30" - "@storybook/components" "6.4.0-alpha.30" - "@storybook/core-events" "6.4.0-alpha.30" - "@storybook/router" "6.4.0-alpha.30" + "@storybook/addons" "6.4.19" + "@storybook/api" "6.4.19" + "@storybook/channels" "6.4.19" + "@storybook/client-logger" "6.4.19" + "@storybook/components" "6.4.19" + "@storybook/core-events" "6.4.19" + "@storybook/router" "6.4.19" "@storybook/semver" "^7.3.2" - "@storybook/theming" "6.4.0-alpha.30" + "@storybook/theming" "6.4.19" copy-to-clipboard "^3.3.1" core-js "^3.8.2" core-js-pure "^3.8.2" @@ -4050,7 +4204,7 @@ emotion-theming "^10.0.27" fuse.js "^3.6.1" global "^4.4.0" - lodash "^4.17.20" + lodash "^4.17.21" markdown-to-jsx "^7.1.3" memoizerific "^1.11.3" polished "^4.0.5" @@ -4151,11 +4305,6 @@ "@types/connect" "*" "@types/node" "*" -"@types/braces@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/braces/-/braces-3.0.1.tgz#5a284d193cfc61abb2e5a50d36ebbc50d942a32b" - integrity sha512-+euflG6ygo4bn0JHtn4pYqcXwRtLvElQ7/nnjDu7iYG56H0+OhCd7d6Ug0IE3WcFpZozBKW2+80FUbv5QGk5AQ== - "@types/cacheable-request@^6.0.1": version "6.0.2" resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9" @@ -4350,13 +4499,6 @@ dependencies: "@types/unist" "*" -"@types/micromatch@^4.0.1": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/micromatch/-/micromatch-4.0.2.tgz#ce29c8b166a73bf980a5727b1e4a4d099965151d" - integrity sha512-oqXqVb0ci19GtH0vOA/U2TmHTcRY9kuZl4mqUxe0QmJAlIW13kzhuK5pi1i9+ngav8FjpSb9FVS/GE00GLX1VA== - dependencies: - "@types/braces" "*" - "@types/mime@^1": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" @@ -4460,13 +4602,6 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/reach__router@^1.3.7": - version "1.3.9" - resolved "https://registry.yarnpkg.com/@types/reach__router/-/reach__router-1.3.9.tgz#d3aaac0072665c81063cc6c557c18dadd642b226" - integrity sha512-N6rqQqTTAV/zKLfK3iq9Ww3wqCEhTZvsilhl0zI09zETdVq1QGmJH6+/xnj8AFUWIrle2Cqo+PGM/Ltr1vBb9w== - dependencies: - "@types/react" "*" - "@types/react-syntax-highlighter@11.0.5": version "11.0.5" resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.5.tgz#0d546261b4021e1f9d85b50401c0a42acb106087" @@ -5168,7 +5303,7 @@ acorn@^8.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== -address@1.1.2, address@^1.0.1: +address@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== @@ -5287,16 +5422,11 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" -ansi-html-community@0.0.8: +ansi-html-community@0.0.8, ansi-html-community@^0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== -ansi-html@0.0.7, ansi-html@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -5317,6 +5447,11 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -5374,11 +5509,24 @@ aproba@^1.0.3, aproba@^1.1.1: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + arch@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + are-we-there-yet@~1.1.2: version "1.1.5" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" @@ -6009,19 +6157,19 @@ boxen@^1.3.0: term-size "^1.2.0" widest-line "^2.0.0" -boxen@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" - integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== +boxen@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== dependencies: ansi-align "^3.0.0" - camelcase "^5.3.1" - chalk "^3.0.0" - cli-boxes "^2.2.0" - string-width "^4.1.0" - term-size "^2.1.0" - type-fest "^0.8.1" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" widest-line "^3.1.0" + wrap-ansi "^7.0.0" brace-expansion@^1.1.7: version "1.1.11" @@ -6147,39 +6295,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@4.14.2: - version "4.14.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.2.tgz#1b3cec458a1ba87588cc5e9be62f19b6d48813ce" - integrity sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw== - dependencies: - caniuse-lite "^1.0.30001125" - electron-to-chromium "^1.3.564" - escalade "^3.0.2" - node-releases "^1.1.61" - -browserslist@^4.0.0, browserslist@^4.1.0, browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4.16.8: - version "4.16.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.8.tgz#cb868b0b554f137ba6e33de0ecff2eda403c4fb0" - integrity sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ== - dependencies: - caniuse-lite "^1.0.30001251" - colorette "^1.3.0" - electron-to-chromium "^1.3.811" - escalade "^3.1.1" - node-releases "^1.1.75" - -browserslist@^4.14.5: - version "4.17.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.0.tgz#1fcd81ec75b41d6d4994fb0831b92ac18c01649c" - integrity sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g== - dependencies: - caniuse-lite "^1.0.30001254" - colorette "^1.3.0" - electron-to-chromium "^1.3.830" - escalade "^3.1.1" - node-releases "^1.1.75" - -browserslist@^4.16.0, browserslist@^4.6.6: +browserslist@^4.0.0, browserslist@^4.1.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.0, browserslist@^4.16.6, browserslist@^4.16.8, browserslist@^4.6.6: version "4.17.6" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.6.tgz#c76be33e7786b497f66cad25a73756c8b938985d" integrity sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw== @@ -6446,6 +6562,11 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + caniuse-api@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" @@ -6456,17 +6577,7 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001251: - version "1.0.30001252" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001252.tgz#cb16e4e3dafe948fc4a9bb3307aea054b912019a" - integrity sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw== - -caniuse-lite@^1.0.30001254: - version "1.0.30001259" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001259.tgz#ae21691d3da9c4be6144403ac40f71d9f6efd790" - integrity sha512-V7mQTFhjITxuk9zBpI6nYsiTXhcPe05l+364nZjK7MFK/E7ibvYBSAXr4YcA6oPR8j3ZLM/LN+lUqUVAQEUZFg== - -caniuse-lite@^1.0.30001274: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001274: version "1.0.30001274" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001274.tgz#26ca36204d15b17601ba6fc35dbdad950a647cc7" integrity sha512-+Nkvv0fHyhISkiMIjnyjmf5YJcQ1IQHZN6U9TLUMroWR38FNwpsC51Gb68yueafX1V6ifOisInSgP9WJFS13ew== @@ -6511,15 +6622,6 @@ ccount@^1.0.0: resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== -chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -6531,6 +6633,15 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" @@ -6704,7 +6815,7 @@ cli-boxes@^1.0.0: resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= -cli-boxes@^2.2.0: +cli-boxes@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== @@ -6733,7 +6844,16 @@ cli-spinners@^2.5.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== -cli-table3@0.6.0, cli-table3@~0.6.0: +cli-table3@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.1.tgz#36ce9b7af4847f288d3cdd081fbd09bf7bd237b8" + integrity sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA== + dependencies: + string-width "^4.2.0" + optionalDependencies: + colors "1.4.0" + +cli-table3@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.0.tgz#b7b1bc65ca8e7b5cef9124e13dc2b21e2ce4faee" integrity sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ== @@ -6873,6 +6993,11 @@ color-string@^1.6.0: color-name "^1.0.0" simple-swizzle "^0.2.2" +color-support@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + color@^3.0.0: version "3.2.1" resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" @@ -6886,12 +7011,12 @@ colord@^2.9.1: resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.1.tgz#c961ea0efeb57c9f0f4834458f26cb9cc4a3f90e" integrity sha512-4LBMSt09vR0uLnPVkOUBnmxgoaeN4ewRbx801wY/bXcltXfpR/G46OdWn96XpYmCWuYvO46aBZP4NgX8HpNAcw== -colorette@^1.2.1, colorette@^1.2.2, colorette@^1.3.0: +colorette@^1.2.1, colorette@^1.2.2: version "1.3.0" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.3.0.tgz#ff45d2f0edb244069d3b772adeb04fed38d0a0af" integrity sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w== -colors@^1.1.2: +colors@1.4.0, colors@^1.1.2: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== @@ -7040,7 +7165,7 @@ console-browserify@^1.1.0, console-browserify@^1.2.0: resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== -console-control-strings@^1.0.0, console-control-strings@~1.1.0: +console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= @@ -7200,7 +7325,7 @@ cp-file@^7.0.0: nested-error-stacks "^2.0.0" p-event "^4.1.0" -cpy@^8.1.1: +cpy@^8.1.2: version "8.1.2" resolved "https://registry.yarnpkg.com/cpy/-/cpy-8.1.2.tgz#e339ea54797ad23f8e3919a5cffd37bfc3f25935" integrity sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg== @@ -7246,19 +7371,18 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" -create-react-context@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.3.0.tgz#546dede9dc422def0d3fc2fe03afe0bc0f4f7d8c" - integrity sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw== - dependencies: - gud "^1.0.0" - warning "^4.0.3" - create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== +cross-fetch@3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + cross-fetch@^3.0.4: version "3.1.4" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" @@ -7266,15 +7390,6 @@ cross-fetch@^3.0.4: dependencies: node-fetch "2.6.1" -cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -7295,6 +7410,15 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.4, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + crypto-browserify@^3.11.0, crypto-browserify@^3.12.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -7959,14 +8083,6 @@ detect-libc@^1.0.3: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= -detect-port-alt@1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" - integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== - dependencies: - address "^1.0.1" - debug "^2.6.0" - detect-port@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" @@ -8142,55 +8258,22 @@ dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" -dotenv-defaults@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/dotenv-defaults/-/dotenv-defaults-1.1.1.tgz#032c024f4b5906d9990eb06d722dc74cc60ec1bd" - integrity sha512-6fPRo9o/3MxKvmRZBD3oNFdxODdhJtIy1zcJeUSCs6HCy4tarUpd+G67UTU9tF6OWXeSPqsm4fPAB+2eY9Rt9Q== - dependencies: - dotenv "^6.2.0" - -dotenv-defaults@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dotenv-defaults/-/dotenv-defaults-2.0.2.tgz#6b3ec2e4319aafb70940abda72d3856770ee77ac" - integrity sha512-iOIzovWfsUHU91L5i8bJce3NYK5JXeAwH50Jh6+ARUdLiiGlYWfGw6UkzsYqaXZH/hjE/eCd/PlfM/qqyK0AMg== - dependencies: - dotenv "^8.2.0" - dotenv-expand@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== -dotenv-webpack@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/dotenv-webpack/-/dotenv-webpack-1.8.0.tgz#7ca79cef2497dd4079d43e81e0796bc9d0f68a5e" - integrity sha512-o8pq6NLBehtrqA8Jv8jFQNtG9nhRtVqmoD4yWbgUyoU3+9WBlPe+c2EAiaJok9RB28QvrWvdWLZGeTT5aATDMg== - dependencies: - dotenv-defaults "^1.0.2" - -dotenv-webpack@^7.0.0: - version "7.0.3" - resolved "https://registry.yarnpkg.com/dotenv-webpack/-/dotenv-webpack-7.0.3.tgz#f50ec3c7083a69ec6076e110566720003b7b107b" - integrity sha512-O0O9pOEwrk+n1zzR3T2uuXRlw64QxHSPeNN1GaiNBloQFNaCUL9V8jxSVz4jlXXFP/CIqK8YecWf8BAvsSgMjw== - dependencies: - dotenv-defaults "^2.0.2" - dotenv@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef" integrity sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow== -dotenv@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064" - integrity sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w== - dotenv@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-7.0.0.tgz#a2be3cd52736673206e8a85fb5210eea29628e7c" integrity sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g== -dotenv@^8.0.0, dotenv@^8.2.0: +dotenv@^8.0.0: version "8.6.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== @@ -8248,7 +8331,7 @@ duplexer2@~0.1.4: dependencies: readable-stream "^2.0.2" -duplexer@^0.1.1, duplexer@~0.1.1: +duplexer@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== @@ -8294,6 +8377,19 @@ effection@^1.0.0: resolved "https://registry.yarnpkg.com/effection/-/effection-1.0.0.tgz#7c20ee4ea6e63fddb5a51461dda8009b649b4195" integrity sha512-ITAAnuI7sJqKhjvYlnm66NHaW7zrXzqgsGsjVaaqFHYDWPN8WylVj46xASfkrtwq5wmklbzy6tvRYaj2C4rDHw== +effection@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/effection/-/effection-2.0.4.tgz#2ca9defcebfa75b408f83f6a16ae10ec6c70b48a" + integrity sha512-8haobRaTJbwNM32GeSS5Do0WHB/Xev94SukFtQHEli+3TTDxYwW+NQcp0lAb8J4ISzvKjL+OyodGPMEyegbjog== + dependencies: + "@effection/channel" "2.0.3" + "@effection/core" "2.2.0" + "@effection/events" "2.0.3" + "@effection/fetch" "2.0.4" + "@effection/main" "2.0.3" + "@effection/stream" "2.0.3" + "@effection/subscription" "2.0.3" + ejs@^3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a" @@ -8301,16 +8397,6 @@ ejs@^3.1.6: dependencies: jake "^10.6.1" -electron-to-chromium@^1.3.564, electron-to-chromium@^1.3.811: - version "1.3.827" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.827.tgz#c725e8db8c5be18b472a919e5f57904512df0fc1" - integrity sha512-ye+4uQOY/jbjRutMcE/EmOcNwUeo1qo9aKL2tPyb09cU3lmxNeyDF4RWiemmkknW+p29h7dyDqy02higTxc9/A== - -electron-to-chromium@^1.3.830: - version "1.3.845" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.845.tgz#326d3be3ee5d2c065f689119d441c997f9fd41d8" - integrity sha512-y0RorqmExFDI4RjLEC6j365bIT5UAXf9WIRcknvSFHVhbC/dRnCgJnPA3DUUW6SCC85QGKEafgqcHJ6uPdEP1Q== - electron-to-chromium@^1.3.886: version "1.3.887" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.887.tgz#b36aeed12a28aaa19460a467823f5bbe1f3c6f06" @@ -8558,7 +8644,7 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.3: d "^1.0.1" ext "^1.1.2" -escalade@^3.0.2, escalade@^3.1.1: +escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== @@ -8573,7 +8659,7 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: +escape-string-regexp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== @@ -9300,11 +9386,6 @@ filelist@^1.0.1: dependencies: minimatch "^3.0.4" -filesize@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" - integrity sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg== - filesize@^3.6.0: version "3.6.1" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" @@ -9382,7 +9463,7 @@ find-up@3.0.0, find-up@^3.0.0: dependencies: locate-path "^3.0.0" -find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: +find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== @@ -9474,7 +9555,7 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -fork-ts-checker-webpack-plugin@4.1.6, fork-ts-checker-webpack-plugin@^4.1.6: +fork-ts-checker-webpack-plugin@^4.1.6: version "4.1.6" resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz#5055c703febcf37fa06405d400c122b905167fc5" integrity sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw== @@ -9705,6 +9786,21 @@ fuse.js@^3.6.1: resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.6.1.tgz#7de85fdd6e1b3377c23ce010892656385fd9b10c" integrity sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw== +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -9917,22 +10013,6 @@ global-dirs@^3.0.0: dependencies: ini "2.0.0" -global-modules@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - global@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" @@ -9974,18 +10054,6 @@ globalthis@^1.0.0: dependencies: define-properties "^1.1.3" -globby@11.0.1: - version "11.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" - integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - globby@^11.0.0, globby@^11.0.1, globby@^11.0.2, globby@^11.0.3: version "11.0.4" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" @@ -10059,20 +10127,7 @@ growl@1.10.5: resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== -gud@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" - integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== - -gzip-size@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" - integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== - dependencies: - duplexer "^0.1.1" - pify "^4.0.1" - -handlebars@^4.7.6: +handlebars@^4.7.6, handlebars@^4.7.7: version "4.7.7" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== @@ -10148,7 +10203,7 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" -has-unicode@^2.0.0: +has-unicode@^2.0.0, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= @@ -10304,6 +10359,20 @@ highlight.js@~10.4.0: resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.4.1.tgz#d48fbcf4a9971c4361b3f95f302747afe19dbad0" integrity sha512-yR5lWvNz7c85OhVAEAeFhVCc/GV4C30Fjzc/rCP0aCWzc1UUOPUk55dK/qdwTZHBvMZo+eZ2jpk62ndX/xMFlg== +history@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/history/-/history-5.0.0.tgz#0cabbb6c4bbf835addb874f8259f6d25101efd08" + integrity sha512-3NyRMKIiFSJmIPdq7FxkNMJkQ7ZEtVblOQ38VtKaA0zZMW1Eo6Q6W8oDKEflr1kNNTItSnk4JMCO1deeSgbLLg== + dependencies: + "@babel/runtime" "^7.7.6" + +history@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/history/-/history-5.3.0.tgz#1548abaa245ba47992f063a0783db91ef201c73b" + integrity sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ== + dependencies: + "@babel/runtime" "^7.7.6" + hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -10349,11 +10418,6 @@ html-encoding-sniffer@^2.0.1: dependencies: whatwg-encoding "^1.0.5" -html-entities@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" - integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== - html-entities@^2.1.0: version "2.3.2" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" @@ -10677,11 +10741,6 @@ ignore@^5.1.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== -immer@8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.1.tgz#9c73db683e2b3975c424fb0572af5889877ae656" - integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== - import-fresh@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" @@ -10751,11 +10810,6 @@ ini@2.0.0: resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== -ini@^1.3.5: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - iniparser@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/iniparser/-/iniparser-1.0.5.tgz#836d6befe6dfbfcee0bccf1cf9f2acc7027f783d" @@ -10799,7 +10853,7 @@ interpret@^2.2.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== -invariant@^2.2.3, invariant@^2.2.4: +invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -11187,10 +11241,10 @@ is-plain-obj@^3.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== -is-plain-object@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.1.tgz#662d92d24c0aa4302407b0d45d21f2251c85f85b" - integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g== +is-plain-object@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" @@ -11224,11 +11278,6 @@ is-resolvable@^1.0.0, is-resolvable@^1.1.0: resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== -is-root@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" - integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== - is-set@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" @@ -11494,6 +11543,14 @@ jest-message-util@^24.9.0: slash "^2.0.0" stack-utils "^1.0.1" +jest-mock@^27.0.6: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" + integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-regex-util@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" @@ -12924,6 +12981,13 @@ node-fetch@2.6.1, node-fetch@^2.6.1: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + node-forge@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" @@ -12973,11 +13037,6 @@ node-modules-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= -node-releases@^1.1.61, node-releases@^1.1.75: - version "1.1.75" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe" - integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw== - node-releases@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" @@ -13095,6 +13154,16 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: gauge "~2.7.3" set-blocking "~2.0.0" +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + nth-check@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -13292,7 +13361,7 @@ onigasm@^2.2.5: dependencies: lru-cache "^5.1.1" -open@^7.0.2, open@^7.0.3, open@^7.4.2: +open@^7.0.3, open@^7.4.2: version "7.4.2" resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== @@ -13720,7 +13789,7 @@ path-browserify@0.0.1: resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== -path-browserify@^1.0.0: +path-browserify@^1.0.0, path-browserify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== @@ -13843,6 +13912,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== +picomatch@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + pidtree@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" @@ -13891,13 +13965,6 @@ pkg-dir@^5.0.0: dependencies: find-up "^5.0.0" -pkg-up@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== - dependencies: - find-up "^3.0.0" - pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" @@ -14673,16 +14740,16 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= +"prettier@>=2.2.1 <=2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.0.tgz#b6a5bf1284026ae640f17f7ff5658a7567fc0d18" + integrity sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w== + prettier@^1.19.1: version "1.19.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== -prettier@^2.2.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d" - integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ== - pretty-bytes@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" @@ -14775,14 +14842,6 @@ promise.prototype.finally@^3.1.0: es-abstract "^1.17.0-next.0" function-bind "^1.1.1" -prompts@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" - integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - prompts@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" @@ -14791,7 +14850,7 @@ prompts@^2.4.0: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.0.0, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.0.0, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -15050,36 +15109,6 @@ react-colorful@^5.1.2: resolved "https://registry.yarnpkg.com/react-colorful/-/react-colorful-5.4.0.tgz#e05e602469f9768234f29c1bad9ec1f4e86145a2" integrity sha512-k7QJXuQGWevr/V8hoMJ1wBW9i2CVhBdDXpBf3jy/AAtzVyYtsFqEAT+y+NOGiSG1cmnGTreqm5EFLXlVaKbPLQ== -react-dev-utils@^11.0.3: - version "11.0.4" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.4.tgz#a7ccb60257a1ca2e0efe7a83e38e6700d17aa37a" - integrity sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A== - dependencies: - "@babel/code-frame" "7.10.4" - address "1.1.2" - browserslist "4.14.2" - chalk "2.4.2" - cross-spawn "7.0.3" - detect-port-alt "1.1.6" - escape-string-regexp "2.0.0" - filesize "6.1.0" - find-up "4.1.0" - fork-ts-checker-webpack-plugin "4.1.6" - global-modules "2.0.0" - globby "11.0.1" - gzip-size "5.1.1" - immer "8.0.1" - is-root "2.1.0" - loader-utils "2.0.0" - open "^7.0.2" - pkg-up "3.1.0" - prompts "2.4.0" - react-error-overlay "^6.0.9" - recursive-readdir "2.2.2" - shell-quote "1.7.2" - strip-ansi "6.0.0" - text-table "0.2.0" - react-docgen-typescript@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-2.1.0.tgz#20db64a7fd62e63a8a9469fb4abd90600878cbb2" @@ -15118,18 +15147,14 @@ react-draggable@^4.4.3: clsx "^1.1.1" prop-types "^15.6.0" -react-element-to-jsx-string@^14.3.2: - version "14.3.2" - resolved "https://registry.yarnpkg.com/react-element-to-jsx-string/-/react-element-to-jsx-string-14.3.2.tgz#c0000ed54d1f8b4371731b669613f2d4e0f63d5c" - integrity sha512-WZbvG72cjLXAxV7VOuSzuHEaI3RHj10DZu8EcKQpkKcAj7+qAkG5XUeSdX5FXrA0vPrlx0QsnAzZEBJwzV0e+w== +react-element-to-jsx-string@^14.3.4: + version "14.3.4" + resolved "https://registry.yarnpkg.com/react-element-to-jsx-string/-/react-element-to-jsx-string-14.3.4.tgz#709125bc72f06800b68f9f4db485f2c7d31218a8" + integrity sha512-t4ZwvV6vwNxzujDQ+37bspnLwA4JlgUPWhLjBJWsNIDceAf6ZKUTCjdm08cN6WeZ5pTMKiCJkmAYnpmR4Bm+dg== dependencies: - "@base2/pretty-print-object" "1.0.0" - is-plain-object "3.0.1" - -react-error-overlay@^6.0.9: - version "6.0.9" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" - integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== + "@base2/pretty-print-object" "1.0.1" + is-plain-object "5.0.0" + react-is "17.0.2" react-fast-compare@^3.0.1, react-fast-compare@^3.2.0: version "3.2.0" @@ -15156,20 +15181,15 @@ react-inspector@^5.1.0: is-dom "^1.0.0" prop-types "^15.0.0" -react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -"react-is@^16.8.0 || ^17.0.0", react-is@^17.0.1, react-is@^17.0.2: +react-is@17.0.2, "react-is@^16.8.0 || ^17.0.0", react-is@^17.0.1, react-is@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== +react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-popper-tooltip@^3.1.1: version "3.1.1" @@ -15188,16 +15208,31 @@ react-popper@^2.2.4: react-fast-compare "^3.0.1" warning "^4.0.2" -react-refresh@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.10.0.tgz#2f536c9660c0b9b1d500684d9e52a65e7404f7e3" - integrity sha512-PgidR3wST3dDYKr6b4pJoqQFpPGNKDSCDx4cZoshjXipw3LzO7mG1My2pwEzz2JVkF+inx3xRpDeQLFQGH/hsQ== +react-refresh@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046" + integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== react-refresh@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.9.0.tgz#71863337adc3e5c2f8a6bfddd12ae3bfe32aafbf" integrity sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ== +react-router-dom@^6.0.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.2.2.tgz#f1a2c88365593c76b9612ae80154a13fcb72e442" + integrity sha512-AtYEsAST7bDD4dLSQHDnk/qxWLJdad5t1HFa1qJyUrCeGgEuCSw0VB/27ARbF9Fi/W5598ujvJOm3ujUCVzuYQ== + dependencies: + history "^5.2.0" + react-router "6.2.2" + +react-router@6.2.2, react-router@^6.0.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.2.2.tgz#495e683a0c04461eeb3d705fe445d6cf42f0c249" + integrity sha512-/MbxyLzd7Q7amp4gDOGaYvXwhEojkJD5BtExkuKmj39VEE0m3l/zipf6h2WIB2jyAO0lI6NGETh4RDcktRm4AQ== + dependencies: + history "^5.2.0" + react-sizeme@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/react-sizeme/-/react-sizeme-3.0.2.tgz#4a2f167905ba8f8b8d932a9e35164e459f9020e4" @@ -15349,13 +15384,6 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -recursive-readdir@2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" - integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== - dependencies: - minimatch "3.0.4" - redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -16115,7 +16143,7 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@1.7.2, shell-quote@^1.6.1: +shell-quote@^1.6.1: version "1.7.2" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== @@ -16610,6 +16638,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" @@ -16695,13 +16732,6 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@6.0.0, strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -16723,6 +16753,20 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -16897,6 +16941,11 @@ symbol.prototype.description@^1.0.0: has-symbols "^1.0.2" object.getownpropertydescriptors "^2.1.2" +synchronous-promise@^2.0.15: + version "2.0.15" + resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.15.tgz#07ca1822b9de0001f5ff73595f3d08c4f720eb8e" + integrity sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg== + table-layout@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" @@ -16981,7 +17030,7 @@ tcp-port-used@^1.0.1: debug "4.3.1" is2 "^2.0.6" -telejson@^5.3.2: +telejson@^5.3.2, telejson@^5.3.3: version "5.3.3" resolved "https://registry.yarnpkg.com/telejson/-/telejson-5.3.3.tgz#fa8ca84543e336576d8734123876a9f02bf41d2e" integrity sha512-PjqkJZpzEggA9TBpVtJi1LVptP7tYtXB6rEubwlHap76AMjzvOdKX41CxyaW7ahhzDU1aftXnMCx5kAPDZTQBA== @@ -17125,7 +17174,7 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -text-table@0.2.0, text-table@^0.2.0: +text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= @@ -17311,6 +17360,11 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + trim-newlines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" @@ -17343,7 +17397,7 @@ trumpet@^1.7.2: readable-stream "^1.0.27-1" through2 "^1.0.0" -ts-dedent@^2.0.0: +ts-dedent@^2.0.0, ts-dedent@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== @@ -18076,7 +18130,7 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" -warning@^4.0.2, warning@^4.0.3: +warning@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== @@ -18126,6 +18180,11 @@ web-namespaces@^1.0.0: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -18169,15 +18228,15 @@ webpack-filter-warnings-plugin@^1.2.1: resolved "https://registry.yarnpkg.com/webpack-filter-warnings-plugin/-/webpack-filter-warnings-plugin-1.2.1.tgz#dc61521cf4f9b4a336fbc89108a75ae1da951cdb" integrity sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg== -webpack-hot-middleware@^2.25.0: - version "2.25.0" - resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz#4528a0a63ec37f8f8ef565cf9e534d57d09fe706" - integrity sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA== +webpack-hot-middleware@^2.25.1: + version "2.25.1" + resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.25.1.tgz#581f59edf0781743f4ca4c200fd32c9266c6cf7c" + integrity sha512-Koh0KyU/RPYwel/khxbsDz9ibDivmUbrRuKSSQvW42KSDdO4w23WI3SkHpSUKHE76LrFnnM/L7JCrpBwu8AXYw== dependencies: - ansi-html "0.0.7" - html-entities "^1.2.0" + ansi-html-community "0.0.8" + html-entities "^2.1.0" querystring "^0.2.0" - strip-ansi "^3.0.0" + strip-ansi "^6.0.0" webpack-log@^2.0.0: version "2.0.0" @@ -18295,6 +18354,14 @@ whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + whatwg-url@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" @@ -18349,7 +18416,7 @@ which-typed-array@^1.1.2: has-tostringtag "^1.0.0" is-typed-array "^1.1.7" -which@1.3.1, which@^1.2.9, which@^1.3.1: +which@1.3.1, which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -18370,6 +18437,13 @@ wide-align@1.1.3, wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" +wide-align@^1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + widest-line@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" @@ -18482,6 +18556,11 @@ ws@^7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== +ws@^8.2.3: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"