diff --git a/package.json b/package.json index 2cd7fa978..5f865344e 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "@types/webpack-env": "^1.13.1", "@types/webpack-hot-middleware": "^2.15.0", "@typescript-eslint/parser": "^1.0.0", - "@xstate/react": "^0.8.1", + "@xstate/react": "^1.0.0", "add-asset-html-webpack-plugin": "^2.1.3", "autoprefixer": "^8.3.0", "axios": "^0.18.1", diff --git a/src/components/Workflow/WorkflowDetails/WorkflowDescription.tsx b/src/components/Entities/EntityDescription.tsx similarity index 74% rename from src/components/Workflow/WorkflowDetails/WorkflowDescription.tsx rename to src/components/Entities/EntityDescription.tsx index 5eebe942c..33705cc33 100644 --- a/src/components/Workflow/WorkflowDetails/WorkflowDescription.tsx +++ b/src/components/Entities/EntityDescription.tsx @@ -3,10 +3,11 @@ import { makeStyles, Theme } from '@material-ui/core/styles'; import * as classnames from 'classnames'; import { WaitForData } from 'components'; import { useCommonStyles } from 'components/common/styles'; -import { useWorkflowNamedEntity } from 'components/hooks/useNamedEntity'; -import { NamedEntityIdentifier, NamedEntityMetadata } from 'models'; +import { useNamedEntity } from 'components/hooks/useNamedEntity'; +import { NamedEntityMetadata, ResourceIdentifier } from 'models'; import * as React from 'react'; import reactLoadingSkeleton from 'react-loading-skeleton'; +import { noDescriptionStrings } from './constants'; const Skeleton = reactLoadingSkeleton; @@ -16,21 +17,18 @@ const useStyles = makeStyles((theme: Theme) => ({ } })); -const noDescriptionString = 'This workflow has no description.'; - -/** Fetches and renders the description for a given workflow ID */ -export const WorkflowDescription: React.FC<{ - workflowId: NamedEntityIdentifier; -}> = ({ workflowId }) => { +/** Fetches and renders the description for a given Entity (LaunchPlan,Workflow,Task) ID */ +export const EntityDescription: React.FC<{ + id: ResourceIdentifier; +}> = ({ id }) => { const commonStyles = useCommonStyles(); const styles = useStyles(); - const namedEntity = useWorkflowNamedEntity(workflowId); + const namedEntity = useNamedEntity(id); const { metadata = {} as NamedEntityMetadata } = namedEntity.value; const hasDescription = !!metadata.description; return ( <> Description - {hasDescription ? metadata.description - : noDescriptionString} + : noDescriptionStrings[id.resourceType]} diff --git a/src/components/Entities/EntityDetails.tsx b/src/components/Entities/EntityDetails.tsx new file mode 100644 index 000000000..a3a8caf4d --- /dev/null +++ b/src/components/Entities/EntityDetails.tsx @@ -0,0 +1,102 @@ +import { Dialog } from '@material-ui/core'; +import { makeStyles, Theme } from '@material-ui/core/styles'; +import { contentMarginGridUnits } from 'common/layout'; +import { WaitForData } from 'components/common'; +import { EntityDescription } from 'components/Entities/EntityDescription'; +import { useProject } from 'components/hooks'; +import { LaunchForm } from 'components/Launch/LaunchForm/LaunchForm'; +import { ResourceIdentifier, ResourceType } from 'models'; +import * as React from 'react'; +import { entitySections } from './constants'; +import { EntityDetailsHeader } from './EntityDetailsHeader'; +import { EntityExecutions } from './EntityExecutions'; +import { EntitySchedules } from './EntitySchedules'; + +const useStyles = makeStyles((theme: Theme) => ({ + metadataContainer: { + display: 'flex', + marginBottom: theme.spacing(5), + marginTop: theme.spacing(2), + width: '100%' + }, + descriptionContainer: { + flex: '2 1 auto', + marginRight: theme.spacing(2) + }, + executionsContainer: { + display: 'flex', + flex: '1 1 auto', + flexDirection: 'column', + margin: `0 -${theme.spacing(contentMarginGridUnits)}px` + }, + schedulesContainer: { + flex: '1 2 auto', + marginRight: theme.spacing(30) + } +})); + +export interface EntityDetailsProps { + id: ResourceIdentifier; +} + +function getLaunchProps(id: ResourceIdentifier) { + if (id.resourceType === ResourceType.TASK) { + return { taskId: id }; + } + + return { workflowId: id }; +} + +/** A view which optionally renders description, schedules, executions, and a + * launch button/form for a given entity. Note: not all components are suitable + * for use with all entities (not all entities have schedules, for example). + */ +export const EntityDetails: React.FC = ({ id }) => { + const sections = entitySections[id.resourceType]; + const project = useProject(id.project); + const styles = useStyles(); + const [showLaunchForm, setShowLaunchForm] = React.useState(false); + const onLaunch = () => setShowLaunchForm(true); + const onCancelLaunch = () => setShowLaunchForm(false); + + return ( + + +
+ {!!sections.description ? ( +
+ +
+ ) : null} + {!!sections.schedules ? ( +
+ +
+ ) : null} +
+ {!!sections.executions ? ( +
+ +
+ ) : null} + {!!sections.launch ? ( + + + + ) : null} +
+ ); +}; diff --git a/src/components/Workflow/WorkflowDetails/WorkflowDetailsHeader.tsx b/src/components/Entities/EntityDetailsHeader.tsx similarity index 58% rename from src/components/Workflow/WorkflowDetails/WorkflowDetailsHeader.tsx rename to src/components/Entities/EntityDetailsHeader.tsx index 58a0de973..ed90d3f68 100644 --- a/src/components/Workflow/WorkflowDetails/WorkflowDetailsHeader.tsx +++ b/src/components/Entities/EntityDetailsHeader.tsx @@ -3,11 +3,12 @@ import { makeStyles, Theme } from '@material-ui/core/styles'; import ArrowBack from '@material-ui/icons/ArrowBack'; import * as classnames from 'classnames'; import { useCommonStyles } from 'components/common/styles'; -import { Project } from 'models'; +import { Project, ResourceIdentifier } from 'models'; import { getProjectDomain } from 'models/Project/utils'; import * as React from 'react'; import { Link } from 'react-router-dom'; -import { Routes } from 'routes'; +import { launchStrings } from './constants'; +import { backUrlGenerator } from './generators'; const useStyles = makeStyles((theme: Theme) => ({ actionsContainer: {}, @@ -28,31 +29,24 @@ const useStyles = makeStyles((theme: Theme) => ({ } })); -export interface WorkflowDetailsRouteParams { - projectId: string; - domainId: string; - workflowName: string; -} -export type WorkflowDetailsProps = WorkflowDetailsRouteParams; - -interface WorkflowDetailsHeaderProps { - domainId: string; +interface EntityDetailsHeaderProps { project: Project; - workflowName: string; - onClickLaunch(): void; + id: ResourceIdentifier; + launchable?: boolean; + onClickLaunch?(): void; } -/** Renders the workflow name and actions shown on the workflow details page */ -export const WorkflowDetailsHeader: React.FC = ({ - domainId, +/** Renders the entity name and any applicable actions. */ +export const EntityDetailsHeader: React.FC = ({ + id, onClickLaunch, - project, - workflowName + launchable = false, + project }) => { const styles = useStyles(); const commonStyles = useCommonStyles(); - const domain = getProjectDomain(project, domainId); - const headerText = `${domain.name} / ${workflowName}`; + const domain = getProjectDomain(project, id.domain); + const headerText = `${domain.name} / ${id.name}`; return (
= ({ > {headerText}
- + {launchable ? ( + + ) : null}
); diff --git a/src/components/Workflow/WorkflowDetails/WorkflowExecutions.tsx b/src/components/Entities/EntityExecutions.tsx similarity index 56% rename from src/components/Workflow/WorkflowDetails/WorkflowExecutions.tsx rename to src/components/Entities/EntityExecutions.tsx index 458d4857f..cdeaa620a 100644 --- a/src/components/Workflow/WorkflowDetails/WorkflowExecutions.tsx +++ b/src/components/Entities/EntityExecutions.tsx @@ -3,13 +3,14 @@ import { makeStyles, Theme } from '@material-ui/core/styles'; import { contentMarginGridUnits } from 'common/layout'; import { WaitForData } from 'components/common'; import { ExecutionFilters } from 'components/Executions/ExecutionFilters'; -import { useWorkflowExecutionFiltersState } from 'components/Executions/filters/useExecutionFiltersState'; -import { WorkflowExecutionsTable } from 'components/Executions/Tables/WorkflowExecutionsTable'; -import { useWorkflowExecutions } from 'components/hooks'; -import { NamedEntityIdentifier } from 'models'; -import { FilterOperationName, SortDirection } from 'models/AdminEntity'; +import { useWorkflowExecutionFiltersState as useExecutionFiltersState } from 'components/Executions/filters/useExecutionFiltersState'; +import { WorkflowExecutionsTable as ExecutionsTable } from 'components/Executions/Tables/WorkflowExecutionsTable'; +import { useWorkflowExecutions as useExecutions } from 'components/hooks'; +import { ResourceIdentifier } from 'models'; +import { SortDirection } from 'models/AdminEntity'; import { executionSortFields } from 'models/Execution'; import * as React from 'react'; +import { executionFilterGenerator } from './generators'; const useStyles = makeStyles((theme: Theme) => ({ filtersContainer: { @@ -21,33 +22,30 @@ const useStyles = makeStyles((theme: Theme) => ({ } })); -export interface WorkflowExecutionsProps { - workflowId: NamedEntityIdentifier; +export interface EntityExecutionsProps { + id: ResourceIdentifier; } /** The tab/page content for viewing a workflow's executions */ -export const WorkflowExecutions: React.FC = ({ - workflowId: { project, domain, name } -}) => { +export const EntityExecutions: React.FC = ({ id }) => { + const { domain, project, resourceType } = id; const styles = useStyles(); - const filtersState = useWorkflowExecutionFiltersState(); + const filtersState = useExecutionFiltersState(); const sort = { key: executionSortFields.createdAt, direction: SortDirection.DESCENDING }; - const executions = useWorkflowExecutions( + const baseFilters = React.useMemo( + () => executionFilterGenerator[resourceType](id), + [id] + ); + + const executions = useExecutions( { domain, project }, { sort, - filter: [ - { - key: 'workflow.name', - operation: FilterOperationName.EQ, - value: name - }, - ...filtersState.appliedFilters - ] + filter: [...baseFilters, ...filtersState.appliedFilters] } ); @@ -60,7 +58,7 @@ export const WorkflowExecutions: React.FC = ({ - + ); diff --git a/src/components/Workflow/WorkflowDetails/WorkflowSchedules.tsx b/src/components/Entities/EntitySchedules.tsx similarity index 53% rename from src/components/Workflow/WorkflowDetails/WorkflowSchedules.tsx rename to src/components/Entities/EntitySchedules.tsx index b41b9f15b..3b04b4852 100644 --- a/src/components/Workflow/WorkflowDetails/WorkflowSchedules.tsx +++ b/src/components/Entities/EntitySchedules.tsx @@ -4,8 +4,9 @@ import { getScheduleFrequencyString } from 'common/formatters'; import { WaitForData } from 'components/common'; import { useCommonStyles } from 'components/common/styles'; import { useWorkflowSchedules } from 'components/hooks'; -import { LaunchPlan, NamedEntityIdentifier } from 'models'; +import { LaunchPlan, ResourceIdentifier } from 'models'; import * as React from 'react'; +import { noSchedulesStrings, schedulesHeader } from './constants'; const useStyles = makeStyles((theme: Theme) => ({ schedulesContainer: { @@ -13,20 +14,10 @@ const useStyles = makeStyles((theme: Theme) => ({ } })); -const noSchedulesString = 'This workflow has no schedules.'; - -const RenderSchedules: React.FC<{ launchPlans: LaunchPlan[] }> = ({ - launchPlans -}) => { +const RenderSchedules: React.FC<{ + launchPlans: LaunchPlan[]; +}> = ({ launchPlans }) => { const commonStyles = useCommonStyles(); - if (launchPlans.length === 0) { - return ( - - {noSchedulesString} - - ); - } - return (
    {launchPlans.map((launchPlan, idx) => { @@ -38,17 +29,29 @@ const RenderSchedules: React.FC<{ launchPlans: LaunchPlan[] }> = ({ ); }; -export const WorkflowSchedules: React.FC<{ - workflowId: NamedEntityIdentifier; -}> = ({ workflowId }) => { +export const EntitySchedules: React.FC<{ + id: ResourceIdentifier; +}> = ({ id }) => { const styles = useStyles(); - const scheduledLaunchPlans = useWorkflowSchedules(workflowId); + const commonStyles = useCommonStyles(); + const scheduledLaunchPlans = useWorkflowSchedules(id); return ( <> - Schedules + {schedulesHeader}
    - + {scheduledLaunchPlans.value.length > 0 ? ( + + ) : ( + + {noSchedulesStrings[id.resourceType]} + + )}
    diff --git a/src/components/Entities/constants.ts b/src/components/Entities/constants.ts new file mode 100644 index 000000000..45d7cec94 --- /dev/null +++ b/src/components/Entities/constants.ts @@ -0,0 +1,54 @@ +import { mapValues, startCase } from 'lodash'; +import { ResourceType } from 'models'; + +type EntityStringMap = { [k in ResourceType]: string }; + +export const entityStrings: EntityStringMap = { + [ResourceType.DATASET]: 'dataset', + [ResourceType.LAUNCH_PLAN]: 'launch plan', + [ResourceType.TASK]: 'task', + [ResourceType.UNSPECIFIED]: 'item', + [ResourceType.WORKFLOW]: 'workflow' +}; + +export const noDescriptionStrings: EntityStringMap = mapValues( + entityStrings, + typeString => `This ${typeString} has no description.` +); + +export const schedulesHeader = 'Schedules'; + +export const noSchedulesStrings: EntityStringMap = mapValues( + entityStrings, + typeString => `This ${typeString} has no schedules.` +); + +export const launchStrings: EntityStringMap = mapValues( + entityStrings, + typeString => `Launch ${startCase(typeString)}` +); + +export interface EntitySectionsFlags { + description?: boolean; + executions?: boolean; + launch?: boolean; + schedules?: boolean; +} + +export const entitySections: { [k in ResourceType]: EntitySectionsFlags } = { + [ResourceType.DATASET]: { description: true }, + [ResourceType.LAUNCH_PLAN]: { + description: true, + executions: true, + launch: true, + schedules: true + }, + [ResourceType.TASK]: { description: true, executions: true, launch: true }, + [ResourceType.UNSPECIFIED]: { description: true }, + [ResourceType.WORKFLOW]: { + description: true, + executions: true, + launch: true, + schedules: true + } +}; diff --git a/src/components/Entities/generators.ts b/src/components/Entities/generators.ts new file mode 100644 index 000000000..e2318a5c0 --- /dev/null +++ b/src/components/Entities/generators.ts @@ -0,0 +1,46 @@ +import { + FilterOperation, + FilterOperationName, + ResourceIdentifier, + ResourceType +} from 'models'; +import { Routes } from 'routes/routes'; + +const noFilters = () => []; + +export const executionFilterGenerator: { + [k in ResourceType]: (id: ResourceIdentifier) => FilterOperation[]; +} = { + [ResourceType.DATASET]: noFilters, + [ResourceType.LAUNCH_PLAN]: noFilters, + [ResourceType.TASK]: ({ name }) => [ + { + key: 'launch_plan.name', + operation: FilterOperationName.EQ, + value: name + } + ], + [ResourceType.UNSPECIFIED]: noFilters, + [ResourceType.WORKFLOW]: ({ name }) => [ + { + key: 'workflow.name', + operation: FilterOperationName.EQ, + value: name + } + ] +}; + +const workflowListGenerator = ({ project, domain }: ResourceIdentifier) => + Routes.ProjectDetails.sections.workflows.makeUrl(project, domain); +const taskListGenerator = ({ project, domain }: ResourceIdentifier) => + Routes.ProjectDetails.sections.tasks.makeUrl(project, domain); + +export const backUrlGenerator: { + [k in ResourceType]: (id: ResourceIdentifier) => string; +} = { + [ResourceType.DATASET]: workflowListGenerator, + [ResourceType.LAUNCH_PLAN]: workflowListGenerator, + [ResourceType.TASK]: taskListGenerator, + [ResourceType.UNSPECIFIED]: workflowListGenerator, + [ResourceType.WORKFLOW]: workflowListGenerator +}; diff --git a/src/components/Workflow/WorkflowDetails/test/WorkflowSchedules.spec.tsx b/src/components/Entities/test/EntitySchedules.test.tsx similarity index 80% rename from src/components/Workflow/WorkflowDetails/test/WorkflowSchedules.spec.tsx rename to src/components/Entities/test/EntitySchedules.test.tsx index 13f0a1ee3..9e9066cc6 100644 --- a/src/components/Workflow/WorkflowDetails/test/WorkflowSchedules.spec.tsx +++ b/src/components/Entities/test/EntitySchedules.test.tsx @@ -1,22 +1,24 @@ -import { act, render } from '@testing-library/react'; +import { render, waitFor } from '@testing-library/react'; import { createMockLaunchPlan, mockLaunchPlanSchedules } from 'models/__mocks__/launchPlanData'; import { FilterOperation, FilterOperationName } from 'models/AdminEntity/types'; -import { NamedEntityIdentifier } from 'models/Common/types'; +import { ResourceIdentifier, ResourceType } from 'models/Common/types'; import { listLaunchPlans } from 'models/Launch/api'; import { LaunchPlan, LaunchPlanState } from 'models/Launch/types'; import * as React from 'react'; -import { WorkflowSchedules } from '../WorkflowSchedules'; +import { schedulesHeader } from '../constants'; +import { EntitySchedules } from '../EntitySchedules'; jest.mock('models/Launch/api'); -describe('WorkflowSchedules', () => { +describe('EntitySchedules', () => { const mockListLaunchPlans = listLaunchPlans as jest.Mock< ReturnType >; - const workflowId: NamedEntityIdentifier = { + const id: ResourceIdentifier = { + resourceType: ResourceType.WORKFLOW, project: 'project', domain: 'domain', name: 'name' @@ -24,10 +26,9 @@ describe('WorkflowSchedules', () => { let launchPlans: LaunchPlan[]; const renderSchedules = async () => { - await act(() => { - render(); - return new Promise(resolve => setTimeout(resolve, 0)); - }); + const result = render(); + await waitFor(() => result.getByText(schedulesHeader)); + return result; }; beforeEach(() => { @@ -63,17 +64,17 @@ describe('WorkflowSchedules', () => { { key: 'workflow.name', operation: FilterOperationName.EQ, - value: workflowId.name + value: id.name }, { key: 'workflow.domain', operation: FilterOperationName.EQ, - value: workflowId.domain + value: id.domain }, { key: 'workflow.project', operation: FilterOperationName.EQ, - value: workflowId.project + value: id.project } ]; await renderSchedules(); diff --git a/src/components/Executions/ExecutionDetails/ExecutionDetailsAppBarContent.tsx b/src/components/Executions/ExecutionDetails/ExecutionDetailsAppBarContent.tsx index 4a239b314..7a17a3eed 100644 --- a/src/components/Executions/ExecutionDetails/ExecutionDetailsAppBarContent.tsx +++ b/src/components/Executions/ExecutionDetails/ExecutionDetailsAppBarContent.tsx @@ -11,13 +11,13 @@ import { interactiveTextDisabledColor } from 'components/Theme'; import { Execution } from 'models'; import * as React from 'react'; import { Link as RouterLink } from 'react-router-dom'; -import { Routes } from 'routes'; import { ExecutionInputsOutputsModal } from '../ExecutionInputsOutputsModal'; import { ExecutionStatusBadge } from '../ExecutionStatusBadge'; import { TerminateExecutionButton } from '../TerminateExecution'; import { executionIsTerminal } from '../utils'; -import { executionActionStrings } from './constants'; +import { backLinkTitle, executionActionStrings } from './constants'; import { RelaunchExecutionForm } from './RelaunchExecutionForm'; +import { getExecutionBackLink, getExecutionSourceId } from './utils'; const useStyles = makeStyles((theme: Theme) => { return { @@ -77,14 +77,9 @@ export const ExecutionDetailsAppBarContent: React.FC<{ const [showInputsOutputs, setShowInputsOutputs] = React.useState(false); const [showRelaunchForm, setShowRelaunchForm] = React.useState(false); const { domain, name, project } = execution.id; - const { phase, workflowId } = execution.closure; - const { - backLink = Routes.WorkflowDetails.makeUrl( - workflowId.project, - workflowId.domain, - workflowId.name - ) - } = useLocationState(); + const { phase } = execution.closure; + const sourceId = getExecutionSourceId(execution); + const { backLink = getExecutionBackLink(execution) } = useLocationState(); const isTerminal = executionIsTerminal(execution); const onClickShowInputsOutputs = () => setShowInputsOutputs(true); const onClickRelaunch = () => setShowRelaunchForm(true); @@ -136,7 +131,11 @@ export const ExecutionDetailsAppBarContent: React.FC<{ <>
    - + @@ -149,7 +148,7 @@ export const ExecutionDetailsAppBarContent: React.FC<{ )} > - {`${project}/${domain}/${workflowId.name}/`} + {`${project}/${domain}/${sourceId.name}/`} {`${name}`} diff --git a/src/components/Executions/ExecutionDetails/ExecutionMetadata.tsx b/src/components/Executions/ExecutionDetails/ExecutionMetadata.tsx index 0c84fb222..8d6135a88 100644 --- a/src/components/Executions/ExecutionDetails/ExecutionMetadata.tsx +++ b/src/components/Executions/ExecutionDetails/ExecutionMetadata.tsx @@ -8,6 +8,8 @@ import { useCommonStyles } from 'components/common/styles'; import { secondaryBackgroundColor } from 'components/Theme'; import { Execution } from 'models'; import * as React from 'react'; +import { Link as RouterLink } from 'react-router-dom'; +import { Routes } from 'routes/routes'; import { ExpandableExecutionError } from '../Tables/ExpandableExecutionError'; import { ExecutionMetadataLabels } from './constants'; @@ -65,7 +67,7 @@ export const ExecutionMetadata: React.FC<{ const { domain } = execution.id; const { duration, error, startedAt, workflowId } = execution.closure; - const { systemMetadata } = execution.spec.metadata; + const { referenceExecution, systemMetadata } = execution.spec.metadata; const cluster = systemMetadata?.executionCluster ?? dashedValueString; const details: DetailItem[] = [ @@ -93,6 +95,20 @@ export const ExecutionMetadata: React.FC<{ } ]; + if (referenceExecution != null) { + details.push({ + label: ExecutionMetadataLabels.relatedTo, + value: ( + + {referenceExecution.name} + + ) + }); + } + return (
    diff --git a/src/components/Executions/ExecutionDetails/RelaunchExecutionForm.tsx b/src/components/Executions/ExecutionDetails/RelaunchExecutionForm.tsx index 17d86b807..ed9ce53ff 100644 --- a/src/components/Executions/ExecutionDetails/RelaunchExecutionForm.tsx +++ b/src/components/Executions/ExecutionDetails/RelaunchExecutionForm.tsx @@ -1,44 +1,129 @@ import { WaitForData } from 'components/common'; -import { useWorkflow } from 'components/hooks'; -import { LaunchWorkflowForm } from 'components/Launch/LaunchWorkflowForm/LaunchWorkflowForm'; -import { useExecutionLaunchConfiguration } from 'components/Launch/LaunchWorkflowForm/useExecutionLaunchConfiguration'; -import { getWorkflowInputs } from 'components/Launch/LaunchWorkflowForm/utils'; -import { Execution, Workflow } from 'models'; +import { useAPIContext } from 'components/data/apiContext'; +import { fetchStates, useFetchableData } from 'components/hooks'; +import { LaunchForm } from 'components/Launch/LaunchForm/LaunchForm'; +import { + TaskInitialLaunchParameters, + WorkflowInitialLaunchParameters +} from 'components/Launch/LaunchForm/types'; +import { fetchAndMapExecutionInputValues } from 'components/Launch/LaunchForm/useMappedExecutionInputValues'; +import { + getTaskInputs, + getWorkflowInputs +} from 'components/Launch/LaunchForm/utils'; +import { Execution } from 'models'; import * as React from 'react'; +import { isSingleTaskExecution } from './utils'; export interface RelaunchExecutionFormProps { execution: Execution; onClose(): void; } -const RenderForm: React.FC = ({ execution, onClose, workflow }) => { - const { workflowId } = execution.closure; - const workflowInputs = getWorkflowInputs(workflow); - const launchConfiguration = useExecutionLaunchConfiguration({ - execution, - workflowInputs - }); +function useRelaunchWorkflowFormState({ + execution +}: RelaunchExecutionFormProps) { + const apiContext = useAPIContext(); + const initialParameters = useFetchableData< + WorkflowInitialLaunchParameters, + Execution + >( + { + defaultValue: {} as WorkflowInitialLaunchParameters, + doFetch: async execution => { + const { + closure: { workflowId }, + spec: { launchPlan } + } = execution; + const workflow = await apiContext.getWorkflow(workflowId); + const inputDefinitions = getWorkflowInputs(workflow); + const values = await fetchAndMapExecutionInputValues( + { + execution, + inputDefinitions + }, + apiContext + ); + return { values, launchPlan, workflowId }; + } + }, + execution + ); + return { initialParameters }; +} + +function useRelaunchTaskFormState({ execution }: RelaunchExecutionFormProps) { + const apiContext = useAPIContext(); + const initialParameters = useFetchableData< + TaskInitialLaunchParameters, + Execution + >( + { + defaultValue: {} as TaskInitialLaunchParameters, + doFetch: async execution => { + const { + spec: { launchPlan: taskId } + } = execution; + const task = await apiContext.getTask(taskId); + const inputDefinitions = getTaskInputs(task); + const values = await fetchAndMapExecutionInputValues( + { + execution, + inputDefinitions + }, + apiContext + ); + return { values, taskId }; + } + }, + execution + ); + return { initialParameters }; +} + +const RelaunchTaskForm: React.FC = props => { + const { initialParameters } = useRelaunchTaskFormState(props); + const { + spec: { launchPlan: taskId } + } = props.execution; return ( - - + + {initialParameters.state.matches(fetchStates.LOADED) ? ( + + ) : null} ); }; - -/** For a given execution, fetches the associated workflow and renders a - * `LaunchWorkflowForm` based on the workflow, launch plan, and inputs of the - * execution. */ -export const RelaunchExecutionForm: React.FC = props => { - const workflow = useWorkflow(props.execution.closure.workflowId); +const RelaunchWorkflowForm: React.FC = props => { + const { initialParameters } = useRelaunchWorkflowFormState(props); + const { + closure: { workflowId } + } = props.execution; return ( - - {() => } + + {initialParameters.state.matches(fetchStates.LOADED) ? ( + + ) : null} ); }; + +/** For a given execution, fetches the associated Workflow/Task and renders a + * `LaunchForm` based on the same source with input values taken from the execution. */ +export const RelaunchExecutionForm: React.FC = props => { + return isSingleTaskExecution(props.execution) ? ( + + ) : ( + + ); +}; diff --git a/src/components/Executions/ExecutionDetails/constants.ts b/src/components/Executions/ExecutionDetails/constants.ts index ec298b1d8..4c56659b4 100644 --- a/src/components/Executions/ExecutionDetails/constants.ts +++ b/src/components/Executions/ExecutionDetails/constants.ts @@ -3,6 +3,7 @@ export enum ExecutionMetadataLabels { domain = 'Domain', duration = 'Duration', time = 'Time', + relatedTo = 'Related to', version = 'Version' } @@ -20,3 +21,5 @@ export const tabs = { export const executionActionStrings = { clone: 'Clone Execution' }; + +export const backLinkTitle = 'Back to parent'; diff --git a/src/components/Executions/ExecutionDetails/test/ExecutionDetailsAppBarContent.test.tsx b/src/components/Executions/ExecutionDetails/test/ExecutionDetailsAppBarContent.test.tsx index 6410dd8b8..c64724fcb 100644 --- a/src/components/Executions/ExecutionDetails/test/ExecutionDetailsAppBarContent.test.tsx +++ b/src/components/Executions/ExecutionDetails/test/ExecutionDetailsAppBarContent.test.tsx @@ -9,13 +9,14 @@ import { ExecutionContext, ExecutionContextData } from 'components/Executions/contexts'; -import { Execution } from 'models'; +import { Execution, Identifier, ResourceType } from 'models'; import { createMockExecution } from 'models/__mocks__/executionsData'; import { WorkflowExecutionPhase } from 'models/Execution/enums'; import * as React from 'react'; import { MemoryRouter } from 'react-router'; +import { Routes } from 'routes'; import { delayedPromise, DelayedPromiseResult } from 'test/utils'; -import { executionActionStrings } from '../constants'; +import { backLinkTitle, executionActionStrings } from '../constants'; import { ExecutionDetailsAppBarContent } from '../ExecutionDetailsAppBarContent'; jest.mock('components/Navigation/NavBarContent', () => ({ @@ -27,9 +28,11 @@ describe('ExecutionDetailsAppBarContent', () => { let executionContext: ExecutionContextData; let mockTerminateExecution: jest.Mock>; let terminatePromise: DelayedPromiseResult; + let sourceId: Identifier; beforeEach(() => { execution = createMockExecution(); + sourceId = execution.closure.workflowId; mockTerminateExecution = jest.fn().mockImplementation(() => { terminatePromise = delayedPromise(); return terminatePromise; @@ -95,4 +98,59 @@ describe('ExecutionDetailsAppBarContent', () => { expect(queryByLabelText(commonLabels.moreOptionsButton)).toBeNull(); }); }); + + it('renders a back link to the parent workflow', async () => { + const { getByTitle } = renderContent(); + await waitFor(() => + expect(getByTitle(backLinkTitle)).toHaveAttribute( + 'href', + Routes.WorkflowDetails.makeUrl( + sourceId.project, + sourceId.domain, + sourceId.name + ) + ) + ); + }); + + it('renders the workflow name in the app bar content', async () => { + const { getByText } = renderContent(); + const { project, domain } = execution.id; + await waitFor(() => + expect( + getByText(`${project}/${domain}/${sourceId.name}/`) + ).toBeInTheDocument() + ); + }); + + describe('for single task executions', () => { + beforeEach(() => { + execution.spec.launchPlan.resourceType = ResourceType.TASK; + sourceId = execution.spec.launchPlan; + }); + + it('renders a back link to the parent task', async () => { + const { getByTitle } = renderContent(); + await waitFor(() => + expect(getByTitle(backLinkTitle)).toHaveAttribute( + 'href', + Routes.TaskDetails.makeUrl( + sourceId.project, + sourceId.domain, + sourceId.name + ) + ) + ); + }); + + it('renders the task name in the app bar content', async () => { + const { getByText } = renderContent(); + const { project, domain } = execution.id; + await waitFor(() => + expect( + getByText(`${project}/${domain}/${sourceId.name}/`) + ).toBeInTheDocument() + ); + }); + }); }); diff --git a/src/components/Executions/ExecutionDetails/test/ExecutionMetadata.test.tsx b/src/components/Executions/ExecutionDetails/test/ExecutionMetadata.test.tsx index 1975b8c18..ef5b23290 100644 --- a/src/components/Executions/ExecutionDetails/test/ExecutionMetadata.test.tsx +++ b/src/components/Executions/ExecutionDetails/test/ExecutionMetadata.test.tsx @@ -1,8 +1,10 @@ import { render } from '@testing-library/react'; import { dashedValueString } from 'common/constants'; -import { Execution } from 'models'; +import { Execution, WorkflowExecutionIdentifier } from 'models'; import { createMockExecution } from 'models/__mocks__/executionsData'; import * as React from 'react'; +import { MemoryRouter } from 'react-router'; +import { Routes } from 'routes'; import { ExecutionMetadataLabels } from '../constants'; import { ExecutionMetadata } from '../ExecutionMetadata'; @@ -17,7 +19,11 @@ describe('ExecutionMetadata', () => { }); const renderMetadata = () => - render(); + render( + + + + ); it('shows cluster name if available', () => { const { getByTestId } = renderMetadata(); @@ -57,4 +63,18 @@ describe('ExecutionMetadata', () => { dashedValueString ); }); + + it('shows reference execution if it exists', () => { + const referenceExecution: WorkflowExecutionIdentifier = { + project: 'project', + domain: 'domain', + name: '123abc' + }; + execution.spec.metadata.referenceExecution = referenceExecution; + const { getByText } = renderMetadata(); + expect(getByText(referenceExecution.name)).toHaveAttribute( + 'href', + Routes.ExecutionDetails.makeUrl(referenceExecution) + ); + }); }); diff --git a/src/components/Executions/ExecutionDetails/test/RelaunchExecutionForm.test.tsx b/src/components/Executions/ExecutionDetails/test/RelaunchExecutionForm.test.tsx new file mode 100644 index 000000000..32dcee7b3 --- /dev/null +++ b/src/components/Executions/ExecutionDetails/test/RelaunchExecutionForm.test.tsx @@ -0,0 +1,251 @@ +import { render, waitFor } from '@testing-library/react'; +import { mockAPIContextValue } from 'components/data/__mocks__/apiContext'; +import { APIContext, APIContextValue } from 'components/data/apiContext'; +import { mockSimpleVariables } from 'components/Launch/LaunchForm/__mocks__/mockInputs'; +import { primitiveLiteral } from 'components/Launch/LaunchForm/__mocks__/utils'; +import { LaunchForm } from 'components/Launch/LaunchForm/LaunchForm'; +import { + LaunchFormProps, + LiteralValueMap +} from 'components/Launch/LaunchForm/types'; +import { + createInputCacheKey, + getInputDefintionForLiteralType +} from 'components/Launch/LaunchForm/utils'; +import { + Execution, + ExecutionData, + getExecutionData, + getRemoteLiteralMap, + getTask, + getWorkflow, + LiteralMap, + ResourceType, + Task, + Variable, + Workflow +} from 'models'; +import { createMockExecution } from 'models/__mocks__/executionsData'; +import { createMockTask } from 'models/__mocks__/taskData'; +import { + createMockWorkflow, + createMockWorkflowClosure +} from 'models/__mocks__/workflowData'; +import * as React from 'react'; +import { long } from 'test/utils'; +import { RelaunchExecutionForm } from '../RelaunchExecutionForm'; + +const mockContentString = 'launchFormRendered'; +const simpleStringValue = 'abcdefg'; +const simpleIntegerValue = long(123456); + +jest.mock('components/Launch/LaunchForm/LaunchForm', () => ({ + LaunchForm: jest.fn(() => mockContentString) +})); + +function createValuesMap( + inputDefinitions: Record, + { literals }: LiteralMap +): LiteralValueMap { + return Object.entries(inputDefinitions).reduce((out, [name, input]) => { + out.set( + createInputCacheKey( + name, + getInputDefintionForLiteralType(input.type) + ), + literals[name] + ); + return out; + }, new Map()); +} + +describe('RelaunchExecutionForm', () => { + let apiContext: APIContextValue; + let execution: Execution; + let executionData: ExecutionData; + let executionInputs: LiteralMap; + let workflow: Workflow; + let task: Task; + let taskInputDefinitions: Record; + let workflowInputDefinitions: Record; + let onClose: jest.Mock; + let mockGetWorkflow: jest.Mock>; + let mockGetTask: jest.Mock>; + let mockGetExecutionData: jest.Mock>; + let mockGetRemoteLiteralMap: jest.Mock>; + + beforeEach(() => { + onClose = jest.fn(); + execution = createMockExecution(); + workflow = createMockWorkflow('MyWorkflow'); + workflow.closure = createMockWorkflowClosure(); + task = createMockTask('MyTask'); + executionData = { + inputs: { url: 'http://somePath', bytes: long(1000) }, + outputs: {} + }; + + mockGetWorkflow = jest.fn().mockResolvedValue(workflow); + mockGetTask = jest.fn().mockResolvedValue(task); + mockGetExecutionData = jest.fn().mockResolvedValue(executionData); + mockGetRemoteLiteralMap = jest.fn().mockResolvedValue({}); + apiContext = mockAPIContextValue({ + getExecutionData: mockGetExecutionData, + getRemoteLiteralMap: mockGetRemoteLiteralMap, + getTask: mockGetTask, + getWorkflow: mockGetWorkflow + }); + }); + + const renderForm = () => + render( + + + + ); + + const checkLaunchFormProps = (props: Partial) => { + expect(LaunchForm).toHaveBeenCalledWith( + expect.objectContaining(props), + expect.anything() + ); + }; + + it('passes original execution as a referenceExecution', async () => { + const { getByText } = renderForm(); + await waitFor(() => getByText(mockContentString)); + checkLaunchFormProps({ + referenceExecutionId: execution.id + }); + }); + + describe('with workflow execution', () => { + let values: LiteralValueMap; + beforeEach(() => { + workflowInputDefinitions = { + workflowSimpleString: mockSimpleVariables.simpleString, + workflowSimpleInteger: mockSimpleVariables.simpleInteger + }; + + workflow.closure!.compiledWorkflow!.primary.template.interface!.inputs = { + variables: workflowInputDefinitions + }; + + executionInputs = { + literals: { + workflowSimpleString: primitiveLiteral({ + stringValue: simpleStringValue + }), + workflowSimpleInteger: primitiveLiteral({ + integer: simpleIntegerValue + }) + } + }; + execution.closure.computedInputs = executionInputs; + mockGetRemoteLiteralMap.mockResolvedValue(executionInputs); + + values = createValuesMap(workflowInputDefinitions, executionInputs); + }); + + it('passes workflowId to LaunchForm', async () => { + const { getByText } = renderForm(); + await waitFor(() => getByText(mockContentString)); + checkLaunchFormProps({ + workflowId: execution.closure.workflowId + }); + }); + + it('maps execution input values to workflow inputs', async () => { + const { getByText } = renderForm(); + await waitFor(() => getByText(mockContentString)); + + checkLaunchFormProps({ + initialParameters: expect.objectContaining({ + values + }) + }); + }); + + it('correctly fetches remote execution inputs', async () => { + delete execution.closure.computedInputs; + const { getByText } = renderForm(); + await waitFor(() => getByText(mockContentString)); + expect(mockGetExecutionData).toHaveBeenCalledWith(execution.id); + expect(mockGetRemoteLiteralMap).toHaveBeenCalledWith( + executionData.inputs.url + ); + checkLaunchFormProps({ + initialParameters: expect.objectContaining({ + values + }) + }); + }); + }); + + describe('with single task execution', () => { + let values: LiteralValueMap; + beforeEach(() => { + execution.spec.launchPlan.resourceType = ResourceType.TASK; + taskInputDefinitions = { + taskSimpleString: mockSimpleVariables.simpleString, + taskSimpleInteger: mockSimpleVariables.simpleInteger + }; + task.closure.compiledTask.template.interface!.inputs = { + variables: taskInputDefinitions + }; + + executionInputs = { + literals: { + taskSimpleString: primitiveLiteral({ + stringValue: simpleStringValue + }), + taskSimpleInteger: primitiveLiteral({ + integer: simpleIntegerValue + }) + } + }; + execution.closure.computedInputs = executionInputs; + mockGetRemoteLiteralMap.mockResolvedValue(executionInputs); + values = createValuesMap(taskInputDefinitions, executionInputs); + }); + + it('passes taskId to LaunchForm', async () => { + const { getByText } = renderForm(); + await waitFor(() => getByText(mockContentString)); + checkLaunchFormProps({ + taskId: execution.spec.launchPlan + }); + }); + + it('maps execution input values to workflow inputs', async () => { + const { getByText } = renderForm(); + await waitFor(() => getByText(mockContentString)); + + checkLaunchFormProps({ + initialParameters: expect.objectContaining({ + values + }) + }); + }); + + it('correctly fetches remote execution inputs', async () => { + delete execution.closure.computedInputs; + const { getByText } = renderForm(); + await waitFor(() => getByText(mockContentString)); + expect(mockGetExecutionData).toHaveBeenCalledWith(execution.id); + expect(mockGetRemoteLiteralMap).toHaveBeenCalledWith( + executionData.inputs.url + ); + checkLaunchFormProps({ + initialParameters: expect.objectContaining({ + values + }) + }); + }); + }); +}); diff --git a/src/components/Executions/ExecutionDetails/utils.ts b/src/components/Executions/ExecutionDetails/utils.ts new file mode 100644 index 000000000..8045deb3a --- /dev/null +++ b/src/components/Executions/ExecutionDetails/utils.ts @@ -0,0 +1,19 @@ +import { Execution, Identifier, ResourceType } from 'models'; +import { Routes } from 'routes'; + +export function isSingleTaskExecution(execution: Execution) { + return execution.spec.launchPlan.resourceType === ResourceType.TASK; +} + +export function getExecutionSourceId(execution: Execution): Identifier { + return isSingleTaskExecution(execution) + ? execution.spec.launchPlan + : execution.closure.workflowId; +} + +export function getExecutionBackLink(execution: Execution): string { + const { project, domain, name } = getExecutionSourceId(execution); + return isSingleTaskExecution(execution) + ? Routes.TaskDetails.makeUrl(project, domain, name) + : Routes.WorkflowDetails.makeUrl(project, domain, name); +} diff --git a/src/components/Launch/LaunchWorkflowForm/BlobInput.tsx b/src/components/Launch/LaunchForm/BlobInput.tsx similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/BlobInput.tsx rename to src/components/Launch/LaunchForm/BlobInput.tsx diff --git a/src/components/Launch/LaunchWorkflowForm/CollectionInput.tsx b/src/components/Launch/LaunchForm/CollectionInput.tsx similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/CollectionInput.tsx rename to src/components/Launch/LaunchForm/CollectionInput.tsx diff --git a/src/components/Launch/LaunchWorkflowForm/DatetimeInput.tsx b/src/components/Launch/LaunchForm/DatetimeInput.tsx similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/DatetimeInput.tsx rename to src/components/Launch/LaunchForm/DatetimeInput.tsx diff --git a/src/components/Launch/LaunchForm/LaunchForm.tsx b/src/components/Launch/LaunchForm/LaunchForm.tsx new file mode 100644 index 000000000..1f724c93e --- /dev/null +++ b/src/components/Launch/LaunchForm/LaunchForm.tsx @@ -0,0 +1,30 @@ +import * as React from 'react'; +import { + createInputValueCache, + InputValueCacheContext +} from './inputValueCache'; +import { LaunchTaskForm } from './LaunchTaskForm'; +import { LaunchWorkflowForm } from './LaunchWorkflowForm'; +import { LaunchFormProps, LaunchWorkflowFormProps } from './types'; + +function isWorkflowPropsObject( + props: LaunchFormProps +): props is LaunchWorkflowFormProps { + return (props as LaunchWorkflowFormProps).workflowId !== undefined; +} + +/** Renders the form for initiating a Launch request based on a Workflow or Task */ +export const LaunchForm: React.FC = props => { + const [inputValueCache] = React.useState(createInputValueCache()); + + // TODO: Use LaunchTaskForm when it has been implemented. + return ( + + {isWorkflowPropsObject(props) ? ( + + ) : ( + + )} + + ); +}; diff --git a/src/components/Launch/LaunchForm/LaunchFormActions.tsx b/src/components/Launch/LaunchForm/LaunchFormActions.tsx new file mode 100644 index 000000000..c09c8ef9d --- /dev/null +++ b/src/components/Launch/LaunchForm/LaunchFormActions.tsx @@ -0,0 +1,89 @@ +import { Button, DialogActions, FormHelperText } from '@material-ui/core'; +import { ButtonCircularProgress } from 'components'; +import * as React from 'react'; +import { history } from 'routes/history'; +import { Routes } from 'routes/routes'; +import { formStrings } from './constants'; +import { LaunchState } from './launchMachine'; +import { useStyles } from './styles'; +import { BaseInterpretedLaunchState, BaseLaunchService } from './types'; + +export interface LaunchFormActionsProps { + state: BaseInterpretedLaunchState; + service: BaseLaunchService; + onClose(): void; +} +/** Renders the Submit/Cancel buttons for a LaunchForm */ +export const LaunchFormActions: React.FC = ({ + state, + service, + onClose +}) => { + const styles = useStyles(); + const submissionInFlight = state.matches(LaunchState.SUBMITTING); + const canSubmit = [ + LaunchState.ENTER_INPUTS, + LaunchState.VALIDATING_INPUTS, + LaunchState.INVALID_INPUTS, + LaunchState.SUBMIT_FAILED + ].some(state.matches); + + const submit: React.FormEventHandler = event => { + event.preventDefault(); + service.send({ type: 'SUBMIT' }); + }; + + const onCancel = () => { + service.send({ type: 'CANCEL' }); + onClose(); + }; + + React.useEffect(() => { + const subscription = service.subscribe(newState => { + // On transition to final success state, read the resulting execution + // id and navigate to the Execution Details page. + // if (state.matches({ submit: 'succeeded' })) { + if (newState.matches(LaunchState.SUBMIT_SUCCEEDED)) { + history.push( + Routes.ExecutionDetails.makeUrl( + newState.context.resultExecutionId + ) + ); + } + }); + + return subscription.unsubscribe; + }, [service]); + + return ( +
    + {state.matches(LaunchState.SUBMIT_FAILED) ? ( + + {state.context.error.message} + + ) : null} + + + + +
    + ); +}; diff --git a/src/components/Launch/LaunchForm/LaunchFormHeader.tsx b/src/components/Launch/LaunchForm/LaunchFormHeader.tsx new file mode 100644 index 000000000..38aa12a96 --- /dev/null +++ b/src/components/Launch/LaunchForm/LaunchFormHeader.tsx @@ -0,0 +1,17 @@ +import { DialogTitle, Typography } from '@material-ui/core'; +import * as React from 'react'; +import { formStrings } from './constants'; +import { useStyles } from './styles'; + +/** Shared header component for the Launch form */ +export const LaunchFormHeader: React.FC<{ title?: string }> = ({ + title = '' +}) => { + const styles = useStyles(); + return ( + +
    {formStrings.title}
    + {title} +
    + ); +}; diff --git a/src/components/Launch/LaunchForm/LaunchFormInputs.tsx b/src/components/Launch/LaunchForm/LaunchFormInputs.tsx new file mode 100644 index 000000000..01ae9adb5 --- /dev/null +++ b/src/components/Launch/LaunchForm/LaunchFormInputs.tsx @@ -0,0 +1,91 @@ +import * as React from 'react'; +import { BlobInput } from './BlobInput'; +import { CollectionInput } from './CollectionInput'; +import { formStrings } from './constants'; +import { LaunchState } from './launchMachine'; +import { SimpleInput } from './SimpleInput'; +import { useStyles } from './styles'; +import { + BaseInterpretedLaunchState, + InputProps, + InputType, + LaunchFormInputsRef +} from './types'; +import { UnsupportedInput } from './UnsupportedInput'; +import { UnsupportedRequiredInputsError } from './UnsupportedRequiredInputsError'; +import { useFormInputsState } from './useFormInputsState'; + +function getComponentForInput(input: InputProps, showErrors: boolean) { + const props = { ...input, error: showErrors ? input.error : undefined }; + switch (input.typeDefinition.type) { + case InputType.Blob: + return ; + case InputType.Collection: + return ; + case InputType.Map: + case InputType.Schema: + case InputType.Unknown: + case InputType.None: + return ; + default: + return ; + } +} + +export interface LaunchFormInputsProps { + state: BaseInterpretedLaunchState; + variant: 'workflow' | 'task'; +} + +export const LaunchFormInputsImpl: React.RefForwardingComponent< + LaunchFormInputsRef, + LaunchFormInputsProps +> = ({ state, variant }, ref) => { + const { + parsedInputs, + unsupportedRequiredInputs, + showErrors + } = state.context; + const { getValues, inputs, validate } = useFormInputsState(parsedInputs); + const styles = useStyles(); + React.useImperativeHandle(ref, () => ({ + getValues, + validate + })); + + const showInputs = [ + LaunchState.UNSUPPORTED_INPUTS, + LaunchState.ENTER_INPUTS, + LaunchState.VALIDATING_INPUTS, + LaunchState.INVALID_INPUTS, + LaunchState.SUBMIT_VALIDATING, + LaunchState.SUBMITTING, + LaunchState.SUBMIT_FAILED, + LaunchState.SUBMIT_SUCCEEDED + ].some(state.matches); + + return showInputs ? ( +
    + {state.matches(LaunchState.UNSUPPORTED_INPUTS) ? ( + + ) : ( + <> + {inputs.map(input => ( +
    + {getComponentForInput(input, showErrors)} +
    + ))} + + )} +
    + ) : null; +}; + +/** Renders an array of `ParsedInput` values using the appropriate + * components. A `ref` to this component is used to access the current + * form values and trigger manual validation if needed. + */ +export const LaunchFormInputs = React.forwardRef(LaunchFormInputsImpl); diff --git a/src/components/Launch/LaunchForm/LaunchTaskForm.tsx b/src/components/Launch/LaunchForm/LaunchTaskForm.tsx new file mode 100644 index 000000000..12f52dd7d --- /dev/null +++ b/src/components/Launch/LaunchForm/LaunchTaskForm.tsx @@ -0,0 +1,83 @@ +import { DialogContent } from '@material-ui/core'; +import { getCacheKey } from 'components/Cache/utils'; +import * as React from 'react'; +import { formStrings } from './constants'; +import { LaunchFormActions } from './LaunchFormActions'; +import { LaunchFormHeader } from './LaunchFormHeader'; +import { LaunchFormInputs } from './LaunchFormInputs'; +import { LaunchState } from './launchMachine'; +import { SearchableSelector } from './SearchableSelector'; +import { useStyles } from './styles'; +import { + BaseInterpretedLaunchState, + BaseLaunchService, + LaunchTaskFormProps +} from './types'; +import { useLaunchTaskFormState } from './useLaunchTaskFormState'; + +/** Renders the form for initiating a Launch request based on a Task */ +export const LaunchTaskForm: React.FC = props => { + const { + formInputsRef, + state, + service, + taskSourceSelectorState + } = useLaunchTaskFormState(props); + const styles = useStyles(); + const baseState = state as BaseInterpretedLaunchState; + const baseService = service as BaseLaunchService; + + // Any time the inputs change (even if it's just re-ordering), we must + // change the form key so that the inputs component will re-mount. + const formKey = React.useMemo(() => { + return getCacheKey(state.context.parsedInputs); + }, [state.context.parsedInputs]); + + const { + fetchSearchResults, + onSelectTaskVersion, + selectedTask, + taskSelectorOptions + } = taskSourceSelectorState; + + const showTaskSelector = ![ + LaunchState.LOADING_TASK_VERSIONS, + LaunchState.FAILED_LOADING_TASK_VERSIONS + ].some(state.matches); + + // TODO: We removed all loading indicators here. Decide if we want skeletons + // instead. + return ( + <> + + + {showTaskSelector ? ( +
    + +
    + ) : null} + +
    + + + ); +}; diff --git a/src/components/Launch/LaunchForm/LaunchWorkflowForm.tsx b/src/components/Launch/LaunchForm/LaunchWorkflowForm.tsx new file mode 100644 index 000000000..fffe4d7ae --- /dev/null +++ b/src/components/Launch/LaunchForm/LaunchWorkflowForm.tsx @@ -0,0 +1,106 @@ +import { DialogContent } from '@material-ui/core'; +import { getCacheKey } from 'components/Cache/utils'; +import * as React from 'react'; +import { formStrings } from './constants'; +import { LaunchFormActions } from './LaunchFormActions'; +import { LaunchFormHeader } from './LaunchFormHeader'; +import { LaunchFormInputs } from './LaunchFormInputs'; +import { LaunchState } from './launchMachine'; +import { SearchableSelector } from './SearchableSelector'; +import { useStyles } from './styles'; +import { + BaseInterpretedLaunchState, + BaseLaunchService, + LaunchWorkflowFormProps +} from './types'; +import { useLaunchWorkflowFormState } from './useLaunchWorkflowFormState'; + +/** Renders the form for initiating a Launch request based on a Workflow */ +export const LaunchWorkflowForm: React.FC = props => { + const { + formInputsRef, + state, + service, + workflowSourceSelectorState + } = useLaunchWorkflowFormState(props); + const styles = useStyles(); + const baseState = state as BaseInterpretedLaunchState; + const baseService = service as BaseLaunchService; + + // Any time the inputs change (even if it's just re-ordering), we must + // change the form key so that the inputs component will re-mount. + const formKey = React.useMemo(() => { + return getCacheKey(state.context.parsedInputs); + }, [state.context.parsedInputs]); + + const { + fetchSearchResults, + launchPlanSelectorOptions, + onSelectLaunchPlan, + onSelectWorkflowVersion, + selectedLaunchPlan, + selectedWorkflow, + workflowSelectorOptions + } = workflowSourceSelectorState; + + const showWorkflowSelector = ![ + LaunchState.LOADING_WORKFLOW_VERSIONS, + LaunchState.FAILED_LOADING_WORKFLOW_VERSIONS + ].some(state.matches); + const showLaunchPlanSelector = + state.context.workflowVersion && + ![ + LaunchState.LOADING_LAUNCH_PLANS, + LaunchState.FAILED_LOADING_LAUNCH_PLANS + ].some(state.matches); + + // TODO: We removed all loading indicators here. Decide if we want skeletons + // instead. + return ( + <> + + + {showWorkflowSelector ? ( +
    + +
    + ) : null} + {showLaunchPlanSelector ? ( +
    + +
    + ) : null} + +
    + + + ); +}; diff --git a/src/components/Launch/LaunchWorkflowForm/SearchableSelector.tsx b/src/components/Launch/LaunchForm/SearchableSelector.tsx similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/SearchableSelector.tsx rename to src/components/Launch/LaunchForm/SearchableSelector.tsx diff --git a/src/components/Launch/LaunchWorkflowForm/SimpleInput.tsx b/src/components/Launch/LaunchForm/SimpleInput.tsx similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/SimpleInput.tsx rename to src/components/Launch/LaunchForm/SimpleInput.tsx diff --git a/src/components/Launch/LaunchWorkflowForm/UnsupportedInput.tsx b/src/components/Launch/LaunchForm/UnsupportedInput.tsx similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/UnsupportedInput.tsx rename to src/components/Launch/LaunchForm/UnsupportedInput.tsx diff --git a/src/components/Launch/LaunchWorkflowForm/UnsupportedRequiredInputsError.tsx b/src/components/Launch/LaunchForm/UnsupportedRequiredInputsError.tsx similarity index 77% rename from src/components/Launch/LaunchWorkflowForm/UnsupportedRequiredInputsError.tsx rename to src/components/Launch/LaunchForm/UnsupportedRequiredInputsError.tsx index 6d31b61d0..34d989253 100644 --- a/src/components/Launch/LaunchWorkflowForm/UnsupportedRequiredInputsError.tsx +++ b/src/components/Launch/LaunchForm/UnsupportedRequiredInputsError.tsx @@ -4,9 +4,11 @@ import { NonIdealState } from 'components/common'; import { useCommonStyles } from 'components/common/styles'; import * as React from 'react'; import { + cannotLaunchTaskString, cannotLaunchWorkflowString, requiredInputSuffix, - unsupportedRequiredInputsString + taskUnsupportedRequiredInputsString, + workflowUnsupportedRequiredInputsString } from './constants'; import { ParsedInput } from './types'; @@ -28,24 +30,33 @@ function formatLabel(label: string) { export interface UnsupportedRequiredInputsErrorProps { inputs: ParsedInput[]; + variant: 'workflow' | 'task'; } /** An informational error to be shown if a Workflow cannot be launch due to * required inputs for which we will not be able to provide a value. */ export const UnsupportedRequiredInputsError: React.FC = ({ - inputs + inputs, + variant }) => { const styles = useStyles(); const commonStyles = useCommonStyles(); + const [titleString, errorString] = + variant === 'workflow' + ? [ + cannotLaunchWorkflowString, + workflowUnsupportedRequiredInputsString + ] + : [cannotLaunchTaskString, taskUnsupportedRequiredInputsString]; return (
    -

    {unsupportedRequiredInputsString}

    +

    {errorString}

      {inputs.map(input => (
    • ): TypedInterface { return { diff --git a/src/components/Launch/LaunchWorkflowForm/__mocks__/utils.ts b/src/components/Launch/LaunchForm/__mocks__/utils.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/__mocks__/utils.ts rename to src/components/Launch/LaunchForm/__mocks__/utils.ts diff --git a/src/components/Launch/LaunchWorkflowForm/__stories__/LaunchWorkflowForm.stories.tsx b/src/components/Launch/LaunchForm/__stories__/LaunchForm.stories.tsx similarity index 88% rename from src/components/Launch/LaunchWorkflowForm/__stories__/LaunchWorkflowForm.stories.tsx rename to src/components/Launch/LaunchForm/__stories__/LaunchForm.stories.tsx index d7497d34b..658a8eae3 100644 --- a/src/components/Launch/LaunchWorkflowForm/__stories__/LaunchWorkflowForm.stories.tsx +++ b/src/components/Launch/LaunchForm/__stories__/LaunchForm.stories.tsx @@ -23,16 +23,17 @@ import { import { mockWorkflowExecutionResponse } from 'models/Execution/__mocks__/mockWorkflowExecutionsData'; import * as React from 'react'; import { - createMockWorkflowInputsInterface, + createMockInputsInterface, mockCollectionVariables, mockNestedCollectionVariables, mockSimpleVariables, simpleVariableDefaults, SimpleVariableKey } from '../__mocks__/mockInputs'; -import { LaunchWorkflowForm } from '../LaunchWorkflowForm'; +import { LaunchForm } from '../LaunchForm'; import { binaryInputName, errorInputName } from '../test/constants'; -import { useExecutionLaunchConfiguration } from '../useExecutionLaunchConfiguration'; +import { WorkflowInitialLaunchParameters } from '../types'; +import { useMappedExecutionInputValues } from '../useMappedExecutionInputValues'; import { getWorkflowInputs } from '../utils'; const booleanInputName = 'simpleBoolean'; @@ -44,7 +45,7 @@ const submitAction = action('createWorkflowExecution'); const generateMocks = (variables: Record) => { const mockWorkflow = createMockWorkflow('MyWorkflow'); mockWorkflow.closure = createMockWorkflowClosure(); - mockWorkflow.closure!.compiledWorkflow!.primary.template.interface = createMockWorkflowInputsInterface( + mockWorkflow.closure!.compiledWorkflow!.primary.template.interface = createMockInputsInterface( variables ); @@ -95,7 +96,7 @@ const generateMocks = (variables: Record) => { id }; workflow.closure = createMockWorkflowClosure(); - workflow.closure!.compiledWorkflow!.primary.template.interface = createMockWorkflowInputsInterface( + workflow.closure!.compiledWorkflow!.primary.template.interface = createMockInputsInterface( variables ); @@ -117,17 +118,26 @@ interface RenderFormArgs { const LaunchFormWithExecution: React.FC = ({ execution, mocks: { mockWorkflow } }) => { - const launchConfig = useExecutionLaunchConfiguration({ + const { + closure: { workflowId }, + spec: { launchPlan } + } = execution; + const executionInputs = useMappedExecutionInputValues({ execution, - workflowInputs: getWorkflowInputs(mockWorkflow) + inputDefinitions: getWorkflowInputs(mockWorkflow) }); + const initialParameters: WorkflowInitialLaunchParameters = { + workflowId, + launchPlan, + values: executionInputs.value + }; const onClose = () => console.log('Close'); return ( - - + ); @@ -148,7 +158,7 @@ const renderForm = (args: RenderFormArgs) => { execution={args.execution} /> ) : ( - @@ -158,7 +168,7 @@ const renderForm = (args: RenderFormArgs) => { ); }; -const stories = storiesOf('Launch/LaunchWorkflowForm', module); +const stories = storiesOf('Launch/LaunchForm/Workflow', module); stories.add('Simple', () => renderForm({ mocks: generateMocks(mockSimpleVariables) }) diff --git a/src/components/Launch/LaunchWorkflowForm/__stories__/WorkflowSelector.stories.tsx b/src/components/Launch/LaunchForm/__stories__/WorkflowSelector.stories.tsx similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/__stories__/WorkflowSelector.stories.tsx rename to src/components/Launch/LaunchForm/__stories__/WorkflowSelector.stories.tsx diff --git a/src/components/Launch/LaunchWorkflowForm/constants.ts b/src/components/Launch/LaunchForm/constants.ts similarity index 74% rename from src/components/Launch/LaunchWorkflowForm/constants.ts rename to src/components/Launch/LaunchForm/constants.ts index c873f7ab2..31f18c1e4 100644 --- a/src/components/Launch/LaunchWorkflowForm/constants.ts +++ b/src/components/Launch/LaunchForm/constants.ts @@ -17,7 +17,8 @@ export const formStrings = { cancel: 'Cancel', inputs: 'Inputs', submit: 'Launch', - title: 'Launch Workflow', + taskVersion: 'Task Version', + title: 'Create New Execution', workflowVersion: 'Workflow Version', launchPlan: 'Launch Plan' }; @@ -62,6 +63,8 @@ export const defaultBlobValue: BlobValue = { export const requiredInputSuffix = '*'; export const cannotLaunchWorkflowString = 'Workflow cannot be launched'; -export const unsupportedRequiredInputsString = `This Workflow version contains one or more required inputs which are not supported by Flyte Console and do not have default values specified in the Workflow definition or the selected Launch Plan.\n\nYou can launch this Workflow version with the Flyte CLI or by selecting a Launch Plan which provides values for the unsupported inputs.\n\nThe required inputs are :`; +export const cannotLaunchTaskString = 'Task cannot be launched'; +export const workflowUnsupportedRequiredInputsString = `This Workflow version contains one or more required inputs which are not supported by Flyte Console and do not have default values specified in the Workflow definition or the selected Launch Plan.\n\nYou can launch this Workflow version with the Flyte CLI or by selecting a Launch Plan which provides values for the unsupported inputs.\n\nThe required inputs are :`; +export const taskUnsupportedRequiredInputsString = `This Task version contains one or more required inputs which are not supported by Flyte Console.\n\nYou can launch this Task version with the Flyte CLI instead.\n\nThe required inputs are :`; export const blobUriHelperText = '(required) location of the data'; export const blobFormatHelperText = '(optional) csv, parquet, etc...'; diff --git a/src/components/Launch/LaunchWorkflowForm/getInputs.ts b/src/components/Launch/LaunchForm/getInputs.ts similarity index 62% rename from src/components/Launch/LaunchWorkflowForm/getInputs.ts rename to src/components/Launch/LaunchForm/getInputs.ts index 63dd7c754..16b233265 100644 --- a/src/components/Launch/LaunchWorkflowForm/getInputs.ts +++ b/src/components/Launch/LaunchForm/getInputs.ts @@ -1,11 +1,12 @@ import { sortedObjectEntries } from 'common/utils'; -import { LaunchPlan, Workflow } from 'models'; +import { LaunchPlan, Task, Workflow } from 'models'; import { requiredInputSuffix } from './constants'; import { LiteralValueMap, ParsedInput } from './types'; import { createInputCacheKey, formatLabelWithType, getInputDefintionForLiteralType, + getTaskInputs, getWorkflowInputs } from './utils'; @@ -13,7 +14,7 @@ import { // to depend on the existence of a value const emptyDescription = ' '; -export function getInputs( +export function getInputsForWorkflow( workflow: Workflow, launchPlan: LaunchPlan, initialValues: LiteralValueMap = new Map() @@ -57,3 +58,35 @@ export function getInputs( }; }); } + +export function getInputsForTask( + task: Task, + initialValues: LiteralValueMap = new Map() +): ParsedInput[] { + if (!task) { + return []; + } + + const taskInputs = getTaskInputs(task); + return sortedObjectEntries(taskInputs).map(value => { + const [name, { description = emptyDescription, type }] = value; + const typeDefinition = getInputDefintionForLiteralType(type); + const typeLabel = formatLabelWithType(name, typeDefinition); + const label = `${typeLabel}${requiredInputSuffix}`; + const inputKey = createInputCacheKey(name, typeDefinition); + const initialValue = initialValues.has(inputKey) + ? initialValues.get(inputKey) + : undefined; + + return { + description, + initialValue, + label, + name, + typeDefinition, + // Task inputs are always required, as there is no default provided + // by a parent workflow. + required: true + }; + }); +} diff --git a/src/components/Launch/LaunchWorkflowForm/inputHelpers/blob.ts b/src/components/Launch/LaunchForm/inputHelpers/blob.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/inputHelpers/blob.ts rename to src/components/Launch/LaunchForm/inputHelpers/blob.ts diff --git a/src/components/Launch/LaunchWorkflowForm/inputHelpers/boolean.ts b/src/components/Launch/LaunchForm/inputHelpers/boolean.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/inputHelpers/boolean.ts rename to src/components/Launch/LaunchForm/inputHelpers/boolean.ts diff --git a/src/components/Launch/LaunchWorkflowForm/inputHelpers/collection.ts b/src/components/Launch/LaunchForm/inputHelpers/collection.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/inputHelpers/collection.ts rename to src/components/Launch/LaunchForm/inputHelpers/collection.ts diff --git a/src/components/Launch/LaunchWorkflowForm/inputHelpers/constants.ts b/src/components/Launch/LaunchForm/inputHelpers/constants.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/inputHelpers/constants.ts rename to src/components/Launch/LaunchForm/inputHelpers/constants.ts diff --git a/src/components/Launch/LaunchWorkflowForm/inputHelpers/datetime.ts b/src/components/Launch/LaunchForm/inputHelpers/datetime.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/inputHelpers/datetime.ts rename to src/components/Launch/LaunchForm/inputHelpers/datetime.ts diff --git a/src/components/Launch/LaunchWorkflowForm/inputHelpers/duration.ts b/src/components/Launch/LaunchForm/inputHelpers/duration.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/inputHelpers/duration.ts rename to src/components/Launch/LaunchForm/inputHelpers/duration.ts diff --git a/src/components/Launch/LaunchWorkflowForm/inputHelpers/float.ts b/src/components/Launch/LaunchForm/inputHelpers/float.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/inputHelpers/float.ts rename to src/components/Launch/LaunchForm/inputHelpers/float.ts diff --git a/src/components/Launch/LaunchWorkflowForm/inputHelpers/getHelperForInput.ts b/src/components/Launch/LaunchForm/inputHelpers/getHelperForInput.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/inputHelpers/getHelperForInput.ts rename to src/components/Launch/LaunchForm/inputHelpers/getHelperForInput.ts diff --git a/src/components/Launch/LaunchWorkflowForm/inputHelpers/inputHelpers.ts b/src/components/Launch/LaunchForm/inputHelpers/inputHelpers.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/inputHelpers/inputHelpers.ts rename to src/components/Launch/LaunchForm/inputHelpers/inputHelpers.ts diff --git a/src/components/Launch/LaunchWorkflowForm/inputHelpers/integer.ts b/src/components/Launch/LaunchForm/inputHelpers/integer.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/inputHelpers/integer.ts rename to src/components/Launch/LaunchForm/inputHelpers/integer.ts diff --git a/src/components/Launch/LaunchWorkflowForm/inputHelpers/none.ts b/src/components/Launch/LaunchForm/inputHelpers/none.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/inputHelpers/none.ts rename to src/components/Launch/LaunchForm/inputHelpers/none.ts diff --git a/src/components/Launch/LaunchWorkflowForm/inputHelpers/parseJson.ts b/src/components/Launch/LaunchForm/inputHelpers/parseJson.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/inputHelpers/parseJson.ts rename to src/components/Launch/LaunchForm/inputHelpers/parseJson.ts diff --git a/src/components/Launch/LaunchWorkflowForm/inputHelpers/string.ts b/src/components/Launch/LaunchForm/inputHelpers/string.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/inputHelpers/string.ts rename to src/components/Launch/LaunchForm/inputHelpers/string.ts diff --git a/src/components/Launch/LaunchWorkflowForm/inputHelpers/test/inputHelpers.test.ts b/src/components/Launch/LaunchForm/inputHelpers/test/inputHelpers.test.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/inputHelpers/test/inputHelpers.test.ts rename to src/components/Launch/LaunchForm/inputHelpers/test/inputHelpers.test.ts diff --git a/src/components/Launch/LaunchWorkflowForm/inputHelpers/test/testCases.ts b/src/components/Launch/LaunchForm/inputHelpers/test/testCases.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/inputHelpers/test/testCases.ts rename to src/components/Launch/LaunchForm/inputHelpers/test/testCases.ts diff --git a/src/components/Launch/LaunchWorkflowForm/inputHelpers/test/utils.test.ts b/src/components/Launch/LaunchForm/inputHelpers/test/utils.test.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/inputHelpers/test/utils.test.ts rename to src/components/Launch/LaunchForm/inputHelpers/test/utils.test.ts diff --git a/src/components/Launch/LaunchWorkflowForm/inputHelpers/types.ts b/src/components/Launch/LaunchForm/inputHelpers/types.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/inputHelpers/types.ts rename to src/components/Launch/LaunchForm/inputHelpers/types.ts diff --git a/src/components/Launch/LaunchWorkflowForm/inputHelpers/utils.ts b/src/components/Launch/LaunchForm/inputHelpers/utils.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/inputHelpers/utils.ts rename to src/components/Launch/LaunchForm/inputHelpers/utils.ts diff --git a/src/components/Launch/LaunchWorkflowForm/inputValueCache.ts b/src/components/Launch/LaunchForm/inputValueCache.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/inputValueCache.ts rename to src/components/Launch/LaunchForm/inputValueCache.ts diff --git a/src/components/Launch/LaunchForm/launchMachine.ts b/src/components/Launch/LaunchForm/launchMachine.ts new file mode 100644 index 000000000..317ca783a --- /dev/null +++ b/src/components/Launch/LaunchForm/launchMachine.ts @@ -0,0 +1,517 @@ +import { + Identifier, + LaunchPlan, + NamedEntityIdentifier, + Task, + Workflow, + WorkflowExecutionIdentifier, + WorkflowId +} from 'models'; +import { + assign, + DoneInvokeEvent, + Machine, + MachineConfig, + MachineOptions, + StatesConfig +} from 'xstate'; +import { LiteralValueMap, ParsedInput } from './types'; + +export type SelectWorkflowVersionEvent = { + type: 'SELECT_WORKFLOW_VERSION'; + workflowId: WorkflowId; +}; +export type SelectTaskVersionEvent = { + type: 'SELECT_TASK_VERSION'; + taskId: Identifier; +}; +export type SelectLaunchPlanEvent = { + type: 'SELECT_LAUNCH_PLAN'; + launchPlan: LaunchPlan; +}; +export type WorkflowVersionOptionsLoadedEvent = DoneInvokeEvent; +export type LaunchPlanOptionsLoadedEvent = DoneInvokeEvent; +export type TaskVersionOptionsLoadedEvent = DoneInvokeEvent; +export type ExecutionCreatedEvent = DoneInvokeEvent< + WorkflowExecutionIdentifier +>; +export type InputsParsedEvent = DoneInvokeEvent<{ + parsedInputs: ParsedInput[]; + unsupportedRequiredInputs?: ParsedInput[]; +}>; +export type ErrorEvent = DoneInvokeEvent; + +export type BaseLaunchEvent = + | { type: 'CANCEL' } + | { type: 'SUBMIT' } + | { type: 'RETRY' } + | InputsParsedEvent + | SelectTaskVersionEvent + | SelectLaunchPlanEvent + | ExecutionCreatedEvent + | ErrorEvent; + +export type TaskLaunchEvent = + | BaseLaunchEvent + | TaskVersionOptionsLoadedEvent + | SelectTaskVersionEvent; + +export type WorkflowLaunchEvent = + | BaseLaunchEvent + | SelectWorkflowVersionEvent + | WorkflowVersionOptionsLoadedEvent + | LaunchPlanOptionsLoadedEvent; + +export interface BaseLaunchContext { + defaultInputValues?: LiteralValueMap; + parsedInputs: ParsedInput[]; + resultExecutionId?: WorkflowExecutionIdentifier; + sourceId?: NamedEntityIdentifier; + error?: Error; + showErrors: boolean; + referenceExecutionId?: WorkflowExecutionIdentifier; + unsupportedRequiredInputs: ParsedInput[]; +} + +export interface WorkflowLaunchContext extends BaseLaunchContext { + launchPlan?: LaunchPlan; + launchPlanOptions?: LaunchPlan[]; + preferredLaunchPlanId?: Identifier; + preferredWorkflowId?: Identifier; + workflowVersion?: WorkflowId; + workflowVersionOptions?: Workflow[]; +} + +export interface TaskLaunchContext extends BaseLaunchContext { + preferredTaskId?: Identifier; + taskVersion?: Identifier; + taskVersionOptions?: Task[]; +} + +export enum LaunchState { + CANCELLED = 'CANCELLED', + SELECT_SOURCE = 'SELECT_SOURCE', + LOADING_WORKFLOW_VERSIONS = 'LOADING_WORKFLOW_VERSIONS', + FAILED_LOADING_WORKFLOW_VERSIONS = 'FAILED_LOADING_WORKFLOW_VERSIONS', + SELECT_WORKFLOW_VERSION = 'SELECT_WORKFLOW_VERSION', + LOADING_LAUNCH_PLANS = 'LOADING_LAUNCH_PLANS', + FAILED_LOADING_LAUNCH_PLANS = 'FAILED_LOADING_LAUNCH_PLANS', + SELECT_LAUNCH_PLAN = 'SELECT_LAUNCH_PLAN', + LOADING_TASK_VERSIONS = 'LOADING_TASK_VERSIONS', + FAILED_LOADING_TASK_VERSIONS = 'FAILED_LOADING_TASK_VERSIONS', + SELECT_TASK_VERSION = 'SELECT_TASK_VERSION', + LOADING_INPUTS = 'LOADING_INPUTS', + FAILED_LOADING_INPUTS = 'FAILED_LOADING_INPUTS', + UNSUPPORTED_INPUTS = 'UNSUPPORTED_INPUTS', + ENTER_INPUTS = 'ENTER_INPUTS', + VALIDATING_INPUTS = 'VALIDATING_INPUTS', + INVALID_INPUTS = 'INVALID_INPUTS', + SUBMIT_VALIDATING = 'SUBMIT_VALIDATING', + SUBMITTING = 'SUBMITTING', + SUBMIT_FAILED = 'SUBMIT_FAILED', + SUBMIT_SUCCEEDED = 'SUBMIT_SUCCEEDED' +} + +interface BaseLaunchSchema { + states: { + [LaunchState.CANCELLED]: {}; + [LaunchState.LOADING_INPUTS]: {}; + [LaunchState.FAILED_LOADING_INPUTS]: {}; + [LaunchState.UNSUPPORTED_INPUTS]: {}; + [LaunchState.ENTER_INPUTS]: {}; + [LaunchState.VALIDATING_INPUTS]: {}; + [LaunchState.INVALID_INPUTS]: {}; + [LaunchState.SUBMIT_VALIDATING]: {}; + [LaunchState.SUBMITTING]: {}; + [LaunchState.SUBMIT_FAILED]: {}; + [LaunchState.SUBMIT_SUCCEEDED]: {}; + }; +} + +interface TaskLaunchSchema extends BaseLaunchSchema { + states: BaseLaunchSchema['states'] & { + [LaunchState.LOADING_TASK_VERSIONS]: {}; + [LaunchState.FAILED_LOADING_TASK_VERSIONS]: {}; + [LaunchState.SELECT_TASK_VERSION]: {}; + }; +} +interface WorkflowLaunchSchema extends BaseLaunchSchema { + states: BaseLaunchSchema['states'] & { + [LaunchState.LOADING_WORKFLOW_VERSIONS]: {}; + [LaunchState.FAILED_LOADING_WORKFLOW_VERSIONS]: {}; + [LaunchState.SELECT_WORKFLOW_VERSION]: {}; + [LaunchState.LOADING_LAUNCH_PLANS]: {}; + [LaunchState.FAILED_LOADING_LAUNCH_PLANS]: {}; + [LaunchState.SELECT_LAUNCH_PLAN]: {}; + }; +} + +/** Typestates to narrow down the `context` values based on the result of + * a `state.matches` check. + */ +export type BaseLaunchTypestate = + | { + value: LaunchState; + context: BaseLaunchContext; + } + | { + value: LaunchState.UNSUPPORTED_INPUTS; + context: BaseLaunchContext & { + parsedInputs: []; + unsupportedRequiredInputs: []; + }; + } + | { + value: + | LaunchState.ENTER_INPUTS + | LaunchState.VALIDATING_INPUTS + | LaunchState.INVALID_INPUTS + | LaunchState.SUBMIT_VALIDATING + | LaunchState.SUBMITTING + | LaunchState.SUBMIT_SUCCEEDED; + context: BaseLaunchContext & { + parsedInputs: []; + }; + } + | { + value: LaunchState.SUBMIT_SUCCEEDED; + context: BaseLaunchContext & { + resultExecutionId: WorkflowExecutionIdentifier; + }; + } + | { + value: LaunchState.SUBMIT_FAILED; + context: BaseLaunchContext & { + parsedInputs: ParsedInput[]; + error: Error; + }; + } + | { + value: + | LaunchState.FAILED_LOADING_INPUTS + | LaunchState.FAILED_LOADING_LAUNCH_PLANS + | LaunchState.FAILED_LOADING_TASK_VERSIONS + | LaunchState.FAILED_LOADING_WORKFLOW_VERSIONS; + context: BaseLaunchContext & { + error: Error; + }; + }; + +export type WorkflowLaunchTypestate = + | BaseLaunchTypestate + | { + value: LaunchState.SELECT_WORKFLOW_VERSION; + context: WorkflowLaunchContext & { + sourceId: NamedEntityIdentifier; + workflowVersionOptions: Workflow[]; + }; + } + | { + value: LaunchState.SELECT_LAUNCH_PLAN; + context: WorkflowLaunchContext & { + launchPlanOptions: LaunchPlan[]; + sourceId: NamedEntityIdentifier; + workflowVersionOptions: Workflow[]; + }; + }; + +export type TaskLaunchTypestate = + | BaseLaunchTypestate + | { + value: LaunchState.SELECT_TASK_VERSION; + context: TaskLaunchContext & { + sourceId: NamedEntityIdentifier; + taskVersionOptions: Task[]; + }; + }; + +const defaultBaseContext: BaseLaunchContext = { + parsedInputs: [], + showErrors: false, + unsupportedRequiredInputs: [] +}; + +const defaultHandlers = { + CANCEL: LaunchState.CANCELLED +}; + +const baseStateConfig: StatesConfig< + BaseLaunchContext, + BaseLaunchSchema, + BaseLaunchEvent +> = { + [LaunchState.CANCELLED]: { + type: 'final' + }, + [LaunchState.LOADING_INPUTS]: { + entry: ['hideErrors'], + invoke: { + src: 'loadInputs', + onDone: { + target: LaunchState.ENTER_INPUTS, + actions: ['setInputs'] + }, + onError: { + target: LaunchState.FAILED_LOADING_INPUTS, + actions: ['setError'] + } + } + }, + [LaunchState.FAILED_LOADING_INPUTS]: { + on: { + RETRY: LaunchState.LOADING_INPUTS + } + }, + [LaunchState.UNSUPPORTED_INPUTS]: { + // events handled at top level + }, + [LaunchState.ENTER_INPUTS]: { + always: { + target: LaunchState.UNSUPPORTED_INPUTS, + cond: ({ unsupportedRequiredInputs }) => + unsupportedRequiredInputs.length > 0 + }, + on: { + SUBMIT: LaunchState.SUBMIT_VALIDATING, + VALIDATE: LaunchState.VALIDATING_INPUTS + } + }, + [LaunchState.VALIDATING_INPUTS]: { + invoke: { + src: 'validate', + onDone: LaunchState.ENTER_INPUTS, + onError: LaunchState.INVALID_INPUTS + } + }, + [LaunchState.INVALID_INPUTS]: { + on: { + VALIDATE: LaunchState.VALIDATING_INPUTS + } + }, + [LaunchState.SUBMIT_VALIDATING]: { + entry: ['showErrors'], + invoke: { + src: 'validate', + onDone: { + target: LaunchState.SUBMITTING + }, + onError: { + target: LaunchState.INVALID_INPUTS, + actions: ['setError'] + } + } + }, + [LaunchState.SUBMITTING]: { + invoke: { + src: 'submit', + onDone: { + target: LaunchState.SUBMIT_SUCCEEDED, + actions: ['setExecutionId'] + }, + onError: { + target: LaunchState.SUBMIT_FAILED, + actions: ['setError'] + } + } + }, + [LaunchState.SUBMIT_FAILED]: { + on: { + SUBMIT: LaunchState.SUBMITTING + } + }, + [LaunchState.SUBMIT_SUCCEEDED]: { + type: 'final' + } +}; + +export const taskLaunchMachineConfig: MachineConfig< + TaskLaunchContext, + TaskLaunchSchema, + TaskLaunchEvent +> = { + id: 'launchTask', + context: { ...defaultBaseContext }, + initial: LaunchState.LOADING_TASK_VERSIONS, + on: { + ...defaultHandlers, + SELECT_TASK_VERSION: { + target: LaunchState.LOADING_INPUTS, + actions: ['setTaskVersion'] + } + }, + states: { + ...(baseStateConfig as StatesConfig< + TaskLaunchContext, + TaskLaunchSchema, + TaskLaunchEvent + >), + [LaunchState.LOADING_TASK_VERSIONS]: { + invoke: { + src: 'loadTaskVersions', + onDone: { + target: LaunchState.SELECT_TASK_VERSION, + actions: ['setTaskVersionOptions'] + }, + onError: { + target: LaunchState.FAILED_LOADING_TASK_VERSIONS, + actions: ['setError'] + } + } + }, + [LaunchState.FAILED_LOADING_TASK_VERSIONS]: { + on: { + RETRY: LaunchState.LOADING_TASK_VERSIONS + } + }, + [LaunchState.SELECT_TASK_VERSION]: { + // events handled at top level + } + } +}; + +export const workflowLaunchMachineConfig: MachineConfig< + WorkflowLaunchContext, + WorkflowLaunchSchema, + WorkflowLaunchEvent +> = { + id: 'launchWorkflow', + context: { ...defaultBaseContext }, + initial: LaunchState.LOADING_WORKFLOW_VERSIONS, + on: { + ...defaultHandlers, + SELECT_WORKFLOW_VERSION: { + target: LaunchState.LOADING_LAUNCH_PLANS, + actions: ['setWorkflowVersion'] + }, + SELECT_LAUNCH_PLAN: { + target: LaunchState.LOADING_INPUTS, + actions: ['setLaunchPlan'] + } + }, + states: { + ...(baseStateConfig as StatesConfig< + WorkflowLaunchContext, + WorkflowLaunchSchema, + WorkflowLaunchEvent + >), + [LaunchState.LOADING_WORKFLOW_VERSIONS]: { + invoke: { + src: 'loadWorkflowVersions', + onDone: { + target: LaunchState.SELECT_WORKFLOW_VERSION, + actions: ['setWorkflowVersionOptions'] + }, + onError: { + target: LaunchState.FAILED_LOADING_WORKFLOW_VERSIONS, + actions: ['setError'] + } + } + }, + [LaunchState.FAILED_LOADING_WORKFLOW_VERSIONS]: { + on: { + RETRY: LaunchState.LOADING_WORKFLOW_VERSIONS + } + }, + [LaunchState.SELECT_WORKFLOW_VERSION]: { + // Events handled at top level + }, + [LaunchState.LOADING_LAUNCH_PLANS]: { + invoke: { + src: 'loadLaunchPlans', + onDone: { + target: LaunchState.SELECT_LAUNCH_PLAN, + actions: ['setLaunchPlanOptions'] + }, + onError: { + target: LaunchState.FAILED_LOADING_LAUNCH_PLANS, + actions: ['setError'] + } + } + }, + [LaunchState.FAILED_LOADING_LAUNCH_PLANS]: { + on: { + RETRY: LaunchState.LOADING_LAUNCH_PLANS + } + }, + [LaunchState.SELECT_LAUNCH_PLAN]: { + // events handled at top level + } + } +}; + +type BaseMachineOptions = MachineOptions; + +const baseActions: BaseMachineOptions['actions'] = { + hideErrors: assign(_ => ({ showErrors: false })), + setExecutionId: assign((_, event) => ({ + resultExecutionId: (event as ExecutionCreatedEvent).data + })), + setInputs: assign((_, event) => { + const { + parsedInputs, + unsupportedRequiredInputs + } = (event as InputsParsedEvent).data; + return { + parsedInputs, + unsupportedRequiredInputs + }; + }), + setError: assign((_, event) => ({ + error: (event as ErrorEvent).data + })), + showErrors: assign(_ => ({ showErrors: true })) +}; + +const baseServices: BaseMachineOptions['services'] = { + loadInputs: () => + Promise.reject('No `loadInputs` service has been provided'), + submit: () => Promise.reject('No `submit` service has been provided'), + validate: () => Promise.reject('No `validate` service has been provided') +}; + +export const taskLaunchMachine = Machine(taskLaunchMachineConfig, { + actions: { + ...baseActions, + setTaskVersion: assign((_, event) => ({ + taskVersion: (event as SelectTaskVersionEvent).taskId + })), + setTaskVersionOptions: assign((_, event) => ({ + taskVersionOptions: (event as TaskVersionOptionsLoadedEvent).data + })) + }, + services: { + ...baseServices, + loadTaskVersions: () => + Promise.reject('No `loadTaskVersions` service has been provided') + } +}); + +/** A full machine for representing the Launch flow, combining the state definitions + * with actions/guards/services needed to support them. + */ +export const workflowLaunchMachine = Machine(workflowLaunchMachineConfig, { + actions: { + ...baseActions, + setWorkflowVersion: assign((_, event) => ({ + workflowVersion: (event as SelectWorkflowVersionEvent).workflowId + })), + setWorkflowVersionOptions: assign((_, event) => ({ + workflowVersionOptions: (event as DoneInvokeEvent).data + })), + setLaunchPlanOptions: assign((_, event) => ({ + launchPlanOptions: (event as LaunchPlanOptionsLoadedEvent).data + })), + setLaunchPlan: assign((_, event) => ({ + launchPlan: (event as SelectLaunchPlanEvent).launchPlan + })) + }, + services: { + ...baseServices, + loadWorkflowVersions: () => + Promise.reject( + 'No `loadWorkflowVersions` service has been provided' + ), + loadLaunchPlans: () => + Promise.reject('No `loadLaunchPlans` service has been provided') + } +}); diff --git a/src/components/Launch/LaunchForm/services.ts b/src/components/Launch/LaunchForm/services.ts new file mode 100644 index 000000000..248c80710 --- /dev/null +++ b/src/components/Launch/LaunchForm/services.ts @@ -0,0 +1,18 @@ +import { RefObject } from 'react'; +import { WorkflowLaunchContext } from './launchMachine'; +import { LaunchFormInputsRef } from './types'; + +export async function validate( + formInputsRef: RefObject, + {}: WorkflowLaunchContext +) { + if (formInputsRef.current === null) { + throw new Error('Unexpected empty form inputs ref'); + } + + if (!formInputsRef.current.validate()) { + throw new Error( + 'Some inputs have errors. Please correct them before submitting.' + ); + } +} diff --git a/src/components/Launch/LaunchWorkflowForm/styles.ts b/src/components/Launch/LaunchForm/styles.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/styles.ts rename to src/components/Launch/LaunchForm/styles.ts diff --git a/src/components/Launch/LaunchForm/test/LaunchTaskForm.test.tsx b/src/components/Launch/LaunchForm/test/LaunchTaskForm.test.tsx new file mode 100644 index 000000000..f88ad7d25 --- /dev/null +++ b/src/components/Launch/LaunchForm/test/LaunchTaskForm.test.tsx @@ -0,0 +1,593 @@ +import { ThemeProvider } from '@material-ui/styles'; +import { + act, + fireEvent, + getAllByRole, + getByLabelText, + getByRole, + queryAllByRole, + render, + waitFor +} from '@testing-library/react'; +import { mockAPIContextValue } from 'components/data/__mocks__/apiContext'; +import { APIContext } from 'components/data/apiContext'; +import { muiTheme } from 'components/Theme'; +import { Core } from 'flyteidl'; +import { cloneDeep, get } from 'lodash'; +import { + createWorkflowExecution, + CreateWorkflowExecutionArguments, + getTask, + Identifier, + listTasks, + NamedEntityIdentifier, + RequestConfig, + Task, + Variable +} from 'models'; +import { createMockTaskClosure } from 'models/__mocks__/taskData'; +import * as React from 'react'; +import { delayedPromise, pendingPromise } from 'test/utils'; +import { + createMockInputsInterface, + mockSimpleVariables, + simpleVariableDefaults +} from '../__mocks__/mockInputs'; +import { + cannotLaunchTaskString, + formStrings, + requiredInputSuffix +} from '../constants'; +import { LaunchForm } from '../LaunchForm'; +import { LaunchFormProps, TaskInitialLaunchParameters } from '../types'; +import { createInputCacheKey, getInputDefintionForLiteralType } from '../utils'; +import { + binaryInputName, + booleanInputName, + floatInputName, + integerInputName, + stringInputName +} from './constants'; +import { createMockObjects } from './utils'; + +describe('LaunchForm: Task', () => { + let onClose: jest.Mock; + let mockTask: Task; + let mockTaskVersions: Task[]; + let taskId: NamedEntityIdentifier; + let variables: Record; + + let mockListTasks: jest.Mock>; + let mockGetTask: jest.Mock>; + let mockCreateWorkflowExecution: jest.Mock>; + + beforeEach(() => { + onClose = jest.fn(); + }); + + const createMockTaskWithInputs = (id: Identifier) => { + const task: Task = { + id, + closure: createMockTaskClosure() + }; + task.closure!.compiledTask!.template.interface = createMockInputsInterface( + variables + ); + return task; + }; + + const createMocks = () => { + const mockObjects = createMockObjects(variables); + mockTask = mockObjects.mockTask; + + mockTaskVersions = mockObjects.mockTaskVersions; + + taskId = mockTask.id; + mockCreateWorkflowExecution = jest.fn(); + // Return our mock inputs for any version requested + mockGetTask = jest + .fn() + .mockImplementation(id => + Promise.resolve(createMockTaskWithInputs(id)) + ); + + // For workflow/task list endpoints: If the scope has a filter, the calling + // code is searching for a specific item. So we'll return a single-item + // list containing it. + mockListTasks = jest + .fn() + .mockImplementation( + (scope: Partial, { filter }: RequestConfig) => { + if (filter && filter[0].key === 'version') { + const task = { ...mockTaskVersions[0] }; + task.id = { + ...scope, + version: filter[0].value + } as Identifier; + return Promise.resolve({ + entities: [task] + }); + } + return Promise.resolve({ entities: mockTaskVersions }); + } + ); + }; + + const renderForm = (props?: Partial) => { + return render( + + + + + + ); + }; + + const getSubmitButton = (container: HTMLElement) => { + const buttons = queryAllByRole(container, 'button').filter( + el => el.getAttribute('type') === 'submit' + ); + expect(buttons.length).toBe(1); + return buttons[0]; + }; + + const fillInputs = (container: HTMLElement) => { + fireEvent.change( + getByLabelText(container, stringInputName, { + exact: false + }), + { target: { value: 'abc' } } + ); + fireEvent.change( + getByLabelText(container, integerInputName, { + exact: false + }), + { target: { value: '10' } } + ); + fireEvent.change( + getByLabelText(container, floatInputName, { + exact: false + }), + { target: { value: '1.5' } } + ); + }; + + describe('With Simple Inputs', () => { + beforeEach(() => { + const { + simpleString, + simpleInteger, + simpleFloat, + simpleBoolean + } = cloneDeep(mockSimpleVariables); + // Only taking supported variable types since they are all required. + variables = { + simpleString, + simpleInteger, + simpleFloat, + simpleBoolean + }; + createMocks(); + }); + + it('should not show task selector until options have loaded', async () => { + mockListTasks.mockReturnValue(pendingPromise()); + const { getByText, queryByText } = renderForm(); + await waitFor(() => getByText(formStrings.title)); + expect( + queryByText(formStrings.taskVersion) + ).not.toBeInTheDocument(); + }); + + it('should select the most recent task version by default', async () => { + const { getByLabelText } = renderForm(); + const versionEl = await waitFor(() => + getByLabelText(formStrings.taskVersion) + ); + expect(versionEl).toHaveValue(mockTaskVersions[0].id.version); + }); + + it('should disable submit button until inputs have loaded', async () => { + let identifier: Identifier = {} as Identifier; + const { promise, resolve } = delayedPromise(); + mockGetTask.mockImplementation(id => { + identifier = id; + return promise; + }); + const { container } = renderForm(); + + const submitButton = await waitFor(() => + getSubmitButton(container) + ); + + expect(submitButton).toBeDisabled(); + resolve(createMockTaskWithInputs(identifier)); + + await waitFor(() => expect(submitButton).not.toBeDisabled()); + }); + + it('should not show validation errors until first submit', async () => { + const { container, getByLabelText } = renderForm(); + const integerInput = await waitFor(() => + getByLabelText(integerInputName, { + exact: false + }) + ); + fireEvent.change(integerInput, { target: { value: 'abc' } }); + + await waitFor(() => expect(integerInput).not.toBeInvalid()); + + fireEvent.click(getSubmitButton(container)); + await waitFor(() => expect(integerInput).toBeInvalid()); + }); + + it('should update validation errors while typing', async () => { + const { container, getByLabelText } = renderForm(); + await waitFor(() => {}); + + const integerInput = await waitFor(() => + getByLabelText(integerInputName, { + exact: false + }) + ); + fireEvent.change(integerInput, { target: { value: 'abc' } }); + fireEvent.click(getSubmitButton(container)); + await waitFor(() => expect(integerInput).toBeInvalid()); + + fireEvent.change(integerInput, { target: { value: '123' } }); + await waitFor(() => expect(integerInput).toBeValid()); + }); + + it('should update inputs when selecting a new task version', async () => { + const { queryByLabelText, getByTitle } = renderForm(); + const taskVersionDiv = await waitFor(() => + getByTitle(formStrings.taskVersion) + ); + + // Delete the string input so that its corresponding input will + // disappear after the new launch plan is loaded. + delete variables[stringInputName]; + + // Click the expander for the task version, select the second item + const expander = getByRole(taskVersionDiv, 'button'); + fireEvent.click(expander); + const items = await waitFor(() => + getAllByRole(taskVersionDiv, 'menuitem') + ); + fireEvent.click(items[1]); + + await waitFor(() => getByTitle(formStrings.inputs)); + expect( + queryByLabelText(stringInputName, { + // Don't use exact match because the label will be decorated with type info + exact: false + }) + ).toBeNull(); + }); + + it('should preserve input values when changing task version', async () => { + const { getByLabelText, getByTitle } = renderForm(); + + const integerInput = await waitFor(() => + getByLabelText(integerInputName, { + exact: false + }) + ); + fireEvent.change(integerInput, { target: { value: '10' } }); + + // Click the expander for the task version, select the second item + const taskVersionDiv = getByTitle(formStrings.taskVersion); + const expander = getByRole(taskVersionDiv, 'button'); + fireEvent.click(expander); + const items = await waitFor(() => + getAllByRole(taskVersionDiv, 'menuitem') + ); + fireEvent.click(items[1]); + await waitFor(() => getByTitle(formStrings.inputs)); + + expect( + getByLabelText(integerInputName, { + exact: false + }) + ).toHaveValue('10'); + }); + + it('should reset form error when inputs change', async () => { + const errorString = 'Something went wrong'; + mockCreateWorkflowExecution.mockRejectedValue( + new Error(errorString) + ); + + const { + container, + getByText, + getByTitle, + queryByText + } = renderForm(); + await waitFor(() => getByTitle(formStrings.inputs)); + fillInputs(container); + + fireEvent.click(getSubmitButton(container)); + await waitFor(() => + expect(getByText(errorString)).toBeInTheDocument() + ); + + // Click the expander for the launch plan, select the second item + const taskVersionDiv = getByTitle(formStrings.taskVersion); + const expander = getByRole(taskVersionDiv, 'button'); + fireEvent.click(expander); + const items = await waitFor(() => + getAllByRole(taskVersionDiv, 'menuitem') + ); + fireEvent.click(items[1]); + await waitFor(() => + expect(queryByText(errorString)).not.toBeInTheDocument() + ); + }); + + describe('Input Values', () => { + it('Should send false for untouched toggles', async () => { + let inputs: Core.ILiteralMap = {}; + mockCreateWorkflowExecution.mockImplementation( + ({ + inputs: passedInputs + }: CreateWorkflowExecutionArguments) => { + inputs = passedInputs; + return pendingPromise(); + } + ); + + const { container, getByTitle } = renderForm(); + await waitFor(() => getByTitle(formStrings.inputs)); + fillInputs(container); + + fireEvent.click(getSubmitButton(container)); + await waitFor(() => + expect(mockCreateWorkflowExecution).toHaveBeenCalled() + ); + + expect(inputs.literals).toBeDefined(); + const value = get( + inputs.literals, + `${booleanInputName}.scalar.primitive.boolean` + ); + expect(value).toBe(false); + }); + + it('should decorate all inputs with required labels', async () => { + const { getByTitle, queryAllByText } = renderForm(); + await waitFor(() => getByTitle(formStrings.inputs)); + Object.keys(variables).forEach(name => { + const elements = queryAllByText(name, { + exact: false + }); + expect(elements.length).toBeGreaterThan(0); + expect(elements[0].textContent).toContain('*'); + }); + }); + }); + + describe('When using initial parameters', () => { + it('should prefer the provided task version', async () => { + const initialParameters: TaskInitialLaunchParameters = { + taskId: mockTaskVersions[2].id + }; + const { getByLabelText } = renderForm({ initialParameters }); + await waitFor(() => + expect(getByLabelText(formStrings.taskVersion)).toHaveValue( + mockTaskVersions[2].id.version + ) + ); + }); + + it('should only include one instance of the preferred version in the selector', async () => { + const initialParameters: TaskInitialLaunchParameters = { + taskId: mockTaskVersions[2].id + }; + const { getByTitle } = renderForm({ initialParameters }); + + // Click the expander for the workflow, select the second item + const versionDiv = await waitFor(() => + getByTitle(formStrings.taskVersion) + ); + const expander = getByRole(versionDiv, 'button'); + fireEvent.click(expander); + const items = await waitFor(() => + getAllByRole(versionDiv, 'menuitem') + ); + + const expectedVersion = mockTaskVersions[2].id.version; + expect( + items.filter( + item => + item.textContent && + item.textContent.includes(expectedVersion) + ) + ).toHaveLength(1); + }); + + it('should fall back to the first item in the list if preferred version is not found', async () => { + mockListTasks.mockImplementation( + (scope: Partial) => { + // If we get a request for a specific item, + // simulate not found + if (scope.version) { + return Promise.resolve({ entities: [] }); + } + return Promise.resolve({ + entities: mockTaskVersions + }); + } + ); + const baseId = mockTaskVersions[2].id; + const initialParameters: TaskInitialLaunchParameters = { + taskId: { ...baseId, version: 'nonexistentValue' } + }; + const { getByLabelText } = renderForm({ initialParameters }); + await waitFor(() => + expect(getByLabelText(formStrings.taskVersion)).toHaveValue( + mockTaskVersions[0].id.version + ) + ); + }); + + it('should prepopulate inputs with provided initial values', async () => { + const stringValue = 'initialStringValue'; + const initialStringValue: Core.ILiteral = { + scalar: { primitive: { stringValue } } + }; + const values = new Map(); + const stringCacheKey = createInputCacheKey( + stringInputName, + getInputDefintionForLiteralType( + variables[stringInputName].type + ) + ); + values.set(stringCacheKey, initialStringValue); + const { getByLabelText } = renderForm({ + initialParameters: { values } + }); + await waitFor(() => + expect( + getByLabelText(stringInputName, { exact: false }) + ).toHaveValue(stringValue) + ); + }); + + it('loads preferred task version when it does not exist in the list of suggestions', async () => { + const missingTask = mockTaskVersions[0]; + missingTask.id.version = 'missingVersionString'; + const initialParameters: TaskInitialLaunchParameters = { + taskId: missingTask.id + }; + const { getByLabelText } = renderForm({ initialParameters }); + await waitFor(() => + expect(getByLabelText(formStrings.taskVersion)).toHaveValue( + missingTask.id.version + ) + ); + }); + + it('should select contents of task version input on focus', async () => { + const { getByLabelText } = renderForm(); + + // Focus the workflow version input + const workflowInput = await waitFor(() => + getByLabelText(formStrings.taskVersion) + ); + fireEvent.focus(workflowInput); + + const expectedValue = mockTaskVersions[0].id.version; + + // The value should remain, but selection should be the entire string + await waitFor(() => + expect(workflowInput).toHaveValue(expectedValue) + ); + expect((workflowInput as HTMLInputElement).selectionEnd).toBe( + expectedValue.length + ); + }); + + it('should correctly render task version search results', async () => { + const initialParameters: TaskInitialLaunchParameters = { + taskId: mockTaskVersions[2].id + }; + const inputString = mockTaskVersions[1].id.version.substring( + 0, + 4 + ); + const { getByLabelText } = renderForm({ initialParameters }); + + const versionInput = await waitFor(() => + getByLabelText(formStrings.taskVersion) + ); + mockListTasks.mockClear(); + + fireEvent.change(versionInput, { + target: { value: inputString } + }); + + const { project, domain, name } = mockTaskVersions[2].id; + await waitFor(() => + expect(mockListTasks).toHaveBeenCalledWith( + { project, domain, name }, + expect.anything() + ) + ); + }); + }); + + describe('With Unsupported Required Inputs', () => { + beforeEach(() => { + // Binary is currently unsupported, and all values are required. + // So adding a binary variable will generate our test case. + variables[binaryInputName] = cloneDeep( + mockSimpleVariables[binaryInputName] + ); + }); + + it('should render error message', async () => { + const { getByText } = renderForm(); + const errorElement = await waitFor(() => + getByText(cannotLaunchTaskString) + ); + expect(errorElement).toBeInTheDocument(); + }); + + it('should show unsupported inputs', async () => { + const { getByText } = renderForm(); + const inputElement = await waitFor(() => + getByText(binaryInputName, { exact: false }) + ); + expect(inputElement).toBeInTheDocument(); + }); + + it('should print input labels without decoration', async () => { + const { getByText } = renderForm(); + const inputElement = await waitFor(() => + getByText(binaryInputName, { exact: false }) + ); + expect(inputElement.textContent).not.toContain( + requiredInputSuffix + ); + }); + + it('should disable submission', async () => { + const { getByRole } = renderForm(); + + const submitButton = await waitFor(() => + getByRole('button', { name: formStrings.submit }) + ); + + expect(submitButton).toBeDisabled(); + }); + + it('should not show error if initial value is provided', async () => { + const values = new Map(); + const cacheKey = createInputCacheKey( + binaryInputName, + getInputDefintionForLiteralType( + variables[binaryInputName].type + ) + ); + values.set(cacheKey, simpleVariableDefaults.simpleBinary); + const { getByLabelText, queryByText } = renderForm({ + initialParameters: { values } + }); + + await waitFor(() => + getByLabelText(binaryInputName, { exact: false }) + ); + expect(queryByText(cannotLaunchTaskString)).toBeNull(); + }); + }); + }); +}); diff --git a/src/components/Launch/LaunchWorkflowForm/test/LaunchWorkflowForm.test.tsx b/src/components/Launch/LaunchForm/test/LaunchWorkflowForm.test.tsx similarity index 94% rename from src/components/Launch/LaunchWorkflowForm/test/LaunchWorkflowForm.test.tsx rename to src/components/Launch/LaunchForm/test/LaunchWorkflowForm.test.tsx index 9ed331d9d..6ba6e2a06 100644 --- a/src/components/Launch/LaunchWorkflowForm/test/LaunchWorkflowForm.test.tsx +++ b/src/components/Launch/LaunchForm/test/LaunchWorkflowForm.test.tsx @@ -32,7 +32,7 @@ import { createMockWorkflowClosure } from 'models/__mocks__/workflowData'; import * as React from 'react'; import { delayedPromise, pendingPromise } from 'test/utils'; import { - createMockWorkflowInputsInterface, + createMockInputsInterface, mockSimpleVariables, simpleVariableDefaults } from '../__mocks__/mockInputs'; @@ -41,8 +41,8 @@ import { formStrings, requiredInputSuffix } from '../constants'; -import { LaunchWorkflowForm } from '../LaunchWorkflowForm'; -import { InitialLaunchParameters, LaunchWorkflowFormProps } from '../types'; +import { LaunchForm } from '../LaunchForm'; +import { LaunchFormProps, WorkflowInitialLaunchParameters } from '../types'; import { createInputCacheKey, getInputDefintionForLiteralType } from '../utils'; import { binaryInputName, @@ -53,7 +53,7 @@ import { } from './constants'; import { createMockObjects } from './utils'; -describe('LaunchWorkflowForm', () => { +describe('LaunchForm: Workflow', () => { let onClose: jest.Mock; let mockLaunchPlans: LaunchPlan[]; let mockSingleLaunchPlan: LaunchPlan; @@ -84,7 +84,7 @@ describe('LaunchWorkflowForm', () => { id }; workflow.closure = createMockWorkflowClosure(); - workflow.closure!.compiledWorkflow!.primary.template.interface = createMockWorkflowInputsInterface( + workflow.closure!.compiledWorkflow!.primary.template.interface = createMockInputsInterface( variables ); return workflow; @@ -132,13 +132,14 @@ describe('LaunchWorkflowForm', () => { return Promise.resolve({ entities: mockLaunchPlans }); } ); + + // For workflow/task list endpoints: If the scope has a filter, the calling + // code is searching for a specific item. So we'll return a single-item + // list containing it. mockListWorkflows = jest .fn() .mockImplementation( (scope: Partial, { filter }: RequestConfig) => { - // If the scope has a filter, the calling - // code is searching for a specific item. So we'll - // return a single-item list containing it. if (filter && filter[0].key === 'version') { const workflow = { ...mockWorkflowVersions[0] }; workflow.id = { @@ -154,7 +155,7 @@ describe('LaunchWorkflowForm', () => { ); }; - const renderForm = (props?: Partial) => { + const renderForm = (props?: Partial) => { return render( { listWorkflows: mockListWorkflows })} > - { it('should select the launch plan matching the workflow name by default', async () => { const { getByLabelText } = renderForm(); - await waitFor(() => {}); - expect(getByLabelText(formStrings.launchPlan)).toHaveValue( - mockWorkflow.id.name + const launchPlanEl = await waitFor(() => + getByLabelText(formStrings.launchPlan) ); + expect(launchPlanEl).toHaveValue(mockWorkflow.id.name); }); it('should not render inputs if no launch plan is selected', async () => { @@ -303,7 +304,7 @@ describe('LaunchWorkflowForm', () => { it('should update launch plan when selecting a new workflow version', async () => { const { getByTitle } = renderForm(); - await waitFor(() => {}); + await waitFor(() => getByTitle(formStrings.launchPlan)); mockListLaunchPlans.mockClear(); @@ -316,7 +317,7 @@ describe('LaunchWorkflowForm', () => { ); fireEvent.click(items[1]); - await waitFor(() => {}); + await waitFor(() => getByTitle(formStrings.launchPlan)); expect(mockListLaunchPlans).toHaveBeenCalled(); }); @@ -344,7 +345,9 @@ describe('LaunchWorkflowForm', () => { it('should update inputs when selecting a new launch plan', async () => { const { queryByLabelText, getByTitle } = renderForm(); - await waitFor(() => {}); + const launchPlanDiv = await waitFor(() => + getByTitle(formStrings.launchPlan) + ); // Delete the string input so that its corresponding input will // disappear after the new launch plan is loaded. @@ -353,7 +356,6 @@ describe('LaunchWorkflowForm', () => { ]; // Click the expander for the launch plan, select the second item - const launchPlanDiv = getByTitle(formStrings.launchPlan); const expander = getByRole(launchPlanDiv, 'button'); fireEvent.click(expander); const items = await waitFor(() => @@ -361,7 +363,7 @@ describe('LaunchWorkflowForm', () => { ); fireEvent.click(items[1]); - await waitFor(() => {}); + await waitFor(() => getByTitle(formStrings.inputs)); expect( queryByLabelText(stringInputName, { // Don't use exact match because the label will be decorated with type info @@ -499,8 +501,8 @@ describe('LaunchWorkflowForm', () => { describe('When using initial parameters', () => { it('should prefer the provided workflow version', async () => { - const initialParameters: InitialLaunchParameters = { - workflow: mockWorkflowVersions[2].id + const initialParameters: WorkflowInitialLaunchParameters = { + workflowId: mockWorkflowVersions[2].id }; const { getByLabelText } = renderForm({ initialParameters }); await waitFor(() => {}); @@ -510,8 +512,8 @@ describe('LaunchWorkflowForm', () => { }); it('should only include one instance of the preferred version in the selector', async () => { - const initialParameters: InitialLaunchParameters = { - workflow: mockWorkflowVersions[2].id + const initialParameters: WorkflowInitialLaunchParameters = { + workflowId: mockWorkflowVersions[2].id }; const { getByTitle } = renderForm({ initialParameters }); await waitFor(() => {}); @@ -547,8 +549,8 @@ describe('LaunchWorkflowForm', () => { } ); const baseId = mockWorkflowVersions[2].id; - const initialParameters: InitialLaunchParameters = { - workflow: { ...baseId, version: 'nonexistentValue' } + const initialParameters: WorkflowInitialLaunchParameters = { + workflowId: { ...baseId, version: 'nonexistentValue' } }; const { getByLabelText } = renderForm({ initialParameters }); await waitFor(() => {}); @@ -558,7 +560,7 @@ describe('LaunchWorkflowForm', () => { }); it('should prefer the provided launch plan', async () => { - const initialParameters: InitialLaunchParameters = { + const initialParameters: WorkflowInitialLaunchParameters = { launchPlan: mockLaunchPlans[1].id }; const { getByLabelText } = renderForm({ initialParameters }); @@ -569,7 +571,7 @@ describe('LaunchWorkflowForm', () => { }); it('should only include one instance of the preferred launch plan in the selector', async () => { - const initialParameters: InitialLaunchParameters = { + const initialParameters: WorkflowInitialLaunchParameters = { launchPlan: mockLaunchPlans[1].id }; const { getByTitle } = renderForm({ initialParameters }); @@ -605,7 +607,7 @@ describe('LaunchWorkflowForm', () => { ); const launchPlanId = { ...mockLaunchPlans[1].id }; launchPlanId.name = 'InvalidLauchPlan'; - const initialParameters: InitialLaunchParameters = { + const initialParameters: WorkflowInitialLaunchParameters = { launchPlan: launchPlanId }; const { getByLabelText } = renderForm({ initialParameters }); @@ -672,8 +674,8 @@ describe('LaunchWorkflowForm', () => { it('loads preferred workflow version when it does not exist in the list of suggestions', async () => { const missingWorkflow = mockWorkflowVersions[0]; missingWorkflow.id.version = 'missingVersionString'; - const initialParameters: InitialLaunchParameters = { - workflow: missingWorkflow.id + const initialParameters: WorkflowInitialLaunchParameters = { + workflowId: missingWorkflow.id }; const { getByLabelText } = renderForm({ initialParameters }); await waitFor(() => {}); @@ -685,7 +687,7 @@ describe('LaunchWorkflowForm', () => { it('loads the preferred launch plan when it does not exist in the list of suggestions', async () => { const missingLaunchPlan = mockLaunchPlans[0]; missingLaunchPlan.id.name = 'missingLaunchPlanName'; - const initialParameters: InitialLaunchParameters = { + const initialParameters: WorkflowInitialLaunchParameters = { launchPlan: missingLaunchPlan.id }; const { getByLabelText } = renderForm({ initialParameters }); @@ -719,8 +721,8 @@ describe('LaunchWorkflowForm', () => { }); it('should correctly render workflow version search results', async () => { - const initialParameters: InitialLaunchParameters = { - workflow: mockWorkflowVersions[2].id + const initialParameters: WorkflowInitialLaunchParameters = { + workflowId: mockWorkflowVersions[2].id }; const inputString = mockWorkflowVersions[1].id.version.substring( 0, @@ -752,8 +754,6 @@ describe('LaunchWorkflowForm', () => { describe('With Unsupported Required Inputs', () => { beforeEach(() => { - // variables = mockSimpleVariables; - // createMocks(); // Binary is currently unsupported, setting the binary input to // required and removing the default value will trigger our use case const parameters = mockLaunchPlans[0].closure!.expectedInputs diff --git a/src/components/Launch/LaunchWorkflowForm/test/constants.ts b/src/components/Launch/LaunchForm/test/constants.ts similarity index 66% rename from src/components/Launch/LaunchWorkflowForm/test/constants.ts rename to src/components/Launch/LaunchForm/test/constants.ts index 1c7df2799..a4f8ab0ae 100644 --- a/src/components/Launch/LaunchWorkflowForm/test/constants.ts +++ b/src/components/Launch/LaunchForm/test/constants.ts @@ -1,6 +1,9 @@ export const booleanInputName = 'simpleBoolean'; export const stringInputName = 'simpleString'; export const stringNoLabelName = 'stringNoLabel'; +export const floatInputName = 'simpleFloat'; +export const durationInputName = 'simpleDuration'; +export const datetimeInputName = 'simpleDatetime'; export const integerInputName = 'simpleInteger'; export const binaryInputName = 'simpleBinary'; export const errorInputName = 'simpleError'; diff --git a/src/components/Launch/LaunchWorkflowForm/test/getInputs.test.ts b/src/components/Launch/LaunchForm/test/getInputs.test.ts similarity index 71% rename from src/components/Launch/LaunchWorkflowForm/test/getInputs.test.ts rename to src/components/Launch/LaunchForm/test/getInputs.test.ts index e9b4fb896..231ff55b4 100644 --- a/src/components/Launch/LaunchWorkflowForm/test/getInputs.test.ts +++ b/src/components/Launch/LaunchForm/test/getInputs.test.ts @@ -1,5 +1,5 @@ import { mockSimpleVariables } from '../__mocks__/mockInputs'; -import { getInputs } from '../getInputs'; +import { getInputsForWorkflow } from '../getInputs'; import { stringInputName } from './constants'; import { createMockObjects } from './utils'; @@ -15,9 +15,13 @@ describe('getInputs', () => { const parameters = launchPlan.closure!.expectedInputs.parameters; parameters[stringInputName].default = null; - expect(() => getInputs(mockWorkflow, launchPlan)).not.toThrowError(); + expect(() => + getInputsForWorkflow(mockWorkflow, launchPlan) + ).not.toThrowError(); delete parameters[stringInputName].default; - expect(() => getInputs(mockWorkflow, launchPlan)).not.toThrowError(); + expect(() => + getInputsForWorkflow(mockWorkflow, launchPlan) + ).not.toThrowError(); }); }); diff --git a/src/components/Launch/LaunchWorkflowForm/test/utils.ts b/src/components/Launch/LaunchForm/test/utils.ts similarity index 72% rename from src/components/Launch/LaunchWorkflowForm/test/utils.ts rename to src/components/Launch/LaunchForm/test/utils.ts index e641c417f..4ba1353a7 100644 --- a/src/components/Launch/LaunchWorkflowForm/test/utils.ts +++ b/src/components/Launch/LaunchForm/test/utils.ts @@ -1,6 +1,10 @@ import { mapValues } from 'lodash'; import { Variable } from 'models'; import { createMockLaunchPlan } from 'models/__mocks__/launchPlanData'; +import { + createMockTask, + createMockTaskVersions +} from 'models/__mocks__/taskData'; import { createMockWorkflow, createMockWorkflowVersions @@ -8,12 +12,15 @@ import { export function createMockObjects(variables: Record) { const mockWorkflow = createMockWorkflow('MyWorkflow'); + const mockTask = createMockTask('MyTask'); const mockWorkflowVersions = createMockWorkflowVersions( mockWorkflow.id.name, 10 ); + const mockTaskVersions = createMockTaskVersions(mockTask.id.name, 10); + const mockLaunchPlans = [mockWorkflow.id.name, 'OtherLaunchPlan'].map( name => { const parameterMap = { @@ -27,5 +34,11 @@ export function createMockObjects(variables: Record) { return launchPlan; } ); - return { mockWorkflow, mockLaunchPlans, mockWorkflowVersions }; + return { + mockWorkflow, + mockLaunchPlans, + mockTask, + mockTaskVersions, + mockWorkflowVersions + }; } diff --git a/src/components/Launch/LaunchForm/types.ts b/src/components/Launch/LaunchForm/types.ts new file mode 100644 index 000000000..eb3c9f679 --- /dev/null +++ b/src/components/Launch/LaunchForm/types.ts @@ -0,0 +1,192 @@ +import { Core } from 'flyteidl'; +import { + BlobDimensionality, + Identifier, + LaunchPlan, + NamedEntityIdentifier, + Task, + Workflow, + WorkflowExecutionIdentifier, + WorkflowId +} from 'models'; +import { Interpreter, State } from 'xstate'; +import { + BaseLaunchContext, + BaseLaunchEvent, + BaseLaunchTypestate, + TaskLaunchContext, + TaskLaunchEvent, + TaskLaunchTypestate, + WorkflowLaunchContext, + WorkflowLaunchEvent, + WorkflowLaunchTypestate +} from './launchMachine'; +import { SearchableSelectorOption } from './SearchableSelector'; + +export type InputValueMap = Map; +export type LiteralValueMap = Map; +export type SearchableVersion = Workflow | Task; + +export type BaseInterpretedLaunchState = State< + BaseLaunchContext, + BaseLaunchEvent, + any, + BaseLaunchTypestate +>; + +export type BaseLaunchService = Interpreter< + BaseLaunchContext, + any, + BaseLaunchEvent, + BaseLaunchTypestate +>; + +export interface BaseLaunchFormProps { + onClose(): void; + referenceExecutionId?: WorkflowExecutionIdentifier; +} + +export interface BaseInitialLaunchParameters { + values?: LiteralValueMap; +} + +export interface WorkflowInitialLaunchParameters + extends BaseInitialLaunchParameters { + launchPlan?: Identifier; + workflowId?: WorkflowId; +} +export interface LaunchWorkflowFormProps extends BaseLaunchFormProps { + workflowId: NamedEntityIdentifier; + initialParameters?: WorkflowInitialLaunchParameters; +} + +export interface TaskInitialLaunchParameters + extends BaseInitialLaunchParameters { + taskId?: Identifier; +} +export interface LaunchTaskFormProps extends BaseLaunchFormProps { + taskId: NamedEntityIdentifier; + initialParameters?: TaskInitialLaunchParameters; +} + +export type LaunchFormProps = LaunchWorkflowFormProps | LaunchTaskFormProps; + +export interface LaunchWorkflowFormProps { + workflowId: NamedEntityIdentifier; + initialParameters?: WorkflowInitialLaunchParameters; +} + +export interface LaunchFormInputsRef { + getValues(): Record; + validate(): boolean; +} + +export interface WorkflowSourceSelectorState { + launchPlanSelectorOptions: SearchableSelectorOption[]; + selectedWorkflow?: SearchableSelectorOption; + selectedLaunchPlan?: SearchableSelectorOption; + workflowSelectorOptions: SearchableSelectorOption[]; + fetchSearchResults( + query: string + ): Promise[]>; + onSelectWorkflowVersion( + selected: SearchableSelectorOption + ): void; + onSelectLaunchPlan(selected: SearchableSelectorOption): void; +} + +export interface TaskSourceSelectorState { + selectedTask?: SearchableSelectorOption; + taskSelectorOptions: SearchableSelectorOption[]; + fetchSearchResults( + query: string + ): Promise[]>; + onSelectTaskVersion(selected: SearchableSelectorOption): void; +} + +export interface LaunchWorkflowFormState { + formInputsRef: React.RefObject; + state: State< + WorkflowLaunchContext, + WorkflowLaunchEvent, + any, + WorkflowLaunchTypestate + >; + service: Interpreter< + WorkflowLaunchContext, + any, + WorkflowLaunchEvent, + WorkflowLaunchTypestate + >; + workflowSourceSelectorState: WorkflowSourceSelectorState; +} + +export interface LaunchTaskFormState { + formInputsRef: React.RefObject; + state: State; + service: Interpreter< + TaskLaunchContext, + any, + TaskLaunchEvent, + TaskLaunchTypestate + >; + taskSourceSelectorState: TaskSourceSelectorState; +} + +export enum InputType { + Binary = 'BINARY', + Blob = 'BLOB', + Boolean = 'BOOLEAN', + Collection = 'COLLECTION', + Datetime = 'DATETIME', + Duration = 'DURATION', + Error = 'ERROR', + Float = 'FLOAT', + Integer = 'INTEGER', + Map = 'MAP', + None = 'NONE', + Schema = 'SCHEMA', + String = 'STRING', + Struct = 'STRUCT', + Unknown = 'UNKNOWN' +} + +export interface InputTypeDefinition { + type: InputType; + subtype?: InputTypeDefinition; +} + +export interface ObjectValue { + type: InputType; +} + +export interface BlobValue { + dimensionality: BlobDimensionality | string; + format?: string; + uri: string; +} + +export type InputValue = string | number | boolean | Date | BlobValue; +export type InputChangeHandler = (newValue: InputValue) => void; + +export interface InputProps { + description: string; + error?: string; + helperText?: string; + initialValue?: Core.ILiteral; + name: string; + label: string; + required: boolean; + typeDefinition: InputTypeDefinition; + value?: InputValue; + onChange: InputChangeHandler; +} + +export interface ParsedInput + extends Pick< + InputProps, + 'description' | 'label' | 'name' | 'required' | 'typeDefinition' + > { + /** Provides an initial value for the input, which can be changed by the user. */ + initialValue?: Core.ILiteral; +} diff --git a/src/components/Launch/LaunchWorkflowForm/useFormInputsState.ts b/src/components/Launch/LaunchForm/useFormInputsState.ts similarity index 100% rename from src/components/Launch/LaunchWorkflowForm/useFormInputsState.ts rename to src/components/Launch/LaunchForm/useFormInputsState.ts diff --git a/src/components/Launch/LaunchForm/useLaunchTaskFormState.ts b/src/components/Launch/LaunchForm/useLaunchTaskFormState.ts new file mode 100644 index 000000000..2338dd6b6 --- /dev/null +++ b/src/components/Launch/LaunchForm/useLaunchTaskFormState.ts @@ -0,0 +1,229 @@ +import { useMachine } from '@xstate/react'; +import { defaultStateMachineConfig } from 'components/common/constants'; +import { APIContextValue, useAPIContext } from 'components/data/apiContext'; +import { isEqual, partial, uniqBy } from 'lodash'; +import { + FilterOperationName, + Identifier, + SortDirection, + Task, + taskSortFields, + WorkflowExecutionIdentifier +} from 'models'; +import { RefObject, useEffect, useMemo, useRef } from 'react'; +import { getInputsForTask } from './getInputs'; +import { + LaunchState, + TaskLaunchContext, + TaskLaunchEvent, + taskLaunchMachine, + TaskLaunchTypestate +} from './launchMachine'; +import { validate } from './services'; +import { + LaunchFormInputsRef, + LaunchTaskFormProps, + LaunchTaskFormState, + ParsedInput +} from './types'; +import { useTaskSourceSelectorState } from './useTaskSourceSelectorState'; +import { getUnsupportedRequiredInputs } from './utils'; + +async function loadTaskVersions( + { listTasks }: APIContextValue, + { preferredTaskId, sourceId }: TaskLaunchContext +) { + if (!sourceId) { + throw new Error('Cannot load tasks, missing sourceId'); + } + const { project, domain, name } = sourceId; + const tasksPromise = listTasks( + { project, domain, name }, + { + limit: 10, + sort: { + key: taskSortFields.createdAt, + direction: SortDirection.DESCENDING + } + } + ); + + let preferredTaskPromise = Promise.resolve({ + entities: [] as Task[] + }); + if (preferredTaskId) { + const { version, ...scope } = preferredTaskId; + preferredTaskPromise = listTasks(scope, { + limit: 1, + filter: [ + { + key: 'version', + operation: FilterOperationName.EQ, + value: version + } + ] + }); + } + + const [tasksResult, preferredTaskResult] = await Promise.all([ + tasksPromise, + preferredTaskPromise + ]); + const merged = [...tasksResult.entities, ...preferredTaskResult.entities]; + return uniqBy(merged, ({ id: { version } }) => version); +} + +async function loadInputs( + { getTask }: APIContextValue, + { defaultInputValues, taskVersion }: TaskLaunchContext +) { + if (!taskVersion) { + throw new Error('Failed to load inputs: missing taskVersion'); + } + + const task = await getTask(taskVersion); + const parsedInputs: ParsedInput[] = getInputsForTask( + task, + defaultInputValues + ); + + return { + parsedInputs, + unsupportedRequiredInputs: getUnsupportedRequiredInputs(parsedInputs) + }; +} + +async function submit( + { createWorkflowExecution }: APIContextValue, + formInputsRef: RefObject, + { referenceExecutionId, taskVersion }: TaskLaunchContext +) { + if (!taskVersion) { + throw new Error('Attempting to launch with no Task version'); + } + if (formInputsRef.current === null) { + throw new Error('Unexpected empty form inputs ref'); + } + const literals = formInputsRef.current.getValues(); + const launchPlanId = taskVersion; + const { domain, project } = taskVersion; + + const response = await createWorkflowExecution({ + domain, + launchPlanId, + project, + referenceExecutionId, + inputs: { literals } + }); + const newExecutionId = response.id as WorkflowExecutionIdentifier; + if (!newExecutionId) { + throw new Error('API Response did not include new execution id'); + } + + return newExecutionId; +} + +function getServices( + apiContext: APIContextValue, + formInputsRef: RefObject +) { + return { + loadTaskVersions: partial(loadTaskVersions, apiContext), + loadInputs: partial(loadInputs, apiContext), + submit: partial(submit, apiContext, formInputsRef), + validate: partial(validate, formInputsRef) + }; +} + +/** Contains all of the form state for a LaunchTaskForm, including input + * definitions, current input values, and errors. + */ +export function useLaunchTaskFormState({ + initialParameters = {}, + taskId: sourceId, + referenceExecutionId +}: LaunchTaskFormProps): LaunchTaskFormState { + // These values will be used to auto-select items from the task + // version/launch plan drop downs. + const { + taskId: preferredTaskId, + values: defaultInputValues + } = initialParameters; + + const apiContext = useAPIContext(); + const formInputsRef = useRef(null); + + const services = useMemo(() => getServices(apiContext, formInputsRef), [ + apiContext, + formInputsRef + ]); + + const [state, sendEvent, service] = useMachine< + TaskLaunchContext, + TaskLaunchEvent, + TaskLaunchTypestate + >(taskLaunchMachine, { + ...defaultStateMachineConfig, + services, + context: { + defaultInputValues, + preferredTaskId, + referenceExecutionId, + sourceId + } + }); + + const { taskVersionOptions = [], taskVersion } = state.context; + + const selectTaskVersion = (newTask: Identifier) => { + if (newTask === taskVersion) { + return; + } + sendEvent({ + type: 'SELECT_TASK_VERSION', + taskId: newTask + }); + }; + + const taskSourceSelectorState = useTaskSourceSelectorState({ + sourceId, + selectTaskVersion, + taskVersion, + taskVersionOptions + }); + + useEffect(() => { + const subscription = service.subscribe(newState => { + if (newState.matches(LaunchState.SELECT_TASK_VERSION)) { + const { + taskVersionOptions, + preferredTaskId + } = newState.context; + if (taskVersionOptions.length > 0) { + let taskToSelect = taskVersionOptions[0]; + if (preferredTaskId) { + const preferred = taskVersionOptions.find(({ id }) => + isEqual(id, preferredTaskId) + ); + if (preferred) { + taskToSelect = preferred; + } + } + sendEvent({ + type: 'SELECT_TASK_VERSION', + taskId: taskToSelect.id + }); + } + } + }); + + return subscription.unsubscribe; + }, [service, sendEvent]); + + return { + formInputsRef, + state, + service, + taskSourceSelectorState + }; +} diff --git a/src/components/Launch/LaunchForm/useLaunchWorkflowFormState.ts b/src/components/Launch/LaunchForm/useLaunchWorkflowFormState.ts new file mode 100644 index 000000000..4c58246f7 --- /dev/null +++ b/src/components/Launch/LaunchForm/useLaunchWorkflowFormState.ts @@ -0,0 +1,363 @@ +import { useMachine } from '@xstate/react'; +import { defaultStateMachineConfig } from 'components/common/constants'; +import { APIContextValue, useAPIContext } from 'components/data/apiContext'; +import { isEqual, partial, uniqBy } from 'lodash'; +import { + FilterOperationName, + LaunchPlan, + SortDirection, + Workflow, + WorkflowExecutionIdentifier, + WorkflowId, + workflowSortFields +} from 'models'; +import { RefObject, useEffect, useMemo, useRef } from 'react'; +import { getInputsForWorkflow } from './getInputs'; +import { + LaunchState, + WorkflowLaunchContext, + WorkflowLaunchEvent, + workflowLaunchMachine, + WorkflowLaunchTypestate +} from './launchMachine'; +import { validate } from './services'; +import { + LaunchFormInputsRef, + LaunchWorkflowFormProps, + LaunchWorkflowFormState, + ParsedInput +} from './types'; +import { useWorkflowSourceSelectorState } from './useWorkflowSourceSelectorState'; +import { getUnsupportedRequiredInputs } from './utils'; + +async function loadLaunchPlans( + { listLaunchPlans }: APIContextValue, + { preferredLaunchPlanId, workflowVersion }: WorkflowLaunchContext +) { + if (workflowVersion == null) { + return Promise.reject('No workflowVersion specified'); + } + + let preferredLaunchPlanPromise = Promise.resolve({ + entities: [] as LaunchPlan[] + }); + if (preferredLaunchPlanId) { + const { version, ...scope } = preferredLaunchPlanId; + preferredLaunchPlanPromise = listLaunchPlans(scope, { + limit: 1, + filter: [ + { + key: 'version', + operation: FilterOperationName.EQ, + value: version + } + ] + }); + } + + const { project, domain, name, version } = workflowVersion; + const launchPlansPromise = listLaunchPlans( + { project, domain }, + { + filter: [ + { + key: 'workflow.name', + operation: FilterOperationName.EQ, + value: name + }, + { + key: 'workflow.version', + operation: FilterOperationName.EQ, + value: version + } + ], + limit: 10 + } + ); + + const [launchPlansResult, preferredLaunchPlanResult] = await Promise.all([ + launchPlansPromise, + preferredLaunchPlanPromise + ]); + const merged = [ + ...launchPlansResult.entities, + ...preferredLaunchPlanResult.entities + ]; + return uniqBy(merged, ({ id }) => id.name); +} + +async function loadWorkflowVersions( + { listWorkflows }: APIContextValue, + { preferredWorkflowId, sourceId: sourceWorkflowName }: WorkflowLaunchContext +) { + if (!sourceWorkflowName) { + throw new Error('Cannot load workflows, missing workflowName'); + } + const { project, domain, name } = sourceWorkflowName; + const workflowsPromise = listWorkflows( + { project, domain, name }, + { + limit: 10, + sort: { + key: workflowSortFields.createdAt, + direction: SortDirection.DESCENDING + } + } + ); + + let preferredWorkflowPromise = Promise.resolve({ + entities: [] as Workflow[] + }); + if (preferredWorkflowId) { + const { version, ...scope } = preferredWorkflowId; + preferredWorkflowPromise = listWorkflows(scope, { + limit: 1, + filter: [ + { + key: 'version', + operation: FilterOperationName.EQ, + value: version + } + ] + }); + } + + const [workflowsResult, preferredWorkflowResult] = await Promise.all([ + workflowsPromise, + preferredWorkflowPromise + ]); + const merged = [ + ...workflowsResult.entities, + ...preferredWorkflowResult.entities + ]; + return uniqBy(merged, ({ id: { version } }) => version); +} + +async function loadInputs( + { getWorkflow }: APIContextValue, + { defaultInputValues, workflowVersion, launchPlan }: WorkflowLaunchContext +) { + if (!workflowVersion) { + throw new Error('Failed to load inputs: missing workflowVersion'); + } + if (!launchPlan) { + throw new Error('Failed to load inputs: missing launchPlan'); + } + const workflow = await getWorkflow(workflowVersion); + const parsedInputs: ParsedInput[] = getInputsForWorkflow( + workflow, + launchPlan, + defaultInputValues + ); + + return { + parsedInputs, + unsupportedRequiredInputs: getUnsupportedRequiredInputs(parsedInputs) + }; +} + +async function submit( + { createWorkflowExecution }: APIContextValue, + formInputsRef: RefObject, + { launchPlan, referenceExecutionId, workflowVersion }: WorkflowLaunchContext +) { + if (!launchPlan) { + throw new Error('Attempting to launch with no LaunchPlan'); + } + if (!workflowVersion) { + throw new Error('Attempting to launch with no Workflow version'); + } + if (formInputsRef.current === null) { + throw new Error('Unexpected empty form inputs ref'); + } + const literals = formInputsRef.current.getValues(); + const launchPlanId = launchPlan.id; + const { domain, project } = workflowVersion; + + const response = await createWorkflowExecution({ + domain, + launchPlanId, + project, + referenceExecutionId, + inputs: { literals } + }); + const newExecutionId = response.id as WorkflowExecutionIdentifier; + if (!newExecutionId) { + throw new Error('API Response did not include new execution id'); + } + + return newExecutionId; +} + +function getServices( + apiContext: APIContextValue, + formInputsRef: RefObject +) { + return { + loadWorkflowVersions: partial(loadWorkflowVersions, apiContext), + loadLaunchPlans: partial(loadLaunchPlans, apiContext), + loadInputs: partial(loadInputs, apiContext), + submit: partial(submit, apiContext, formInputsRef), + validate: partial(validate, formInputsRef) + }; +} + +/** Contains all of the form state for a LaunchWorkflowForm, including input + * definitions, current input values, and errors. + */ +export function useLaunchWorkflowFormState({ + initialParameters = {}, + workflowId: sourceId, + referenceExecutionId +}: LaunchWorkflowFormProps): LaunchWorkflowFormState { + // These values will be used to auto-select items from the workflow + // version/launch plan drop downs. + const { + launchPlan: preferredLaunchPlanId, + workflowId: preferredWorkflowId, + values: defaultInputValues + } = initialParameters; + + const apiContext = useAPIContext(); + const formInputsRef = useRef(null); + + const services = useMemo(() => getServices(apiContext, formInputsRef), [ + apiContext, + formInputsRef + ]); + + const [state, sendEvent, service] = useMachine< + WorkflowLaunchContext, + WorkflowLaunchEvent, + WorkflowLaunchTypestate + >(workflowLaunchMachine, { + ...defaultStateMachineConfig, + services, + context: { + defaultInputValues, + preferredLaunchPlanId, + preferredWorkflowId, + referenceExecutionId, + sourceId + } + }); + + const { + launchPlanOptions = [], + launchPlan, + workflowVersionOptions = [], + workflowVersion + } = state.context; + + const selectWorkflowVersion = (newWorkflow: WorkflowId) => { + if (newWorkflow === workflowVersion) { + return; + } + sendEvent({ + type: 'SELECT_WORKFLOW_VERSION', + workflowId: newWorkflow + }); + }; + + const selectLaunchPlan = (newLaunchPlan: LaunchPlan) => { + if (newLaunchPlan === launchPlan) { + return; + } + sendEvent({ + type: 'SELECT_LAUNCH_PLAN', + launchPlan: newLaunchPlan + }); + }; + + const workflowSourceSelectorState = useWorkflowSourceSelectorState({ + launchPlan, + launchPlanOptions, + sourceId, + selectLaunchPlan, + selectWorkflowVersion, + workflowVersion, + workflowVersionOptions + }); + + useEffect(() => { + const subscription = service.subscribe(newState => { + if (newState.matches(LaunchState.SELECT_WORKFLOW_VERSION)) { + const { + workflowVersionOptions, + preferredWorkflowId + } = newState.context; + if (workflowVersionOptions.length > 0) { + let workflowToSelect = workflowVersionOptions[0]; + if (preferredWorkflowId) { + const preferred = workflowVersionOptions.find( + ({ id }) => isEqual(id, preferredWorkflowId) + ); + if (preferred) { + workflowToSelect = preferred; + } + } + sendEvent({ + type: 'SELECT_WORKFLOW_VERSION', + workflowId: workflowToSelect.id + }); + } + } + + if (newState.matches(LaunchState.SELECT_LAUNCH_PLAN)) { + const { + launchPlan, + launchPlanOptions, + sourceId + } = newState.context; + if (!launchPlanOptions.length) { + return; + } + + let launchPlanToSelect = launchPlanOptions[0]; + /* Attempt to select, in order: + * 1. The last launch plan that was selected, matching by the name, to preserve + * any user selection before switching workflow versions. + * 2. The launch plan that was specified when initializing the form, by full id + * 3. The default launch plan, which has the same `name` as the workflow + * 4. The first launch plan in the list + */ + if (launchPlan) { + const lastSelected = launchPlanOptions.find( + ({ id: { name } }) => name === launchPlan.id.name + ); + if (lastSelected) { + launchPlanToSelect = lastSelected; + } + } else if (preferredLaunchPlanId) { + const preferred = launchPlanOptions.find(({ id }) => + isEqual(id, preferredLaunchPlanId) + ); + if (preferred) { + launchPlanToSelect = preferred; + } + } else { + const defaultLaunchPlan = launchPlanOptions.find( + ({ id: { name } }) => name === sourceId.name + ); + if (defaultLaunchPlan) { + launchPlanToSelect = defaultLaunchPlan; + } + } + + sendEvent({ + type: 'SELECT_LAUNCH_PLAN', + launchPlan: launchPlanToSelect + }); + } + }); + + return subscription.unsubscribe; + }, [service, sendEvent]); + + return { + formInputsRef, + state, + service, + workflowSourceSelectorState + }; +} diff --git a/src/components/Launch/LaunchForm/useMappedExecutionInputValues.ts b/src/components/Launch/LaunchForm/useMappedExecutionInputValues.ts new file mode 100644 index 000000000..e4e8688c9 --- /dev/null +++ b/src/components/Launch/LaunchForm/useMappedExecutionInputValues.ts @@ -0,0 +1,61 @@ +import { log } from 'common/log'; +import { APIContextValue, useAPIContext } from 'components/data/apiContext'; +import { fetchWorkflowExecutionInputs } from 'components/Executions/useWorkflowExecution'; +import { FetchableData, useFetchableData } from 'components/hooks'; +import { Execution, Variable } from 'models'; +import { LiteralValueMap } from './types'; +import { createInputCacheKey, getInputDefintionForLiteralType } from './utils'; + +export interface UseMappedExecutionInputValuesArgs { + execution: Execution; + inputDefinitions: Record; +} + +export async function fetchAndMapExecutionInputValues( + { execution, inputDefinitions }: UseMappedExecutionInputValuesArgs, + apiContext: APIContextValue +): Promise { + const inputValues = await fetchWorkflowExecutionInputs( + execution, + apiContext + ); + + const { literals } = inputValues; + const values: LiteralValueMap = Object.keys(literals).reduce( + (out, name) => { + const input = inputDefinitions[name]; + if (!input) { + log.error(`Unexpected missing input definition: ${name}`); + return out; + } + const typeDefinition = getInputDefintionForLiteralType(input.type); + + const key = createInputCacheKey(name, typeDefinition); + out.set(key, literals[name]); + return out; + }, + new Map() + ); + return values; +} + +/** Returns a fetchable that will result in a LiteralValueMap representing the + * input values from an execution mapped to a set of input definitions from a Task or Workflow */ +export function useMappedExecutionInputValues({ + execution, + inputDefinitions +}: UseMappedExecutionInputValuesArgs): FetchableData { + const apiContext = useAPIContext(); + return useFetchableData( + { + debugName: 'MappedExecutionInputValues', + defaultValue: {} as LiteralValueMap, + doFetch: async ({ execution, inputDefinitions }) => + fetchAndMapExecutionInputValues( + { execution, inputDefinitions }, + apiContext + ) + }, + { execution, inputDefinitions } + ); +} diff --git a/src/components/Launch/LaunchForm/useTaskSourceSelectorState.ts b/src/components/Launch/LaunchForm/useTaskSourceSelectorState.ts new file mode 100644 index 000000000..bc8ca04bc --- /dev/null +++ b/src/components/Launch/LaunchForm/useTaskSourceSelectorState.ts @@ -0,0 +1,100 @@ +import { APIContextValue, useAPIContext } from 'components/data/apiContext'; +import { + FilterOperationName, + Identifier, + NamedEntityIdentifier, + SortDirection, + Task, + taskSortFields +} from 'models'; +import { useMemo, useState } from 'react'; +import { SearchableSelectorOption } from './SearchableSelector'; +import { TaskSourceSelectorState } from './types'; +import { useVersionSelectorOptions } from './useVersionSelectorOptions'; +import { versionsToSearchableSelectorOptions } from './utils'; + +function generateFetchSearchResults( + { listTasks }: APIContextValue, + taskId: NamedEntityIdentifier +) { + return async (query: string) => { + const { project, domain, name } = taskId; + const { entities: tasks } = await listTasks( + { project, domain, name }, + { + filter: [ + { + key: 'version', + operation: FilterOperationName.CONTAINS, + value: query + } + ], + sort: { + key: taskSortFields.createdAt, + direction: SortDirection.DESCENDING + } + } + ); + return versionsToSearchableSelectorOptions(tasks); + }; +} + +interface UseTaskSourceSelectorStateArgs { + /** The parent task for which we are selecting a version. */ + sourceId: NamedEntityIdentifier; + /** The currently selected Task version. */ + taskVersion?: Identifier; + /** The list of options to show for the Task selector. */ + taskVersionOptions: Task[]; + /** Callback fired when a task has been selected. */ + selectTaskVersion(task: Identifier): void; +} + +/** Generates state for the version selector rendered when using a task + * as a source in the Launch form. + */ +export function useTaskSourceSelectorState({ + sourceId, + taskVersion, + taskVersionOptions, + selectTaskVersion +}: UseTaskSourceSelectorStateArgs): TaskSourceSelectorState { + const apiContext = useAPIContext(); + const taskSelectorOptions = useVersionSelectorOptions(taskVersionOptions); + const [taskVersionSearchOptions, setTaskVersionSearchOptions] = useState< + SearchableSelectorOption[] + >([]); + + const selectedTask = useMemo(() => { + if (!taskVersion) { + return undefined; + } + // Search both the default and search results to match our selected task + // with the correct SearchableSelector item. + return [...taskSelectorOptions, ...taskVersionSearchOptions].find( + option => option.id === taskVersion.version + ); + }, [taskVersion, taskVersionOptions]); + + const onSelectTaskVersion = useMemo( + () => ({ data }: SearchableSelectorOption) => + selectTaskVersion(data), + [selectTaskVersion] + ); + + const fetchSearchResults = useMemo(() => { + const doFetch = generateFetchSearchResults(apiContext, sourceId); + return async (query: string) => { + const results = await doFetch(query); + setTaskVersionSearchOptions(results); + return results; + }; + }, [apiContext, sourceId, setTaskVersionSearchOptions]); + + return { + fetchSearchResults, + onSelectTaskVersion, + selectedTask, + taskSelectorOptions + }; +} diff --git a/src/components/Launch/LaunchForm/useVersionSelectorOptions.ts b/src/components/Launch/LaunchForm/useVersionSelectorOptions.ts new file mode 100644 index 000000000..f7ee0f00a --- /dev/null +++ b/src/components/Launch/LaunchForm/useVersionSelectorOptions.ts @@ -0,0 +1,13 @@ +import { useMemo } from 'react'; +import { SearchableVersion } from './types'; +import { versionsToSearchableSelectorOptions } from './utils'; + +export function useVersionSelectorOptions(versions: SearchableVersion[]) { + return useMemo(() => { + const options = versionsToSearchableSelectorOptions(versions); + if (options.length > 0) { + options[0].description = 'latest'; + } + return options; + }, [versions]); +} diff --git a/src/components/Launch/LaunchForm/useWorkflowSourceSelectorState.ts b/src/components/Launch/LaunchForm/useWorkflowSourceSelectorState.ts new file mode 100644 index 000000000..e607599be --- /dev/null +++ b/src/components/Launch/LaunchForm/useWorkflowSourceSelectorState.ts @@ -0,0 +1,143 @@ +import { APIContextValue, useAPIContext } from 'components/data/apiContext'; +import { + FilterOperationName, + LaunchPlan, + NamedEntityIdentifier, + SortDirection, + Workflow, + WorkflowId, + workflowSortFields +} from 'models'; +import { useMemo, useState } from 'react'; +import { SearchableSelectorOption } from './SearchableSelector'; +import { WorkflowSourceSelectorState } from './types'; +import { useVersionSelectorOptions } from './useVersionSelectorOptions'; +import { + launchPlansToSearchableSelectorOptions, + versionsToSearchableSelectorOptions +} from './utils'; + +function useLaunchPlanSelectorOptions(launchPlans: LaunchPlan[]) { + return useMemo(() => launchPlansToSearchableSelectorOptions(launchPlans), [ + launchPlans + ]); +} + +function generateFetchSearchResults( + { listWorkflows }: APIContextValue, + workflowId: NamedEntityIdentifier +) { + return async (query: string) => { + const { project, domain, name } = workflowId; + const { entities: workflows } = await listWorkflows( + { project, domain, name }, + { + filter: [ + { + key: 'version', + operation: FilterOperationName.CONTAINS, + value: query + } + ], + sort: { + key: workflowSortFields.createdAt, + direction: SortDirection.DESCENDING + } + } + ); + return versionsToSearchableSelectorOptions(workflows); + }; +} + +interface UseWorkflowSourceSelectorStateArgs { + /** The currently selected launch plan */ + launchPlan?: LaunchPlan; + /** List of options to show for the launch plan selector. */ + launchPlanOptions: LaunchPlan[]; + /** The parent workflow for which we are selecting a version. */ + sourceId: NamedEntityIdentifier; + /** The currently selected Workflow version. */ + workflowVersion?: WorkflowId; + /** The list of options to show for the Workflow selector. */ + workflowVersionOptions: Workflow[]; + /** Callback fired when a workflow has been selected. */ + selectWorkflowVersion(workflow: WorkflowId): void; + /** Callback fired when a launch plan has been selected. */ + selectLaunchPlan(launchPlan: LaunchPlan): void; +} + +/** Generates state for the workflow/launch plan selectors render when using a workflow + * as a source in the Launch form. + */ +export function useWorkflowSourceSelectorState({ + launchPlan, + launchPlanOptions, + sourceId, + workflowVersion, + workflowVersionOptions, + selectLaunchPlan, + selectWorkflowVersion +}: UseWorkflowSourceSelectorStateArgs): WorkflowSourceSelectorState { + const apiContext = useAPIContext(); + const workflowSelectorOptions = useVersionSelectorOptions( + workflowVersionOptions + ); + const [ + workflowVersionSearchOptions, + setWorkflowVersionSearchOptions + ] = useState[]>([]); + const launchPlanSelectorOptions = useLaunchPlanSelectorOptions( + launchPlanOptions + ); + + const selectedWorkflow = useMemo(() => { + if (!workflowVersion) { + return undefined; + } + // Search both the default and search results to match our selected workflow + // with the correct SearchableSelector item. + return [ + ...workflowSelectorOptions, + ...workflowVersionSearchOptions + ].find(option => option.id === workflowVersion.version); + }, [workflowVersion, workflowVersionOptions]); + + const selectedLaunchPlan = useMemo(() => { + if (!launchPlan) { + return undefined; + } + return launchPlanSelectorOptions.find( + option => option.id === launchPlan.id.name + ); + }, [launchPlan, launchPlanOptions]); + + const onSelectLaunchPlan = useMemo( + () => ({ data }: SearchableSelectorOption) => + selectLaunchPlan(data), + [selectLaunchPlan] + ); + const onSelectWorkflowVersion = useMemo( + () => ({ data }: SearchableSelectorOption) => + selectWorkflowVersion(data), + [selectWorkflowVersion] + ); + + const fetchSearchResults = useMemo(() => { + const doFetch = generateFetchSearchResults(apiContext, sourceId); + return async (query: string) => { + const results = await doFetch(query); + setWorkflowVersionSearchOptions(results); + return results; + }; + }, [apiContext, sourceId, setWorkflowVersionSearchOptions]); + + return { + fetchSearchResults, + launchPlanSelectorOptions, + onSelectLaunchPlan, + onSelectWorkflowVersion, + selectedLaunchPlan, + selectedWorkflow, + workflowSelectorOptions + }; +} diff --git a/src/components/Launch/LaunchWorkflowForm/utils.ts b/src/components/Launch/LaunchForm/utils.ts similarity index 82% rename from src/components/Launch/LaunchWorkflowForm/utils.ts rename to src/components/Launch/LaunchForm/utils.ts index 2434b0210..ba1111dbd 100644 --- a/src/components/Launch/LaunchWorkflowForm/utils.ts +++ b/src/components/Launch/LaunchForm/utils.ts @@ -2,11 +2,12 @@ import { timestampToDate } from 'common/utils'; import { Core } from 'flyteidl'; import { isObject } from 'lodash'; import { + Identifier, LaunchPlan, LiteralType, + Task, Variable, - Workflow, - WorkflowId + Workflow } from 'models'; import * as moment from 'moment'; import { simpleTypeToInputType, typeLabels } from './constants'; @@ -18,7 +19,8 @@ import { InputProps, InputType, InputTypeDefinition, - ParsedInput + ParsedInput, + SearchableVersion } from './types'; /** Creates a unique cache key for an input based on its name and type. @@ -56,6 +58,25 @@ export function getWorkflowInputs( return inputs.variables; } +export function getTaskInputs(task: Task): Record { + if (!task.closure) { + return {}; + } + const { compiledTask } = task.closure; + if (!compiledTask) { + return {}; + } + const { interface: ioInterface } = compiledTask.template; + if (!ioInterface) { + return {}; + } + const { inputs } = ioInterface; + if (!inputs) { + return {}; + } + return inputs.variables; +} + /** Returns a formatted string based on an InputTypeDefinition. * ex. `string`, `string[]`, `map` */ @@ -77,17 +98,17 @@ export function formatLabelWithType(label: string, type: InputTypeDefinition) { return `${label}${typeString ? ` (${typeString})` : ''}`; } -/** Formats a list of `Workflow` records for use in a `SearchableSelector` */ -export function workflowsToSearchableSelectorOptions( - workflows: Workflow[] -): SearchableSelectorOption[] { - return workflows.map>((wf, index) => ({ - data: wf.id, - id: wf.id.version, - name: wf.id.version, +/** Formats a list of records for use in a `SearchableSelector` */ +export function versionsToSearchableSelectorOptions( + items: SearchableVersion[] +): SearchableSelectorOption[] { + return items.map>((item, index) => ({ + data: item.id, + id: item.id.version, + name: item.id.version, description: - wf.closure && wf.closure.createdAt - ? moment(timestampToDate(wf.closure.createdAt)).format( + item.closure && item.closure.createdAt + ? moment(timestampToDate(item.closure.createdAt)).format( 'DD MMM YYYY' ) : '' diff --git a/src/components/Launch/LaunchWorkflowForm/LaunchWorkflowForm.tsx b/src/components/Launch/LaunchWorkflowForm/LaunchWorkflowForm.tsx deleted file mode 100644 index a89b89d50..000000000 --- a/src/components/Launch/LaunchWorkflowForm/LaunchWorkflowForm.tsx +++ /dev/null @@ -1,161 +0,0 @@ -import { - Button, - DialogActions, - DialogContent, - DialogTitle, - FormHelperText, - Typography -} from '@material-ui/core'; -import { WaitForData } from 'components/common'; -import { ButtonCircularProgress } from 'components/common/ButtonCircularProgress'; -import { APIContextValue, useAPIContext } from 'components/data/apiContext'; -import { isLoadingState } from 'components/hooks/fetchMachine'; -import { - FilterOperationName, - NamedEntityIdentifier, - SortDirection, - workflowSortFields -} from 'models'; -import * as React from 'react'; -import { formStrings } from './constants'; -import { InputValueCacheContext } from './inputValueCache'; -import { LaunchWorkflowFormInputs } from './LaunchWorkflowFormInputs'; -import { SearchableSelector } from './SearchableSelector'; -import { useStyles } from './styles'; -import { LaunchWorkflowFormProps } from './types'; -import { UnsupportedRequiredInputsError } from './UnsupportedRequiredInputsError'; -import { useLaunchWorkflowFormState } from './useLaunchWorkflowFormState'; -import { workflowsToSearchableSelectorOptions } from './utils'; - -function generateFetchSearchResults( - { listWorkflows }: APIContextValue, - workflowId: NamedEntityIdentifier -) { - return async (query: string) => { - const { project, domain, name } = workflowId; - const { entities: workflows } = await listWorkflows( - { project, domain, name }, - { - filter: [ - { - key: 'version', - operation: FilterOperationName.CONTAINS, - value: query - } - ], - sort: { - key: workflowSortFields.createdAt, - direction: SortDirection.DESCENDING - } - } - ); - return workflowsToSearchableSelectorOptions(workflows); - }; -} - -/** Renders the form for initiating a Launch request based on a Workflow */ -export const LaunchWorkflowForm: React.FC = props => { - const state = useLaunchWorkflowFormState(props); - const { submissionState, unsupportedRequiredInputs, workflows } = state; - const styles = useStyles(); - const fetchSearchResults = generateFetchSearchResults( - useAPIContext(), - props.workflowId - ); - - const submit: React.FormEventHandler = event => { - event.preventDefault(); - state.onSubmit(); - }; - - const submissionInFlight = isLoadingState(submissionState.state); - const preventSubmit = - submissionInFlight || - !state.inputsReady || - unsupportedRequiredInputs.length > 0; - - return ( - - -
      {formStrings.title}
      - {state.workflowName} -
      - - -
      - -
      - -
      - -
      -
      - {state.inputsReady ? ( -
      - {state.unsupportedRequiredInputs.length > 0 ? ( - - ) : ( - - )} -
      - ) : null} -
      -
      -
      - {!!submissionState.lastError && ( - - {submissionState.lastError.message} - - )} - - - - -
      -
      - ); -}; diff --git a/src/components/Launch/LaunchWorkflowForm/LaunchWorkflowFormInputs.tsx b/src/components/Launch/LaunchWorkflowForm/LaunchWorkflowFormInputs.tsx deleted file mode 100644 index ad83ed0ab..000000000 --- a/src/components/Launch/LaunchWorkflowForm/LaunchWorkflowFormInputs.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import * as React from 'react'; -import { BlobInput } from './BlobInput'; -import { CollectionInput } from './CollectionInput'; -import { SimpleInput } from './SimpleInput'; -import { useStyles } from './styles'; -import { - InputProps, - InputType, - LaunchWorkflowFormInputsRef, - ParsedInput -} from './types'; -import { UnsupportedInput } from './UnsupportedInput'; -import { useFormInputsState } from './useFormInputsState'; - -function getComponentForInput(input: InputProps, showErrors: boolean) { - const props = { ...input, error: showErrors ? input.error : undefined }; - switch (input.typeDefinition.type) { - case InputType.Blob: - return ; - case InputType.Collection: - return ; - case InputType.Map: - case InputType.Schema: - case InputType.Unknown: - case InputType.None: - return ; - default: - return ; - } -} - -export interface LaunchWorkflowFormInputsProps { - inputs: ParsedInput[]; - showErrors?: boolean; -} - -export const LaunchWorkflowFormInputsImpl: React.RefForwardingComponent< - LaunchWorkflowFormInputsRef, - LaunchWorkflowFormInputsProps -> = ({ inputs: parsedInputs, showErrors = true }, ref) => { - const { getValues, inputs, validate } = useFormInputsState(parsedInputs); - const styles = useStyles(); - React.useImperativeHandle(ref, () => ({ - getValues, - validate - })); - - return ( - <> - {inputs.map(input => ( -
      - {getComponentForInput(input, showErrors)} -
      - ))} - - ); -}; - -/** Renders an array of `ParsedInput` values using the appropriate - * components. A `ref` to this component is used to access the current - * form values and trigger manual validation if needed. - */ -export const LaunchWorkflowFormInputs = React.forwardRef( - LaunchWorkflowFormInputsImpl -); diff --git a/src/components/Launch/LaunchWorkflowForm/types.ts b/src/components/Launch/LaunchWorkflowForm/types.ts deleted file mode 100644 index f4a1334e1..000000000 --- a/src/components/Launch/LaunchWorkflowForm/types.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { FetchableData } from 'components/hooks'; -import { Core } from 'flyteidl'; -import { - BlobDimensionality, - Identifier, - LaunchPlan, - NamedEntityIdentifier, - Workflow, - WorkflowExecutionIdentifier, - WorkflowId -} from 'models'; -import { SearchableSelectorOption } from './SearchableSelector'; - -export type InputValueMap = Map; -export type LiteralValueMap = Map; - -export interface InitialLaunchParameters { - launchPlan?: Identifier; - workflow?: WorkflowId; - values?: LiteralValueMap; -} - -export interface LaunchWorkflowFormProps { - workflowId: NamedEntityIdentifier; - initialParameters?: InitialLaunchParameters; - onClose(): void; -} - -export interface LaunchWorkflowFormInputsRef { - getValues(): Record; - validate(): boolean; -} - -export interface LaunchWorkflowFormState { - /** Used to key inputs component so it is re-mounted the list of inputs */ - formKey?: string; - formInputsRef: React.RefObject; - inputs: ParsedInput[]; - inputsReady: boolean; - inputValueCache: InputValueMap; - launchPlans: FetchableData; - launchPlanSelectorOptions: SearchableSelectorOption[]; - selectedLaunchPlan?: SearchableSelectorOption; - selectedWorkflow?: SearchableSelectorOption; - showErrors: boolean; - submissionState: FetchableData; - unsupportedRequiredInputs: ParsedInput[]; - workflowName: string; - workflows: FetchableData; - workflowSelectorOptions: SearchableSelectorOption[]; - onCancel(): void; - onSelectWorkflow(selected: SearchableSelectorOption): void; - onSubmit(): void; - onSelectLaunchPlan(selected: SearchableSelectorOption): void; -} - -export enum InputType { - Binary = 'BINARY', - Blob = 'BLOB', - Boolean = 'BOOLEAN', - Collection = 'COLLECTION', - Datetime = 'DATETIME', - Duration = 'DURATION', - Error = 'ERROR', - Float = 'FLOAT', - Integer = 'INTEGER', - Map = 'MAP', - None = 'NONE', - Schema = 'SCHEMA', - String = 'STRING', - Struct = 'STRUCT', - Unknown = 'UNKNOWN' -} - -export interface InputTypeDefinition { - type: InputType; - subtype?: InputTypeDefinition; -} - -export interface ObjectValue { - type: InputType; -} - -export interface BlobValue { - dimensionality: BlobDimensionality | string; - format?: string; - uri: string; -} - -export type InputValue = string | number | boolean | Date | BlobValue; -export type InputChangeHandler = (newValue: InputValue) => void; - -export interface InputProps { - description: string; - error?: string; - helperText?: string; - initialValue?: Core.ILiteral; - name: string; - label: string; - required: boolean; - typeDefinition: InputTypeDefinition; - value?: InputValue; - onChange: InputChangeHandler; -} - -export interface ParsedInput - extends Pick< - InputProps, - 'description' | 'label' | 'name' | 'required' | 'typeDefinition' - > { - /** Provides an initial value for the input, which can be changed by the user. */ - initialValue?: Core.ILiteral; -} diff --git a/src/components/Launch/LaunchWorkflowForm/useExecutionLaunchConfiguration.ts b/src/components/Launch/LaunchWorkflowForm/useExecutionLaunchConfiguration.ts deleted file mode 100644 index 6ebf81d62..000000000 --- a/src/components/Launch/LaunchWorkflowForm/useExecutionLaunchConfiguration.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { log } from 'common/log'; -import { useAPIContext } from 'components/data/apiContext'; -import { fetchWorkflowExecutionInputs } from 'components/Executions/useWorkflowExecution'; -import { FetchableData, useFetchableData } from 'components/hooks'; -import { Execution, Variable } from 'models'; -import { InitialLaunchParameters, LiteralValueMap } from './types'; -import { createInputCacheKey, getInputDefintionForLiteralType } from './utils'; - -export interface UseExecutionLaunchConfigurationArgs { - execution: Execution; - workflowInputs: Record; -} - -/** Returns a fetchable that will result in a `InitialLaunchParameters` object based on a provided `Execution` and its associated workflow inputs. */ -export function useExecutionLaunchConfiguration({ - execution, - workflowInputs -}: UseExecutionLaunchConfigurationArgs): FetchableData< - InitialLaunchParameters -> { - const apiContext = useAPIContext(); - return useFetchableData< - InitialLaunchParameters, - UseExecutionLaunchConfigurationArgs - >( - { - debugName: 'ExecutionLaunchConfiguration', - defaultValue: {} as InitialLaunchParameters, - doFetch: async ({ execution, workflowInputs }) => { - const { - closure: { workflowId }, - spec: { launchPlan } - } = execution; - - const inputs = await fetchWorkflowExecutionInputs( - execution, - apiContext - ); - - const { literals } = inputs; - const values: LiteralValueMap = Object.keys(literals).reduce( - (out, name) => { - const workflowInput = workflowInputs[name]; - if (!workflowInput) { - log.error( - `Unexpected missing workflow input: ${name}` - ); - return out; - } - const typeDefinition = getInputDefintionForLiteralType( - workflowInput.type - ); - - const key = createInputCacheKey(name, typeDefinition); - out.set(key, literals[name]); - return out; - }, - new Map() - ); - - return { launchPlan, values, workflow: workflowId }; - } - }, - { execution, workflowInputs } - ); -} diff --git a/src/components/Launch/LaunchWorkflowForm/useLaunchWorkflowFormState.ts b/src/components/Launch/LaunchWorkflowForm/useLaunchWorkflowFormState.ts deleted file mode 100644 index c21b54e17..000000000 --- a/src/components/Launch/LaunchWorkflowForm/useLaunchWorkflowFormState.ts +++ /dev/null @@ -1,430 +0,0 @@ -import { getCacheKey } from 'components/Cache'; -import { useAPIContext } from 'components/data/apiContext'; -import { useFetchableData, useWorkflow } from 'components/hooks'; -import { fetchStates } from 'components/hooks/types'; -import { isEqual, uniqBy } from 'lodash'; -import { - FilterOperationName, - Identifier, - LaunchPlan, - NamedEntityIdentifier, - SortDirection, - Workflow, - WorkflowExecutionIdentifier, - WorkflowId, - workflowSortFields -} from 'models'; -import { useEffect, useMemo, useRef, useState } from 'react'; -import { history, Routes } from 'routes'; -import { getInputs } from './getInputs'; -import { createInputValueCache } from './inputValueCache'; -import { SearchableSelectorOption } from './SearchableSelector'; -import { - LaunchWorkflowFormInputsRef, - LaunchWorkflowFormProps, - LaunchWorkflowFormState, - ParsedInput -} from './types'; -import { - getUnsupportedRequiredInputs, - launchPlansToSearchableSelectorOptions, - workflowsToSearchableSelectorOptions -} from './utils'; - -export function useWorkflowSelectorOptions(workflows: Workflow[]) { - return useMemo(() => { - const options = workflowsToSearchableSelectorOptions(workflows); - if (options.length > 0) { - options[0].description = 'latest'; - } - return options; - }, [workflows]); -} - -function useLaunchPlanSelectorOptions(launchPlans: LaunchPlan[]) { - return useMemo(() => launchPlansToSearchableSelectorOptions(launchPlans), [ - launchPlans - ]); -} - -interface UseLaunchPlansForWorkflowArgs { - workflowId?: WorkflowId | null; - preferredLaunchPlanId?: Identifier; -} -/** Lists launch plans for a given workflowId, optionally fetching a preferred - * launch plan. The result is a merged, de-duplicated list. - */ -function useLaunchPlansForWorkflow({ - workflowId = null, - preferredLaunchPlanId -}: UseLaunchPlansForWorkflowArgs) { - const { listLaunchPlans } = useAPIContext(); - return useFetchableData( - { - autoFetch: workflowId !== null, - debugName: 'useLaunchPlansForWorkflow', - defaultValue: [], - doFetch: async workflowId => { - if (workflowId === null) { - return Promise.reject('No workflowId specified'); - } - - let preferredLaunchPlanPromise = Promise.resolve({ - entities: [] as LaunchPlan[] - }); - if (preferredLaunchPlanId) { - const { version, ...scope } = preferredLaunchPlanId; - preferredLaunchPlanPromise = listLaunchPlans(scope, { - limit: 1, - filter: [ - { - key: 'version', - operation: FilterOperationName.EQ, - value: version - } - ] - }); - } - - const { project, domain, name, version } = workflowId; - const launchPlansPromise = listLaunchPlans( - { project, domain }, - // TODO: Only active? - { - filter: [ - { - key: 'workflow.name', - operation: FilterOperationName.EQ, - value: name - }, - { - key: 'workflow.version', - operation: FilterOperationName.EQ, - value: version - } - ], - limit: 10 - } - ); - - const [ - launchPlansResult, - preferredLaunchPlanResult - ] = await Promise.all([ - launchPlansPromise, - preferredLaunchPlanPromise - ]); - const merged = [ - ...launchPlansResult.entities, - ...preferredLaunchPlanResult.entities - ]; - return uniqBy(merged, ({ id }) => id.name); - } - }, - workflowId - ); -} - -/** Fetches workflow versions matching a specific scope, optionally also - * fetching a preferred version. The result is a merged, de-duplicated list. - */ -function useWorkflowsWithPreferredVersion( - workflowName: NamedEntityIdentifier, - preferredVersion?: WorkflowId -) { - const { listWorkflows } = useAPIContext(); - return useFetchableData( - { - debugName: 'UseWorkflowsWithPreferredVersion', - defaultValue: [] as Workflow[], - doFetch: async () => { - const { project, domain, name } = workflowName; - const workflowsPromise = listWorkflows( - { project, domain, name }, - { - limit: 10, - sort: { - key: workflowSortFields.createdAt, - direction: SortDirection.DESCENDING - } - } - ); - - let preferredWorkflowPromise = Promise.resolve({ - entities: [] as Workflow[] - }); - if (preferredVersion) { - const { version, ...scope } = preferredVersion; - preferredWorkflowPromise = listWorkflows(scope, { - limit: 1, - filter: [ - { - key: 'version', - operation: FilterOperationName.EQ, - value: version - } - ] - }); - } - - const [ - workflowsResult, - preferredWorkflowResult - ] = await Promise.all([ - workflowsPromise, - preferredWorkflowPromise - ]); - const merged = [ - ...workflowsResult.entities, - ...preferredWorkflowResult.entities - ]; - return uniqBy(merged, ({ id: { version } }) => version); - } - }, - { workflowName, preferredVersion } - ); -} - -/** Contains all of the form state for a LaunchWorkflowForm, including input - * definitions, current input values, and errors. - */ -export function useLaunchWorkflowFormState({ - initialParameters = {}, - onClose, - workflowId -}: LaunchWorkflowFormProps): LaunchWorkflowFormState { - // These values will be used to auto-select items from the workflow - // version/launch plan drop downs. - const { - launchPlan: preferredLaunchPlanId, - workflow: preferredWorkflowId - } = initialParameters; - - const { createWorkflowExecution } = useAPIContext(); - const [ - lastSelectedLaunchPlanName, - setLastSelectedLaunchPlanName - ] = useState(); - const formInputsRef = useRef(null); - const [showErrors, setShowErrors] = useState(false); - const workflows = useWorkflowsWithPreferredVersion( - workflowId, - preferredWorkflowId - ); - - const workflowSelectorOptions = useWorkflowSelectorOptions(workflows.value); - const [selectedWorkflow, setWorkflow] = useState< - SearchableSelectorOption - >(); - const selectedWorkflowId = selectedWorkflow ? selectedWorkflow.data : null; - - const [inputValueCache] = useState(createInputValueCache()); - - // We have to do a single item get once a workflow is selected so that we - // receive the full workflow spec - const workflow = useWorkflow(selectedWorkflowId); - const launchPlans = useLaunchPlansForWorkflow({ - preferredLaunchPlanId, - workflowId: selectedWorkflowId - }); - const launchPlanSelectorOptions = useLaunchPlanSelectorOptions( - launchPlans.value - ); - - const [selectedLaunchPlan, setLaunchPlan] = useState< - SearchableSelectorOption - >(); - const launchPlanData = selectedLaunchPlan - ? selectedLaunchPlan.data - : undefined; - - const [parsedInputs, setParsedInputs] = useState([]); - const inputsReady = !!( - launchPlanData && workflow.state.matches(fetchStates.LOADED) - ); - - const unsupportedRequiredInputs = useMemo( - () => getUnsupportedRequiredInputs(parsedInputs), - [parsedInputs] - ); - - // Any time the inputs change (even if it's just re-ordering), we must - // change the form key so that the inputs component will re-mount. - const formKey = useMemo(() => { - if (!selectedWorkflowId || !selectedLaunchPlan) { - return ''; - } - return getCacheKey(parsedInputs); - }, [parsedInputs]); - - // Only show errors after first submission for a set of inputs. - useEffect(() => setShowErrors(false), [formKey]); - - const workflowName = workflowId.name; - - const onSelectWorkflow = ( - newWorkflow: SearchableSelectorOption - ) => { - if (newWorkflow === selectedWorkflow) { - return; - } - setLaunchPlan(undefined); - setWorkflow(newWorkflow); - }; - - const onSelectLaunchPlan = ( - newLaunchPlan: SearchableSelectorOption - ) => { - if (newLaunchPlan === selectedLaunchPlan) { - return; - } - setLastSelectedLaunchPlanName(newLaunchPlan.name); - setLaunchPlan(newLaunchPlan); - }; - - const launchWorkflow = async () => { - if (!launchPlanData) { - throw new Error('Attempting to launch with no LaunchPlan'); - } - if (formInputsRef.current === null) { - throw new Error('Unexpected empty form inputs ref'); - } - const literals = formInputsRef.current.getValues(); - const launchPlanId = launchPlanData.id; - const { domain, project } = workflowId; - - const response = await createWorkflowExecution({ - domain, - launchPlanId, - project, - inputs: { literals } - }); - const newExecutionId = response.id as WorkflowExecutionIdentifier; - if (!newExecutionId) { - throw new Error('API Response did not include new execution id'); - } - history.push(Routes.ExecutionDetails.makeUrl(newExecutionId)); - return newExecutionId; - }; - - const submissionState = useFetchableData< - WorkflowExecutionIdentifier, - string - >( - { - autoFetch: false, - debugName: 'LaunchWorkflowForm', - defaultValue: {} as WorkflowExecutionIdentifier, - doFetch: launchWorkflow - }, - formKey - ); - - const onSubmit = () => { - if (formInputsRef.current === null) { - console.error('Unexpected empty form inputs ref'); - return; - } - - // Show errors after the first submission - setShowErrors(true); - // We validate separately so that a request isn't triggered unless - // the inputs are valid. - if (!formInputsRef.current.validate()) { - return; - } - submissionState.fetch(); - }; - const onCancel = onClose; - - // Once the selected workflow and launch plan have loaded, parse and set - // the inputs so we can render the rest of the form - useEffect(() => { - const parsedInputs = - launchPlanData && workflow.state.matches(fetchStates.LOADED) - ? getInputs( - workflow.value, - launchPlanData, - initialParameters.values - ) - : []; - setParsedInputs(parsedInputs); - }, [workflow.state.value, workflow.value, launchPlanData]); - - // Once workflows have loaded, attempt to select the preferred workflow - // plan, or fall back to selecting the first option - useEffect(() => { - if (workflowSelectorOptions.length > 0 && !selectedWorkflow) { - if (preferredWorkflowId) { - const preferred = workflowSelectorOptions.find(({ data }) => - isEqual(data, preferredWorkflowId) - ); - if (preferred) { - setWorkflow(preferred); - return; - } - } - setWorkflow(workflowSelectorOptions[0]); - } - }, [workflows.value]); - - // Once launch plans have been loaded, attempt to keep the previously - // selected launch plan, followed by the preferred launch plan, the one - // matching the workflow name, or just the first option. - useEffect(() => { - if (!launchPlanSelectorOptions.length) { - return; - } - - if (lastSelectedLaunchPlanName) { - const lastSelected = launchPlanSelectorOptions.find( - ({ name }) => name === lastSelectedLaunchPlanName - ); - if (lastSelected) { - onSelectLaunchPlan(lastSelected); - return; - } - } - - if (preferredLaunchPlanId) { - const preferred = launchPlanSelectorOptions.find( - ({ data: { id } }) => isEqual(id, preferredLaunchPlanId) - ); - if (preferred) { - onSelectLaunchPlan(preferred); - return; - } - } - - const defaultLaunchPlan = launchPlanSelectorOptions.find( - ({ id }) => id === workflowId.name - ); - if (defaultLaunchPlan) { - onSelectLaunchPlan(defaultLaunchPlan); - return; - } - onSelectLaunchPlan(launchPlanSelectorOptions[0]); - }, [launchPlanSelectorOptions]); - - return { - formInputsRef, - formKey, - inputValueCache, - inputsReady, - launchPlans, - launchPlanSelectorOptions, - onCancel, - onSelectLaunchPlan, - onSelectWorkflow, - onSubmit, - selectedLaunchPlan, - selectedWorkflow, - showErrors, - submissionState, - unsupportedRequiredInputs, - workflowName, - workflows, - workflowSelectorOptions, - inputs: parsedInputs - }; -} diff --git a/src/components/Task/SearchableTaskNameList.tsx b/src/components/Task/SearchableTaskNameList.tsx index ad37f0e85..4b7f5a882 100644 --- a/src/components/Task/SearchableTaskNameList.tsx +++ b/src/components/Task/SearchableTaskNameList.tsx @@ -1,5 +1,6 @@ import { Typography } from '@material-ui/core'; import { makeStyles, Theme } from '@material-ui/core/styles'; +import ChevronRight from '@material-ui/icons/ChevronRight'; import ErrorOutline from '@material-ui/icons/ErrorOutline'; import * as classnames from 'classnames'; import { noDescriptionString } from 'common/constants'; @@ -15,6 +16,8 @@ import { NamedEntity } from 'models'; import * as React from 'react'; import { IntersectionOptions, useInView } from 'react-intersection-observer'; import reactLoadingSkeleton from 'react-loading-skeleton'; +import { Link } from 'react-router-dom'; +import { Routes } from 'routes/routes'; import { SimpleTaskInterface } from './SimpleTaskInterface'; import { useLatestTaskVersion } from './useLatestTask'; const Skeleton = reactLoadingSkeleton; @@ -91,6 +94,7 @@ const TaskNameRow: React.FC = ({ label, entityName }) => { {!!inView && }
    +
    ); }; @@ -100,14 +104,23 @@ export const SearchableTaskNameList: React.FC> = props => { + const commonStyles = useCommonStyles(); const renderItem = ({ key, value, content }: SearchResult) => ( -
  • + -
  • + ); return ; }; diff --git a/src/components/Task/SimpleTaskInterface.tsx b/src/components/Task/SimpleTaskInterface.tsx index d610ef03a..65adcda27 100644 --- a/src/components/Task/SimpleTaskInterface.tsx +++ b/src/components/Task/SimpleTaskInterface.tsx @@ -6,7 +6,7 @@ import { useCommonStyles } from 'components/common/styles'; import { formatType, getInputDefintionForLiteralType -} from 'components/Launch/LaunchWorkflowForm/utils'; +} from 'components/Launch/LaunchForm/utils'; import { Task, Variable } from 'models'; import * as React from 'react'; diff --git a/src/components/Task/TaskDetails.tsx b/src/components/Task/TaskDetails.tsx new file mode 100644 index 000000000..88cac9310 --- /dev/null +++ b/src/components/Task/TaskDetails.tsx @@ -0,0 +1,33 @@ +import { withRouteParams } from 'components/common'; +import { EntityDetails } from 'components/Entities/EntityDetails'; +import { ResourceIdentifier, ResourceType } from 'models'; +import * as React from 'react'; + +export interface TaskDetailsRouteParams { + projectId: string; + domainId: string; + taskName: string; +} +export type TaskDetailsProps = TaskDetailsRouteParams; + +/** The view component for the Task landing page */ +export const TaskDetailsContainer: React.FC = ({ + projectId, + domainId, + taskName +}) => { + const id = React.useMemo( + () => ({ + resourceType: ResourceType.TASK, + project: projectId, + domain: domainId, + name: taskName + }), + [projectId, domainId, taskName] + ); + return ; +}; + +export const TaskDetails = withRouteParams( + TaskDetailsContainer +); diff --git a/src/components/Workflow/WorkflowDetails.tsx b/src/components/Workflow/WorkflowDetails.tsx new file mode 100644 index 000000000..9adc228b3 --- /dev/null +++ b/src/components/Workflow/WorkflowDetails.tsx @@ -0,0 +1,33 @@ +import { withRouteParams } from 'components/common'; +import { EntityDetails } from 'components/Entities/EntityDetails'; +import { ResourceIdentifier, ResourceType } from 'models'; +import * as React from 'react'; + +export interface WorkflowDetailsRouteParams { + projectId: string; + domainId: string; + workflowName: string; +} +export type WorkflowDetailsProps = WorkflowDetailsRouteParams; + +/** The view component for the Workflow landing page */ +export const WorkflowDetailsContainer: React.FC = ({ + projectId, + domainId, + workflowName +}) => { + const id = React.useMemo( + () => ({ + resourceType: ResourceType.WORKFLOW, + project: projectId, + domain: domainId, + name: workflowName + }), + [projectId, domainId, workflowName] + ); + return ; +}; + +export const WorkflowDetails = withRouteParams( + WorkflowDetailsContainer +); diff --git a/src/components/Workflow/WorkflowDetails/WorkflowDetails.tsx b/src/components/Workflow/WorkflowDetails/WorkflowDetails.tsx deleted file mode 100644 index f8a42a7a1..000000000 --- a/src/components/Workflow/WorkflowDetails/WorkflowDetails.tsx +++ /dev/null @@ -1,98 +0,0 @@ -import { Dialog } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { contentMarginGridUnits } from 'common/layout'; -import { WaitForData, withRouteParams } from 'components/common'; -import { useProject } from 'components/hooks'; -import { LaunchWorkflowForm } from 'components/Launch/LaunchWorkflowForm/LaunchWorkflowForm'; -import * as React from 'react'; -import { WorkflowDescription } from './WorkflowDescription'; -import { WorkflowDetailsHeader } from './WorkflowDetailsHeader'; -import { WorkflowExecutions } from './WorkflowExecutions'; -import { WorkflowSchedules } from './WorkflowSchedules'; - -const useStyles = makeStyles((theme: Theme) => ({ - metadataContainer: { - display: 'flex', - marginBottom: theme.spacing(5), - marginTop: theme.spacing(2), - width: '100%' - }, - descriptionContainer: { - flex: '2 1 auto', - marginRight: theme.spacing(2) - }, - executionsContainer: { - display: 'flex', - flex: '1 1 auto', - flexDirection: 'column', - margin: `0 -${theme.spacing(contentMarginGridUnits)}px` - }, - schedulesContainer: { - flex: '1 2 auto', - marginRight: theme.spacing(30) - } -})); - -export interface WorkflowDetailsRouteParams { - projectId: string; - domainId: string; - workflowName: string; -} -export type WorkflowDetailsProps = WorkflowDetailsRouteParams; - -/** The view component for the Workflow landing page */ -export const WorkflowDetailsContainer: React.FC = ({ - projectId, - domainId, - workflowName -}) => { - const project = useProject(projectId); - const styles = useStyles(); - const [showLaunchForm, setShowLaunchForm] = React.useState(false); - const onLaunch = () => setShowLaunchForm(true); - const onCancelLaunch = () => setShowLaunchForm(false); - - const workflowId = { - project: projectId, - domain: domainId, - name: workflowName - }; - return ( - <> - - -
    -
    - -
    -
    - -
    -
    -
    - -
    - - - -
    - - ); -}; - -export const WorkflowDetails = withRouteParams( - WorkflowDetailsContainer -); diff --git a/src/components/Workflow/WorkflowDetails/WorkflowLaunchPlans.tsx b/src/components/Workflow/WorkflowDetails/WorkflowLaunchPlans.tsx deleted file mode 100644 index 1dbee7131..000000000 --- a/src/components/Workflow/WorkflowDetails/WorkflowLaunchPlans.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import * as React from 'react'; - -import { WaitForData, withRouteParams } from 'components/common'; -import { useLaunchPlans } from 'components/hooks'; -import { LaunchPlansTable } from 'components/Launch/LaunchPlansTable'; - -import { launchSortFields, SortDirection } from 'models'; - -export interface WorkflowLaunchPlansRouteParams { - projectId: string; - domainId: string; - workflowName: string; -} - -/** The tab/page content for viewing a workflow's launch plans */ -export const WorkflowLaunchPlansContainer: React.FC = ({ - projectId: project, - domainId: domain, - workflowName: name -}) => { - const launchPlans = useLaunchPlans( - { domain, name, project }, - { - sort: { - direction: SortDirection.DESCENDING, - key: launchSortFields.createdAt - } - } - ); - - return ( - - - - ); -}; - -export const WorkflowLaunchPlans = withRouteParams< - WorkflowLaunchPlansRouteParams ->(WorkflowLaunchPlansContainer); diff --git a/src/components/Workflow/WorkflowDetails/WorkflowVersions.tsx b/src/components/Workflow/WorkflowDetails/WorkflowVersions.tsx deleted file mode 100644 index f527f8603..000000000 --- a/src/components/Workflow/WorkflowDetails/WorkflowVersions.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import * as React from 'react'; - -import { WaitForData, withRouteParams } from 'components/common'; -import { useWorkflows } from 'components/hooks'; - -import { SortDirection, workflowSortFields } from 'models'; - -import { WorkflowsTable } from '../WorkflowsTable'; - -export interface WorkflowVersionsRouteParams { - projectId: string; - domainId: string; - workflowName: string; -} - -/** The tab/page content for viewing a workflow's versions */ -export const WorkflowVersionsContainer: React.FC = ({ - projectId: project, - domainId: domain, - workflowName: name -}) => { - const workflows = useWorkflows( - { domain, name, project }, - { - sort: { - direction: SortDirection.DESCENDING, - key: workflowSortFields.createdAt - } - } - ); - - return ( - - - - ); -}; - -export const WorkflowVersions = withRouteParams( - WorkflowVersionsContainer -); diff --git a/src/components/Workflow/WorkflowDetails/index.ts b/src/components/Workflow/WorkflowDetails/index.ts deleted file mode 100644 index 0df67e8db..000000000 --- a/src/components/Workflow/WorkflowDetails/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './WorkflowDetails'; -export * from './WorkflowExecutions'; diff --git a/src/components/common/constants.ts b/src/components/common/constants.ts index 209e6ff36..f27d27071 100644 --- a/src/components/common/constants.ts +++ b/src/components/common/constants.ts @@ -1,6 +1,13 @@ +import { env } from 'common/env'; +import { InterpreterOptions } from 'xstate'; + export const detailsPanelWidth = 432; export const labels = { moreOptionsButton: 'Display more options', moreOptionsMenu: 'More options menu' }; + +export const defaultStateMachineConfig: Partial = { + devTools: env.NODE_ENV === 'development' +}; diff --git a/src/components/hooks/useFetchableData.ts b/src/components/hooks/useFetchableData.ts index 5569affe1..976ce4199 100644 --- a/src/components/hooks/useFetchableData.ts +++ b/src/components/hooks/useFetchableData.ts @@ -2,6 +2,7 @@ import { useMachine } from '@xstate/react'; import { env } from 'common/env'; import { createDebugLogger } from 'common/log'; import { CacheContext, getCacheKey, ValueCache } from 'components/Cache'; +import { defaultStateMachineConfig } from 'components/common/constants'; import { APIContextValue, useAPIContext } from 'components/data/apiContext'; import { NotAuthorizedError } from 'errors'; import { useContext, useEffect, useMemo, useRef } from 'react'; @@ -144,7 +145,7 @@ export function useFetchableData( FetchStateContext, FetchEventObject >(fetchMachine as FetchMachine, { - devTools: env.NODE_ENV === 'development', + ...defaultStateMachineConfig, context: { debugName, defaultValue, diff --git a/src/components/hooks/useQueryState.ts b/src/components/hooks/useQueryState.ts index 9ecb646a6..021ce64c6 100644 --- a/src/components/hooks/useQueryState.ts +++ b/src/components/hooks/useQueryState.ts @@ -1,5 +1,5 @@ import { pickBy } from 'lodash'; -import { parse, stringify } from 'query-string'; +import { parse, ParsedQuery, stringify } from 'query-string'; import { useEffect, useState } from 'react'; import { history } from 'routes/history'; @@ -7,7 +7,7 @@ import { history } from 'routes/history'; * It will attach a listener to history so that components using query params * are updated whenever the path/query changes. */ -export const useQueryState = () => { +export const useQueryState = () => { const [params, setParams] = useState>( parse(history.location.search) as Partial ); diff --git a/src/models/Common/types.ts b/src/models/Common/types.ts index 92765a352..2b29ebd4b 100644 --- a/src/models/Common/types.ts +++ b/src/models/Common/types.ts @@ -20,6 +20,10 @@ export interface Identifier extends Core.IIdentifier { export interface NamedEntityIdentifier extends RequiredNonNullable {} +export interface ResourceIdentifier extends NamedEntityIdentifier { + resourceType: Core.ResourceType; +} + export interface NamedEntityMetadata extends RequiredNonNullable {} diff --git a/src/models/Execution/api.ts b/src/models/Execution/api.ts index 400c2055b..0786ae03e 100644 --- a/src/models/Execution/api.ts +++ b/src/models/Execution/api.ts @@ -89,6 +89,7 @@ export interface CreateWorkflowExecutionArguments { inputs: Core.ILiteralMap; launchPlanId: Identifier; project: string; + referenceExecutionId?: WorkflowExecutionIdentifier; } /** Submits a request to create a new `WorkflowExecution` using the provided * LaunchPlan and input values. @@ -98,7 +99,8 @@ export const createWorkflowExecution = ( domain, inputs, launchPlanId: launchPlan, - project + project, + referenceExecutionId: referenceExecution }: CreateWorkflowExecutionArguments, config?: RequestConfig ) => @@ -113,7 +115,10 @@ export const createWorkflowExecution = ( spec: { inputs, launchPlan, - metadata: { principal: defaultExecutionPrincipal } + metadata: { + referenceExecution, + principal: defaultExecutionPrincipal + } } }, path: endpointPrefixes.execution, diff --git a/src/models/Execution/types.ts b/src/models/Execution/types.ts index 759641440..89244bd06 100644 --- a/src/models/Execution/types.ts +++ b/src/models/Execution/types.ts @@ -42,6 +42,7 @@ export interface ExecutionMetadata extends Admin.IExecutionMetadata { mode: ExecutionMode; principal: string; nesting: number; + referenceExecution?: WorkflowExecutionIdentifier; parentNodeExecution?: NodeExecutionIdentifier; } diff --git a/src/models/__mocks__/simpleTaskClosure.json b/src/models/__mocks__/simpleTaskClosure.json new file mode 100644 index 000000000..479ea94ab --- /dev/null +++ b/src/models/__mocks__/simpleTaskClosure.json @@ -0,0 +1,69 @@ +{ + "compiledTask": { + "template": { + "id": { + "resource_type": "TASK", + "project": "myflyteproject", + "domain": "development", + "name": "work-find-odd-numbers", + "version": "ABC123" + }, + "type": "python-task", + "metadata": { + "runtime": { + "type": "FlyteSDK", + "version": "0.0.1a0", + "flavor": "python" + }, + "timeout": "0s", + "retries": {}, + "discovery_version": "1" + }, + "interface": { + "inputs": { + "variables": { + "list_of_nums": { + "type": { + "collection_type": { + "simple": "INTEGER" + } + } + } + } + }, + "outputs": { + "variables": { + "are_num_odd": { + "type": { + "collection_type": { + "simple": "BOOLEAN" + } + } + } + } + } + }, + "container": { + "image": "myflyteproject:DEF123", + "command": ["pyflyte-execute"], + "args": [ + "--task-module", + "work", + "--task-name", + "find_odd_numbers", + "--inputs", + "{{.input}}", + "--output-prefix", + "{{.outputPrefix}}" + ], + "resources": {}, + "env": [ + { + "key": "FLYTE_CONFIGURATION_PATH", + "value": "/myflyteproject/flytekit.config" + } + ] + } + } + } +} diff --git a/src/models/__mocks__/taskData.ts b/src/models/__mocks__/taskData.ts new file mode 100644 index 000000000..7c9f9a345 --- /dev/null +++ b/src/models/__mocks__/taskData.ts @@ -0,0 +1,43 @@ +import { getCacheKey } from 'components/Cache'; +import { Admin } from 'flyteidl'; +import { cloneDeep } from 'lodash'; +import { Identifier } from '../Common'; +import { Task, TaskClosure } from '../Task'; +import * as simpleClosure from './simpleTaskClosure.json'; + +const decodedClosure = Admin.TaskClosure.create( + (simpleClosure as unknown) as Admin.ITaskClosure +) as TaskClosure; + +const taskId: (name: string, version: string) => Identifier = ( + name, + version +) => ({ + name, + version, + project: 'flyte', + domain: 'development' +}); + +export const createMockTask: (name: string, version?: string) => Task = ( + name: string, + version: string = 'abcdefg' +) => ({ + id: taskId(name, version), + closure: createMockTaskClosure() +}); + +export const createMockTaskClosure: () => TaskClosure = () => + cloneDeep(decodedClosure); + +export const createMockTasks: Fn = () => [ + createMockTask('task1'), + createMockTask('task2'), + createMockTask('task3') +]; + +export const createMockTaskVersions = (name: string, length: number) => { + return Array.from({ length }, (_, idx) => { + return createMockTask(name, getCacheKey({ idx })); + }); +}; diff --git a/src/routes/ApplicationRouter.tsx b/src/routes/ApplicationRouter.tsx index 2c4b47ef0..5d9dfb7c4 100644 --- a/src/routes/ApplicationRouter.tsx +++ b/src/routes/ApplicationRouter.tsx @@ -44,6 +44,10 @@ export const ApplicationRouter: React.FC<{}> = () => ( { detailsPanel: true } )} /> + = 8" -"@octokit/types@^5.0.0", "@octokit/types@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-5.0.1.tgz#5459e9a5e9df8565dcc62c17a34491904d71971e" - integrity sha512-GorvORVwp244fGKEt3cgt/P+M0MGy4xEDbckw+K5ojEezxyMDgCaYPKVct+/eWQfZXOT7uq0xRpmrl/+hliabA== +"@octokit/types@^5.0.0", "@octokit/types@^5.0.1", "@octokit/types@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-5.5.0.tgz#e5f06e8db21246ca102aa28444cdb13ae17a139b" + integrity sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ== dependencies: "@types/node" ">= 8" @@ -2067,7 +2150,7 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= -"@reach/router@^1.2.1": +"@reach/router@^1.2.1", "@reach/router@^1.3.3": version "1.3.4" resolved "https://registry.yarnpkg.com/@reach/router/-/router-1.3.4.tgz#d2574b19370a70c80480ed91f3da840136d10f8c" integrity sha512-+mtn9wjlB9NN2CNnnC/BRYtwdKBfSyyasPYraNAyvaV1occr/5NnB4CVzjEZipNHwYebQwcndGUmpFzxAUoqSA== @@ -2078,9 +2161,9 @@ react-lifecycles-compat "^3.0.4" "@samverschueren/stream-to-observable@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" - integrity sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg== + version "0.3.1" + resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz#a21117b19ee9be70c379ec1877537ef2e1c63301" + integrity sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ== dependencies: any-observable "^0.3.0" @@ -2127,9 +2210,9 @@ p-reduce "^2.0.0" "@semantic-release/github@^7.0.0", "@semantic-release/github@^7.0.5": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-7.0.7.tgz#e3999b06433d08871acd68ecec2b4e212c05d09f" - integrity sha512-Sai2UucYQ+5rJzKVEVJ4eiZNDdoo0/CzfpValBdeU5h97uJE7t4CoBTmUWkiXlPOx46CSw1+JhI+PHC1PUxVZw== + version "7.1.1" + resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-7.1.1.tgz#e998aa9a9cd770838d9f27c64f060c2b686b9d95" + integrity sha512-w8CLCvGVKNe2FPOYQ68OFxFVNNha7YRzptnwTZYdjXYtgTDKw0XVfnMSd9NlJeQPYGfQmIhIVPNBU/cA6zUY0A== dependencies: "@octokit/rest" "^17.0.0" "@semantic-release/error" "^2.2.0" @@ -2149,9 +2232,9 @@ url-join "^4.0.0" "@semantic-release/npm@^7.0.0", "@semantic-release/npm@^7.0.5": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@semantic-release/npm/-/npm-7.0.5.tgz#61c45691abb863f6939cca6aac958d3c22508632" - integrity sha512-D+oEmsx9aHE1q806NFQwSC9KdBO8ri/VO99eEz0wWbX2jyLqVyWr7t0IjKC8aSnkkQswg/4KN/ZjfF6iz1XOpw== + version "7.0.6" + resolved "https://registry.yarnpkg.com/@semantic-release/npm/-/npm-7.0.6.tgz#1301bd57d246eae048d7104a735467bb0829f3d8" + integrity sha512-F4judxdeLe8f7+vDva1TkqNc5Tb2tcltZYW0tLtvP2Xt7CD/gGiz7UxAWEOPsXBvIqAP+uTidvGLPl9U3/uRoQ== dependencies: "@semantic-release/error" "^2.2.0" aggregate-error "^3.0.0" @@ -2160,7 +2243,7 @@ lodash "^4.17.15" nerf-dart "^1.0.0" normalize-url "^5.0.0" - npm "^6.10.3" + npm "^6.13.0" rc "^1.2.8" read-pkg "^5.0.0" registry-auth-token "^4.0.0" @@ -2184,9 +2267,9 @@ read-pkg-up "^7.0.0" "@sinonjs/commons@^1.7.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.0.tgz#c8d68821a854c555bba172f3b06959a0039b236d" - integrity sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q== + version "1.8.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217" + integrity sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw== dependencies: type-detect "4.0.8" @@ -2211,21 +2294,21 @@ uuid "^3.3.2" "@storybook/addon-knobs@*": - version "5.3.19" - resolved "https://registry.yarnpkg.com/@storybook/addon-knobs/-/addon-knobs-5.3.19.tgz#b2483e401e2dca6390e1c0a81801130a0b515efb" - integrity sha512-e7z6KhvVOUGjygK4VL5Un1U3t0XG0jkb/BOHVWQMtH5dWNn3zofD3LrZZy24eAsyre/ej/LGo/BzwDSXkKLTog== - dependencies: - "@storybook/addons" "5.3.19" - "@storybook/api" "5.3.19" - "@storybook/client-api" "5.3.19" - "@storybook/components" "5.3.19" - "@storybook/core-events" "5.3.19" - "@storybook/theming" "5.3.19" - "@types/react-color" "^3.0.1" + version "6.0.22" + resolved "https://registry.yarnpkg.com/@storybook/addon-knobs/-/addon-knobs-6.0.22.tgz#c14f0c46317d417774446f77b1de57bb01e45031" + integrity sha512-y5p92f7IVOxQ/5rJnMB/BuzwNXbdtfJhV7hvBjW8OS4E95EW+HXe7+gNOE2uEbALZZbBHX43H8lYlB+QoyZXcA== + dependencies: + "@storybook/addons" "6.0.22" + "@storybook/api" "6.0.22" + "@storybook/channels" "6.0.22" + "@storybook/client-api" "6.0.22" + "@storybook/components" "6.0.22" + "@storybook/core-events" "6.0.22" + "@storybook/theming" "6.0.22" copy-to-clipboard "^3.0.8" core-js "^3.0.1" escape-html "^1.0.3" - fast-deep-equal "^2.0.1" + fast-deep-equal "^3.1.1" global "^4.3.2" lodash "^4.17.15" prop-types "^15.7.2" @@ -2233,6 +2316,7 @@ react-color "^2.17.0" react-lifecycles-compat "^3.0.4" react-select "^3.0.8" + regenerator-runtime "^0.13.3" "@storybook/addon-knobs@5.1.10": version "5.1.10" @@ -2281,18 +2365,20 @@ global "^4.3.2" util-deprecate "^1.0.2" -"@storybook/addons@5.3.19": - version "5.3.19" - resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-5.3.19.tgz#3a7010697afd6df9a41b8c8a7351d9a06ff490a4" - integrity sha512-Ky/k22p6i6FVNvs1VhuFyGvYJdcp+FgXqFgnPyY/OXJW/vPDapdElpTpHJZLFI9I2FQBDcygBPU5RXkumQ+KUQ== - dependencies: - "@storybook/api" "5.3.19" - "@storybook/channels" "5.3.19" - "@storybook/client-logger" "5.3.19" - "@storybook/core-events" "5.3.19" +"@storybook/addons@6.0.22": + version "6.0.22" + resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-6.0.22.tgz#90958365dcd16cd1f71dcf1f7497c6554293b6a5" + integrity sha512-D7GfOZ16DAyIUoNXY/aisKlXxHlk61XDIAvN102n/GGrmiNQhCKO2cuwjrmpqQGIXW/+QAsc0YUUAptEKpw9vw== + dependencies: + "@storybook/api" "6.0.22" + "@storybook/channels" "6.0.22" + "@storybook/client-logger" "6.0.22" + "@storybook/core-events" "6.0.22" + "@storybook/router" "6.0.22" + "@storybook/theming" "6.0.22" core-js "^3.0.1" global "^4.3.2" - util-deprecate "^1.0.2" + regenerator-runtime "^0.13.3" "@storybook/api@5.1.10": version "5.1.10" @@ -2343,30 +2429,30 @@ telejson "^3.2.0" util-deprecate "^1.0.2" -"@storybook/api@5.3.19": - version "5.3.19" - resolved "https://registry.yarnpkg.com/@storybook/api/-/api-5.3.19.tgz#77f15e9e2eee59fe1ddeaba1ef39bc34713a6297" - integrity sha512-U/VzDvhNCPmw2igvJYNNM+uwJCL+3teiL6JmuoL4/cmcqhI6IqqG9dZmMP1egoCd19wXEP7rnAfB/VcYVg41dQ== +"@storybook/api@6.0.22": + version "6.0.22" + resolved "https://registry.yarnpkg.com/@storybook/api/-/api-6.0.22.tgz#ef6bbb4f06036cf09bb355fc5fd41d16ead37e23" + integrity sha512-GfGRXAe0h5cFTwJUJ7XqhaaE4+aXk/f+QCWfuUQkipUsGhGL+KLY80OU5cqC7LDB2nbhZ2bKUaLCzXu1Qsw5pw== dependencies: - "@reach/router" "^1.2.1" - "@storybook/channels" "5.3.19" - "@storybook/client-logger" "5.3.19" - "@storybook/core-events" "5.3.19" + "@reach/router" "^1.3.3" + "@storybook/channels" "6.0.22" + "@storybook/client-logger" "6.0.22" + "@storybook/core-events" "6.0.22" "@storybook/csf" "0.0.1" - "@storybook/router" "5.3.19" - "@storybook/theming" "5.3.19" - "@types/reach__router" "^1.2.3" + "@storybook/router" "6.0.22" + "@storybook/semver" "^7.3.2" + "@storybook/theming" "6.0.22" + "@types/reach__router" "^1.3.5" core-js "^3.0.1" - fast-deep-equal "^2.0.1" + fast-deep-equal "^3.1.1" global "^4.3.2" lodash "^4.17.15" memoizerific "^1.11.3" - prop-types "^15.6.2" react "^16.8.3" - semver "^6.0.0" - shallow-equal "^1.1.0" + regenerator-runtime "^0.13.3" store2 "^2.7.1" - telejson "^3.2.0" + telejson "^5.0.2" + ts-dedent "^1.1.1" util-deprecate "^1.0.2" "@storybook/channel-postmessage@5.3.12": @@ -2380,16 +2466,18 @@ global "^4.3.2" telejson "^3.2.0" -"@storybook/channel-postmessage@5.3.19": - version "5.3.19" - resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-5.3.19.tgz#ef9fe974c2a529d89ce342ff7acf5cc22805bae9" - integrity sha512-Iq0f4NPHR0UVVFCWt0cI7Myadk4/SATXYJPT6sv95KhnLjKEeYw571WBlThfp8a9FM80887xG+eIRe93c8dleA== +"@storybook/channel-postmessage@6.0.22": + version "6.0.22" + resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-6.0.22.tgz#0a928d25fe3b87340e5670e897dc8fa4ee6ca6df" + integrity sha512-Upa2rG9H65MPdVxT9pNeDL9VlX5VeP7bpvR/TTEf2cRCiq6SC93pAs45XPWBcD8Jhq3p5+uFDARKReb2iF49+w== dependencies: - "@storybook/channels" "5.3.19" - "@storybook/client-logger" "5.3.19" + "@storybook/channels" "6.0.22" + "@storybook/client-logger" "6.0.22" + "@storybook/core-events" "6.0.22" core-js "^3.0.1" global "^4.3.2" - telejson "^3.2.0" + qs "^6.6.0" + telejson "^5.0.2" "@storybook/channels@5.1.10": version "5.1.10" @@ -2405,12 +2493,14 @@ dependencies: core-js "^3.0.1" -"@storybook/channels@5.3.19": - version "5.3.19" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-5.3.19.tgz#65ad7cd19d70aa5eabbb2e5e39ceef5e510bcb7f" - integrity sha512-38seaeyshRGotTEZJppyYMg/Vx2zRKgFv1L6uGqkJT0LYoNSYtJhsiNFCJ2/KUJu2chAJ/j8h80bpVBVLQ/+WA== +"@storybook/channels@6.0.22": + version "6.0.22" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-6.0.22.tgz#4cdfee7c1581462ec872b310917003c9e4dc7224" + integrity sha512-d/RlPFDq9NXA/Y3CVDsSVsWgvYiiiifxQN9hz5+y3T6MnRJPEfAPWYkbv+wLixWbDF2ULzjQHp4zcfTm6T7A4w== dependencies: core-js "^3.0.1" + ts-dedent "^1.1.1" + util-deprecate "^1.0.2" "@storybook/client-api@5.1.10": version "5.1.10" @@ -2453,27 +2543,27 @@ ts-dedent "^1.1.0" util-deprecate "^1.0.2" -"@storybook/client-api@5.3.19": - version "5.3.19" - resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-5.3.19.tgz#7a5630bb8fffb92742b1773881e9004ee7fdf8e0" - integrity sha512-Dh8ZLrLH91j9Fa28Gmp0KFUvvgK348aNMrDNAUdj4m4witz/BWQ2pxz6qq9/xFVErk/GanVC05kazGElqgYCRQ== +"@storybook/client-api@6.0.22": + version "6.0.22" + resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-6.0.22.tgz#b6079d376b49eb23b69661474446ed402bdef235" + integrity sha512-GP9m1LW3C79EJxTGToCvBZDEApMRCl9tVXGfB9yEB0dIFC9jTwsPfpwjnhh2Imp9xJjszahSqxkhv4rAZ8C44Q== dependencies: - "@storybook/addons" "5.3.19" - "@storybook/channel-postmessage" "5.3.19" - "@storybook/channels" "5.3.19" - "@storybook/client-logger" "5.3.19" - "@storybook/core-events" "5.3.19" + "@storybook/addons" "6.0.22" + "@storybook/channel-postmessage" "6.0.22" + "@storybook/channels" "6.0.22" + "@storybook/client-logger" "6.0.22" + "@storybook/core-events" "6.0.22" "@storybook/csf" "0.0.1" - "@types/webpack-env" "^1.15.0" + "@types/qs" "^6.9.0" + "@types/webpack-env" "^1.15.2" core-js "^3.0.1" - eventemitter3 "^4.0.0" global "^4.3.2" - is-plain-object "^3.0.0" lodash "^4.17.15" memoizerific "^1.11.3" qs "^6.6.0" stable "^0.1.8" - ts-dedent "^1.1.0" + store2 "^2.7.1" + ts-dedent "^1.1.1" util-deprecate "^1.0.2" "@storybook/client-logger@5.1.10": @@ -2490,12 +2580,13 @@ dependencies: core-js "^3.0.1" -"@storybook/client-logger@5.3.19": - version "5.3.19" - resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-5.3.19.tgz#fbbd186e82102eaca1d6a5cca640271cae862921" - integrity sha512-nHftT9Ow71YgAd2/tsu79kwKk30mPuE0sGRRUHZVyCRciGFQweKNOS/6xi2Aq+WwBNNjPKNlbgxwRt1yKe1Vkg== +"@storybook/client-logger@6.0.22": + version "6.0.22" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-6.0.22.tgz#4e4b2c40b708b500611d5e207099a4e46e825590" + integrity sha512-AQD2Zz7BIIwrP0/sNZMXgP/BEZo5qK1YPDl2mPppSJdFocVCYDlc6HgYPZZHtPvD5BVWAENg2NQoGBOivuMl3g== dependencies: core-js "^3.0.1" + global "^4.3.2" "@storybook/components@5.1.10": version "5.1.10" @@ -2548,32 +2639,33 @@ simplebar-react "^1.0.0-alpha.6" ts-dedent "^1.1.0" -"@storybook/components@5.3.19": - version "5.3.19" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-5.3.19.tgz#aac1f9eea1247cc85bd93b10fca803876fb84a6b" - integrity sha512-3g23/+ktlocaHLJKISu9Neu3XKa6aYP2ctDYkRtGchSB0Q55hQsUVGO+BEVuT7Pk2D59mVCxboBjxcRoPUY4pw== +"@storybook/components@6.0.22": + version "6.0.22" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-6.0.22.tgz#07b0804fb9b39787967be88d435540adddce328d" + integrity sha512-sc7O4djNLajyJdVY4dUSO73L/+VM8IyzYKK9c5kSw4pN+l6M3EUBi4Zt/jdQc+WxSBmmriSe7aBOKrOSxBBSiA== dependencies: - "@storybook/client-logger" "5.3.19" - "@storybook/theming" "5.3.19" + "@storybook/client-logger" "6.0.22" + "@storybook/csf" "0.0.1" + "@storybook/theming" "6.0.22" + "@types/overlayscrollbars" "^1.9.0" + "@types/react-color" "^3.0.1" "@types/react-syntax-highlighter" "11.0.4" - "@types/react-textarea-autosize" "^4.3.3" core-js "^3.0.1" + fast-deep-equal "^3.1.1" global "^4.3.2" lodash "^4.17.15" markdown-to-jsx "^6.11.4" memoizerific "^1.11.3" - polished "^3.3.1" + overlayscrollbars "^1.10.2" + polished "^3.4.4" popper.js "^1.14.7" - prop-types "^15.7.2" react "^16.8.3" + react-color "^2.17.0" react-dom "^16.8.3" - react-focus-lock "^2.1.0" - react-helmet-async "^1.0.2" - react-popper-tooltip "^2.8.3" - react-syntax-highlighter "^11.0.2" - react-textarea-autosize "^7.1.0" - simplebar-react "^1.0.0-alpha.6" - ts-dedent "^1.1.0" + react-popper-tooltip "^2.11.0" + react-syntax-highlighter "^12.2.1" + react-textarea-autosize "^8.1.1" + ts-dedent "^1.1.1" "@storybook/core-events@5.1.10": version "5.1.10" @@ -2589,10 +2681,10 @@ dependencies: core-js "^3.0.1" -"@storybook/core-events@5.3.19": - version "5.3.19" - resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-5.3.19.tgz#18020cd52e0d8ef0973a8e9622a10d5f99796f79" - integrity sha512-lh78ySqMS7pDdMJAQAe35d1I/I4yPTqp09Cq0YIYOxx9BQZhah4DZTV1QIZt22H5p2lPb5MWLkWSxBaexZnz8A== +"@storybook/core-events@6.0.22": + version "6.0.22" + resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-6.0.22.tgz#1bbdef9d50cea628f6f761117b6ddb9927caebf8" + integrity sha512-XQplzZwC9o4OQbKPjBruIOSFGto6qtmIAuh94NaHB6Hpv8YpsDwy1fXxEr990fj/5bOXmL4YV3x1AD6fOK/1sA== dependencies: core-js "^3.0.1" @@ -2675,53 +2767,78 @@ webpack-hot-middleware "^2.25.0" webpack-virtual-modules "^0.2.0" -"@storybook/core@5.3.19": - version "5.3.19" - resolved "https://registry.yarnpkg.com/@storybook/core/-/core-5.3.19.tgz#1e61f35c5148343a0c580f5d5efb77f3b4243a30" - integrity sha512-4EYzglqb1iD6x9gxtAYpRGwGP6qJGiU2UW4GiYrErEmeu6y6tkyaqW5AwGlIo9+6jAfwD0HjaK8afvjKTtmmMQ== +"@storybook/core@6.0.22": + version "6.0.22" + resolved "https://registry.yarnpkg.com/@storybook/core/-/core-6.0.22.tgz#3ea911f486bbf5918976f0101627057af58d2f34" + integrity sha512-VgzybAKw5Jd5HzpVukvKLj2ScZ8bzJAvhoFAab3zegNyk1bK+qUK8vYDWP5dzaINvW63zA/D5kyjfZP8T9EofQ== dependencies: - "@babel/plugin-proposal-class-properties" "^7.7.0" - "@babel/plugin-proposal-object-rest-spread" "^7.6.2" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - "@babel/plugin-transform-react-constant-elements" "^7.2.0" - "@babel/preset-env" "^7.4.5" - "@storybook/addons" "5.3.19" - "@storybook/channel-postmessage" "5.3.19" - "@storybook/client-api" "5.3.19" - "@storybook/client-logger" "5.3.19" - "@storybook/core-events" "5.3.19" + "@babel/plugin-proposal-class-properties" "^7.8.3" + "@babel/plugin-proposal-decorators" "^7.8.3" + "@babel/plugin-proposal-export-default-from" "^7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.1" + "@babel/plugin-proposal-object-rest-spread" "^7.9.6" + "@babel/plugin-proposal-optional-chaining" "^7.10.1" + "@babel/plugin-proposal-private-methods" "^7.8.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.8.3" + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@babel/plugin-transform-classes" "^7.9.5" + "@babel/plugin-transform-destructuring" "^7.9.5" + "@babel/plugin-transform-for-of" "^7.9.0" + "@babel/plugin-transform-parameters" "^7.9.5" + "@babel/plugin-transform-shorthand-properties" "^7.8.3" + "@babel/plugin-transform-spread" "^7.8.3" + "@babel/plugin-transform-template-literals" "^7.8.3" + "@babel/preset-env" "^7.9.6" + "@babel/preset-react" "^7.8.3" + "@babel/preset-typescript" "^7.9.0" + "@babel/register" "^7.10.5" + "@storybook/addons" "6.0.22" + "@storybook/api" "6.0.22" + "@storybook/channel-postmessage" "6.0.22" + "@storybook/channels" "6.0.22" + "@storybook/client-api" "6.0.22" + "@storybook/client-logger" "6.0.22" + "@storybook/components" "6.0.22" + "@storybook/core-events" "6.0.22" "@storybook/csf" "0.0.1" - "@storybook/node-logger" "5.3.19" - "@storybook/router" "5.3.19" - "@storybook/theming" "5.3.19" - "@storybook/ui" "5.3.19" + "@storybook/node-logger" "6.0.22" + "@storybook/router" "6.0.22" + "@storybook/semver" "^7.3.2" + "@storybook/theming" "6.0.22" + "@storybook/ui" "6.0.22" + "@types/glob-base" "^0.3.0" + "@types/micromatch" "^4.0.1" + "@types/node-fetch" "^2.5.4" airbnb-js-shims "^2.2.1" ansi-to-html "^0.6.11" autoprefixer "^9.7.2" - babel-plugin-add-react-displayname "^0.0.5" + babel-loader "^8.0.6" babel-plugin-emotion "^10.0.20" - babel-plugin-macros "^2.7.0" + babel-plugin-macros "^2.8.0" babel-preset-minify "^0.5.0 || 0.6.0-alpha.5" + better-opn "^2.0.0" boxen "^4.1.0" case-sensitive-paths-webpack-plugin "^2.2.0" - chalk "^3.0.0" - cli-table3 "0.5.1" - commander "^4.0.1" + chalk "^4.0.0" + cli-table3 "0.6.0" + commander "^5.0.0" core-js "^3.0.1" - corejs-upgrade-webpack-plugin "^2.2.0" - css-loader "^3.0.0" + css-loader "^3.5.3" detect-port "^1.3.0" dotenv-webpack "^1.7.0" - ejs "^2.7.4" + ejs "^3.1.2" express "^4.17.0" - file-loader "^4.2.0" + file-loader "^6.0.0" file-system-cache "^1.0.5" - find-cache-dir "^3.0.0" find-up "^4.1.0" - fs-extra "^8.0.1" + fork-ts-checker-webpack-plugin "^4.1.4" + fs-extra "^9.0.0" + glob "^7.1.6" glob-base "^0.3.0" + glob-promise "^3.4.0" global "^4.3.2" - html-webpack-plugin "^4.0.0-beta.2" + html-webpack-plugin "^4.2.1" inquirer "^7.0.0" interpret "^2.0.0" ip "^1.1.5" @@ -2729,30 +2846,29 @@ lazy-universal-dotenv "^3.0.1" micromatch "^4.0.2" node-fetch "^2.6.0" - open "^7.0.0" - pnp-webpack-plugin "1.5.0" + pkg-dir "^4.2.0" + pnp-webpack-plugin "1.6.4" postcss-flexbugs-fixes "^4.1.0" postcss-loader "^3.0.0" pretty-hrtime "^1.0.3" qs "^6.6.0" - raw-loader "^3.1.0" - react-dev-utils "^9.0.0" + raw-loader "^4.0.1" + react-dev-utils "^10.0.0" regenerator-runtime "^0.13.3" - resolve "^1.11.0" resolve-from "^5.0.0" - semver "^6.0.0" serve-favicon "^2.5.0" shelljs "^0.8.3" - style-loader "^1.0.0" - terser-webpack-plugin "^2.1.2" - ts-dedent "^1.1.0" + stable "^0.1.8" + style-loader "^1.2.1" + terser-webpack-plugin "^3.0.0" + ts-dedent "^1.1.1" unfetch "^4.1.0" - url-loader "^2.0.1" + url-loader "^4.0.0" util-deprecate "^1.0.2" - webpack "^4.33.0" + webpack "^4.43.0" webpack-dev-middleware "^3.7.0" webpack-hot-middleware "^2.25.0" - webpack-virtual-modules "^0.2.0" + webpack-virtual-modules "^0.2.2" "@storybook/csf@0.0.1": version "0.0.1" @@ -2773,44 +2889,42 @@ pretty-hrtime "^1.0.3" regenerator-runtime "^0.13.3" -"@storybook/node-logger@5.3.19": - version "5.3.19" - resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-5.3.19.tgz#c414e4d3781aeb06298715220012f552a36dff29" - integrity sha512-hKshig/u5Nj9fWy0OsyU04yqCxr0A9pydOHIassr4fpLAaePIN2YvqCqE2V+TxQHjZUnowSSIhbXrGt0DI5q2A== +"@storybook/node-logger@6.0.22": + version "6.0.22" + resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-6.0.22.tgz#a95bb605309baf6bd768fa57dff77760f41c7f10" + integrity sha512-H5j0zjMmg6o+wQgiY1GWlgz6cciHJN5vw7/B/hUksMHOwc+30nrGa89dDouj2ze1vJfiY3AaOMrsgtuMYFXaHQ== dependencies: "@types/npmlog" "^4.1.2" - chalk "^3.0.0" + chalk "^4.0.0" core-js "^3.0.1" npmlog "^4.1.2" pretty-hrtime "^1.0.3" - regenerator-runtime "^0.13.3" "@storybook/react@*": - version "5.3.19" - resolved "https://registry.yarnpkg.com/@storybook/react/-/react-5.3.19.tgz#ad7e7a5538399e2794cdb5a1b844a2b77c10bd09" - integrity sha512-OBRUqol3YLQi/qE55x2pWkv4YpaAmmfj6/Km+7agx+og+oNQl0nnlXy7r27X/4j3ERczzURa5pJHtSjwiNaJNw== + version "6.0.22" + resolved "https://registry.yarnpkg.com/@storybook/react/-/react-6.0.22.tgz#64ff401194d7be62d238f766b47e85d7f170e4d1" + integrity sha512-sErMo8+KxuELTbx4VboAYEsgDEXXio1Tqmp1jfLoUhXIvQtcfbT9DrtwOoR4mixf7LwISuLikorTyOL+Z6Vg3g== dependencies: - "@babel/plugin-transform-react-constant-elements" "^7.6.3" "@babel/preset-flow" "^7.0.0" "@babel/preset-react" "^7.0.0" - "@storybook/addons" "5.3.19" - "@storybook/core" "5.3.19" - "@storybook/node-logger" "5.3.19" - "@svgr/webpack" "^4.0.3" - "@types/webpack-env" "^1.15.0" + "@storybook/addons" "6.0.22" + "@storybook/core" "6.0.22" + "@storybook/node-logger" "6.0.22" + "@storybook/semver" "^7.3.2" + "@svgr/webpack" "^5.4.0" + "@types/webpack-env" "^1.15.2" babel-plugin-add-react-displayname "^0.0.5" babel-plugin-named-asset-import "^0.3.1" - babel-plugin-react-docgen "^4.0.0" + babel-plugin-react-docgen "^4.1.0" core-js "^3.0.1" global "^4.3.2" lodash "^4.17.15" - mini-css-extract-plugin "^0.7.0" prop-types "^15.7.2" - react-dev-utils "^9.0.0" + react-dev-utils "^10.0.0" + react-docgen-typescript-plugin "^0.5.2" regenerator-runtime "^0.13.3" - semver "^6.0.0" - ts-dedent "^1.1.0" - webpack "^4.33.0" + ts-dedent "^1.1.1" + webpack "^4.43.0" "@storybook/react@5.3.12": version "5.3.12" @@ -2865,20 +2979,25 @@ qs "^6.6.0" util-deprecate "^1.0.2" -"@storybook/router@5.3.19": - version "5.3.19" - resolved "https://registry.yarnpkg.com/@storybook/router/-/router-5.3.19.tgz#0f783b85658f99e4007f74347ad7ef17dbf7fc3a" - integrity sha512-yNClpuP7BXQlBTRf6Ggle3/R349/k6kvI5Aim4jf6X/2cFVg2pzBXDAF41imNm9PcvdxwabQLm6I48p7OvKr/w== +"@storybook/router@6.0.22": + version "6.0.22" + resolved "https://registry.yarnpkg.com/@storybook/router/-/router-6.0.22.tgz#90dc8eb5c766b85b555cc103ac6197d7c11700be" + integrity sha512-Gu3PmWXaDDhDqTY/S8/ag2OCdTb0S+aD/QkXvQzSht5gt5d8M2tQxBlhXDVFNhYGRz7zQtjRmTxqT/3YX9tjrg== dependencies: - "@reach/router" "^1.2.1" - "@storybook/csf" "0.0.1" - "@types/reach__router" "^1.2.3" + "@reach/router" "^1.3.3" + "@types/reach__router" "^1.3.5" core-js "^3.0.1" global "^4.3.2" - lodash "^4.17.15" memoizerific "^1.11.3" qs "^6.6.0" - util-deprecate "^1.0.2" + +"@storybook/semver@^7.3.2": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@storybook/semver/-/semver-7.3.2.tgz#f3b9c44a1c9a0b933c04e66d0048fcf2fa10dac0" + integrity sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg== + dependencies: + core-js "^3.6.5" + find-up "^4.1.0" "@storybook/theming@5.1.10": version "5.1.10" @@ -2916,23 +3035,23 @@ resolve-from "^5.0.0" ts-dedent "^1.1.0" -"@storybook/theming@5.3.19": - version "5.3.19" - resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-5.3.19.tgz#177d9819bd64f7a1a6ea2f1920ffa5baf9a5f467" - integrity sha512-ecG+Rq3hc1GOzKHamYnD4wZ0PEP9nNg0mXbC3RhbxfHj+pMMCWWmx9B2Uu75SL1PTT8WcfkFO0hU/0IO84Pzlg== +"@storybook/theming@6.0.22": + version "6.0.22" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-6.0.22.tgz#c50877d19c9807cc35655d78f8b5c866b861b853" + integrity sha512-aR11z70vq0G+F61PIJHW1Kt1lmA2vYxGWF1TL6rsECXNt4fN+X9ig082G0Uhag0mV/FJZdKhhpv360paJFYF2g== dependencies: "@emotion/core" "^10.0.20" + "@emotion/is-prop-valid" "^0.8.6" "@emotion/styled" "^10.0.17" - "@storybook/client-logger" "5.3.19" + "@storybook/client-logger" "6.0.22" core-js "^3.0.1" deep-object-diff "^1.1.0" emotion-theming "^10.0.19" global "^4.3.2" memoizerific "^1.11.3" - polished "^3.3.1" - prop-types "^15.7.2" + polished "^3.4.4" resolve-from "^5.0.0" - ts-dedent "^1.1.0" + ts-dedent "^1.1.1" "@storybook/ui@5.3.12": version "5.3.12" @@ -2974,32 +3093,32 @@ telejson "^3.2.0" util-deprecate "^1.0.2" -"@storybook/ui@5.3.19": - version "5.3.19" - resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-5.3.19.tgz#ac03b67320044a3892ee784111d4436b61874332" - integrity sha512-r0VxdWab49nm5tzwvveVDnsHIZHMR76veYOu/NHKDUZ5hnQl1LMG1YyMCFFa7KiwD/OrZxRWr6/Ma7ep9kR4Gw== +"@storybook/ui@6.0.22": + version "6.0.22" + resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-6.0.22.tgz#f8aa93c66e66e99010d98a7344adf1c7a9839224" + integrity sha512-iueyQ3EnLHhbV6xWQWMoN1aenEh3jLAXFmabxrf1s/l0JKn0u6qr7BHZcu3VZJ4EJCEsh6wDFNWjaUbTpfDU5g== dependencies: "@emotion/core" "^10.0.20" - "@storybook/addons" "5.3.19" - "@storybook/api" "5.3.19" - "@storybook/channels" "5.3.19" - "@storybook/client-logger" "5.3.19" - "@storybook/components" "5.3.19" - "@storybook/core-events" "5.3.19" - "@storybook/router" "5.3.19" - "@storybook/theming" "5.3.19" + "@storybook/addons" "6.0.22" + "@storybook/api" "6.0.22" + "@storybook/channels" "6.0.22" + "@storybook/client-logger" "6.0.22" + "@storybook/components" "6.0.22" + "@storybook/core-events" "6.0.22" + "@storybook/router" "6.0.22" + "@storybook/semver" "^7.3.2" + "@storybook/theming" "6.0.22" + "@types/markdown-to-jsx" "^6.11.0" copy-to-clipboard "^3.0.8" core-js "^3.0.1" core-js-pure "^3.0.1" emotion-theming "^10.0.19" - fast-deep-equal "^2.0.1" - fuse.js "^3.4.6" + fuse.js "^3.6.1" global "^4.3.2" lodash "^4.17.15" markdown-to-jsx "^6.11.4" memoizerific "^1.11.3" - polished "^3.3.1" - prop-types "^15.7.2" + polished "^3.4.4" qs "^6.6.0" react "^16.8.3" react-dom "^16.8.3" @@ -3007,53 +3126,90 @@ react-helmet-async "^1.0.2" react-hotkeys "2.0.0" react-sizeme "^2.6.7" - regenerator-runtime "^0.13.2" + regenerator-runtime "^0.13.3" resolve-from "^5.0.0" - semver "^6.0.0" store2 "^2.7.1" - telejson "^3.2.0" - util-deprecate "^1.0.2" "@svgr/babel-plugin-add-jsx-attribute@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz#dadcb6218503532d6884b210e7f3c502caaa44b1" integrity sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig== +"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" + integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== + "@svgr/babel-plugin-remove-jsx-attribute@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz#297550b9a8c0c7337bea12bdfc8a80bb66f85abc" integrity sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ== +"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz#6b2c770c95c874654fd5e1d5ef475b78a0a962ef" + integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== + "@svgr/babel-plugin-remove-jsx-empty-expression@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz#c196302f3e68eab6a05e98af9ca8570bc13131c7" integrity sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w== +"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz#25621a8915ed7ad70da6cea3d0a6dbc2ea933efd" + integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== + "@svgr/babel-plugin-replace-jsx-attribute-value@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz#310ec0775de808a6a2e4fd4268c245fd734c1165" integrity sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w== +"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz#0b221fc57f9fcd10e91fe219e2cd0dd03145a897" + integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== + "@svgr/babel-plugin-svg-dynamic-title@^4.3.3": version "4.3.3" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz#2cdedd747e5b1b29ed4c241e46256aac8110dd93" integrity sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w== +"@svgr/babel-plugin-svg-dynamic-title@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz#139b546dd0c3186b6e5db4fefc26cb0baea729d7" + integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== + "@svgr/babel-plugin-svg-em-dimensions@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz#9a94791c9a288108d20a9d2cc64cac820f141391" integrity sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w== +"@svgr/babel-plugin-svg-em-dimensions@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz#6543f69526632a133ce5cabab965deeaea2234a0" + integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== + "@svgr/babel-plugin-transform-react-native-svg@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz#151487322843359a1ca86b21a3815fd21a88b717" integrity sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw== +"@svgr/babel-plugin-transform-react-native-svg@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz#00bf9a7a73f1cad3948cdab1f8dfb774750f8c80" + integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== + "@svgr/babel-plugin-transform-svg-component@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz#5f1e2f886b2c85c67e76da42f0f6be1b1767b697" integrity sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw== +"@svgr/babel-plugin-transform-svg-component@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.4.0.tgz#a2212b4d018e6075a058bb7e220a66959ef7a03c" + integrity sha512-zLl4Fl3NvKxxjWNkqEcpdSOpQ3LGVH2BNFQ6vjaK6sFo2IrSznrhURIPI0HAphKiiIwNYjAfE0TNoQDSZv0U9A== + "@svgr/babel-preset@^4.3.3": version "4.3.3" resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-4.3.3.tgz#a75d8c2f202ac0e5774e6bfc165d028b39a1316c" @@ -3068,6 +3224,20 @@ "@svgr/babel-plugin-transform-react-native-svg" "^4.2.0" "@svgr/babel-plugin-transform-svg-component" "^4.2.0" +"@svgr/babel-preset@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.4.0.tgz#da21854643e1c4ad2279239baa7d5a8b128c1f15" + integrity sha512-Gyx7cCxua04DBtyILTYdQxeO/pwfTBev6+eXTbVbxe4HTGhOUW6yo7PSbG2p6eJMl44j6XSequ0ZDP7bl0nu9A== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1" + "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0" + "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0" + "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" + "@svgr/babel-plugin-transform-svg-component" "^5.4.0" + "@svgr/core@^4.3.3": version "4.3.3" resolved "https://registry.yarnpkg.com/@svgr/core/-/core-4.3.3.tgz#b37b89d5b757dc66e8c74156d00c368338d24293" @@ -3077,6 +3247,15 @@ camelcase "^5.3.1" cosmiconfig "^5.2.1" +"@svgr/core@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.4.0.tgz#655378ee43679eb94fee3d4e1976e38252dff8e7" + integrity sha512-hWGm1DCCvd4IEn7VgDUHYiC597lUYhFau2lwJBYpQWDirYLkX4OsXu9IslPgJ9UpP7wsw3n2Ffv9sW7SXJVfqQ== + dependencies: + "@svgr/plugin-jsx" "^5.4.0" + camelcase "^6.0.0" + cosmiconfig "^6.0.0" + "@svgr/hast-util-to-babel-ast@^4.3.2": version "4.3.2" resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz#1d5a082f7b929ef8f1f578950238f630e14532b8" @@ -3084,6 +3263,13 @@ dependencies: "@babel/types" "^7.4.4" +"@svgr/hast-util-to-babel-ast@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.4.0.tgz#bb5d002e428f510aa5b53ec0a02377a95b367715" + integrity sha512-+U0TZZpPsP2V1WvVhqAOSTk+N+CjYHdZx+x9UBa1eeeZDXwH8pt0CrQf2+SvRl/h2CAPRFkm+Ey96+jKP8Bsgg== + dependencies: + "@babel/types" "^7.9.5" + "@svgr/plugin-jsx@^4.3.3": version "4.3.3" resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz#e2ba913dbdfbe85252a34db101abc7ebd50992fa" @@ -3094,6 +3280,16 @@ "@svgr/hast-util-to-babel-ast" "^4.3.2" svg-parser "^2.0.0" +"@svgr/plugin-jsx@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.4.0.tgz#ab47504c55615833c6db70fca2d7e489f509787c" + integrity sha512-SGzO4JZQ2HvGRKDzRga9YFSqOqaNrgLlQVaGvpZ2Iht2gwRp/tq+18Pvv9kS9ZqOMYgyix2LLxZMY1LOe9NPqw== + dependencies: + "@babel/core" "^7.7.5" + "@svgr/babel-preset" "^5.4.0" + "@svgr/hast-util-to-babel-ast" "^5.4.0" + svg-parser "^2.0.2" + "@svgr/plugin-svgo@^4.3.1": version "4.3.1" resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz#daac0a3d872e3f55935c6588dd370336865e9e32" @@ -3103,6 +3299,15 @@ merge-deep "^3.0.2" svgo "^1.2.2" +"@svgr/plugin-svgo@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.4.0.tgz#45d9800b7099a6f7b4d85ebac89ab9abe8592f64" + integrity sha512-3Cgv3aYi1l6SHyzArV9C36yo4kgwVdF3zPQUC6/aCDUeXAofDYwE5kk3e3oT5ZO2a0N3lB+lLGvipBG6lnG8EA== + dependencies: + cosmiconfig "^6.0.0" + merge-deep "^3.0.2" + svgo "^1.2.2" + "@svgr/webpack@^4.0.3": version "4.3.3" resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-4.3.3.tgz#13cc2423bf3dff2d494f16b17eb7eacb86895017" @@ -3117,39 +3322,54 @@ "@svgr/plugin-svgo" "^4.3.1" loader-utils "^1.2.3" -"@testing-library/dom@^7.17.1": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.19.0.tgz#35d33bdac587000c4bd19cc73f3c58a05a0f29af" - integrity sha512-t4sIYKGJ8vCi+fEP3f+lnvomvhofHK8xXxhrapiRS8tnP6la9woE+d9hjivviRkwvNFAOAYaN7REKnQf5XCGxg== +"@svgr/webpack@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.4.0.tgz#b68bc86e29cf007292b96ced65f80971175632e0" + integrity sha512-LjepnS/BSAvelnOnnzr6Gg0GcpLmnZ9ThGFK5WJtm1xOqdBE/1IACZU7MMdVzjyUkfFqGz87eRE4hFaSLiUwYg== + dependencies: + "@babel/core" "^7.9.0" + "@babel/plugin-transform-react-constant-elements" "^7.9.0" + "@babel/preset-env" "^7.9.5" + "@babel/preset-react" "^7.9.4" + "@svgr/core" "^5.4.0" + "@svgr/plugin-jsx" "^5.4.0" + "@svgr/plugin-svgo" "^5.4.0" + loader-utils "^2.0.0" + +"@testing-library/dom@^7.22.3": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.24.3.tgz#dae3071463cf28dc7755b43d9cf2202e34cbb85d" + integrity sha512-6eW9fUhEbR423FZvoHRwbWm9RUUByLWGayYFNVvqTnQLYvsNpBS4uEuKH9aqr3trhxFwGVneJUonehL3B1sHJw== dependencies: + "@babel/code-frame" "^7.10.4" "@babel/runtime" "^7.10.3" + "@types/aria-query" "^4.2.0" aria-query "^4.2.2" - dom-accessibility-api "^0.4.5" - pretty-format "^25.5.0" + chalk "^4.1.0" + dom-accessibility-api "^0.5.1" + pretty-format "^26.4.2" "@testing-library/jest-dom@^5.5.0": - version "5.11.0" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.11.0.tgz#1439f08dc85ce7c6d3bbad0ee5d53b2206f55768" - integrity sha512-mhaCySy7dZlyfcxcYy+0jLllODHEiHkVdmwQ00wD0HrWiSx0fSVHz/0WmdlRkvhfSOuqsRsBUreXOtBvruWGQA== + version "5.11.4" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.11.4.tgz#f325c600db352afb92995c2576022b35621ddc99" + integrity sha512-6RRn3epuweBODDIv3dAlWjOEHQLpGJHB2i912VS3JQtsD22+ENInhdDNl4ZZQiViLlIfFinkSET/J736ytV9sw== dependencies: "@babel/runtime" "^7.9.2" "@types/testing-library__jest-dom" "^5.9.1" aria-query "^4.2.2" chalk "^3.0.0" - css "^2.2.4" + css "^3.0.0" css.escape "^1.5.1" - jest-diff "^25.1.0" - jest-matcher-utils "^25.1.0" lodash "^4.17.15" redent "^3.0.0" "@testing-library/react@^10.0.3": - version "10.4.3" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-10.4.3.tgz#c6f356688cffc51f6b35385583d664bb11a161f4" - integrity sha512-A/ydYXcwAcfY7vkPrfUkUTf9HQLL3/GtixTefcu3OyGQtAYQ7XBQj1S9FWbLEhfWa0BLwFwTBFS3Ao1O0tbMJg== + version "10.4.9" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-10.4.9.tgz#9faa29c6a1a217bf8bbb96a28bd29d7a847ca150" + integrity sha512-pHZKkqUy0tmiD81afs8xfiuseXfU/N7rAX3iKjeZYje86t9VaB0LrxYVa+OOsvkrveX5jCK3IjajVn2MbePvqA== dependencies: "@babel/runtime" "^7.10.3" - "@testing-library/dom" "^7.17.1" + "@testing-library/dom" "^7.22.3" "@tootallnate/once@1": version "1.1.2" @@ -3161,10 +3381,15 @@ resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== +"@types/aria-query@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.0.tgz#14264692a9d6e2fa4db3df5e56e94b5e25647ac0" + integrity sha512-iIgQNzCm0v7QMhhe4Jjn9uRh+I6GoPmt03CbEtwx3ao8/EfoQcmgtqH4vQ5Db/lxiIGaWDv6nwvunuh0RyX0+A== + "@types/babel__core@^7.1.7": - version "7.1.9" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" - integrity sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw== + version "7.1.10" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.10.tgz#ca58fc195dd9734e77e57c6f2df565623636ab40" + integrity sha512-x8OM8XzITIMyiwl5Vmo2B1cR1S1Ipkyv4mdlbJjMa1lmuKvKY9FrBbEANIaMlnWn5Rf7uO+rC/VgYabNkE17Hw== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -3173,24 +3398,24 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" - integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== + version "7.6.2" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8" + integrity sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" - integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.3.tgz#b8aaeba0a45caca7b56a5de9459872dde3727214" + integrity sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.12" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.12.tgz#22f49a028e69465390f87bb103ebd61bd086b8f5" - integrity sha512-t4CoEokHTfcyfb4hUaF9oOHu9RmmNWnm1CP0YmMqOOfClKascOmvlEM736vlqeScuGvBDsHkf8R2INd4DWreQA== + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.15.tgz#db9e4238931eb69ef8aab0ad6523d4d4caa39d03" + integrity sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A== dependencies: "@babel/types" "^7.3.0" @@ -3202,10 +3427,15 @@ "@types/connect" "*" "@types/node" "*" +"@types/braces@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/braces/-/braces-3.0.0.tgz#7da1c0d44ff1c7eb660a36ec078ea61ba7eb42cb" + integrity sha512-TbH79tcyi9FHwbyboOKeRachRq63mSuWYXOflsNO9ZyE5ClQ/JaozNKl+aWUq87qPNsXasXxi2AbgfwIJ+8GQw== + "@types/cheerio@^0.22.2": - version "0.22.18" - resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.18.tgz#19018dceae691509901e339d63edf1e935978fe6" - integrity sha512-Fq7R3fINAPSdUEhOyjG4iVxgHrOnqDJbY0/BUuiN0pvD/rfmZWekVZnv+vcs8TtpA2XF50uv50LaE4EnpEL/Hw== + version "0.22.22" + resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.22.tgz#ae71cf4ca59b8bbaf34c99af7a5d6c8894988f5f" + integrity sha512-05DYX4zU96IBfZFY+t3Mh88nlwSMtmmzSYaQkKN48T495VV1dkHSah6qYyDTN5ngaS0i0VonH37m+RuzSM0YiA== dependencies: "@types/node" "*" @@ -3240,17 +3470,17 @@ dependencies: "@types/node" "*" -"@types/d3-path@*": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-1.0.8.tgz#48e6945a8ff43ee0a1ce85c8cfa2337de85c7c79" - integrity sha512-AZGHWslq/oApTAHu9+yH/Bnk63y9oFOMROtqPAtxl5uB6qm1x2lueWdVEjsjjV3Qc2+QfuzKIwIR5MvVBakfzA== +"@types/d3-path@^1": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-1.0.9.tgz#73526b150d14cd96e701597cbf346cfd1fd4a58c" + integrity sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ== "@types/d3-shape@^1.2.6": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-1.3.2.tgz#a41d9d6b10d02e221696b240caf0b5d0f5a588ec" - integrity sha512-LtD8EaNYCaBRzHzaAiIPrfcL3DdIysc81dkGlQvv7WQP3+YXV7b0JJTtR1U3bzeRieS603KF4wUo+ZkJVenh8w== + version "1.3.4" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-1.3.4.tgz#5a6d8c3026ba8e8a1a985bda8da40acfc9b7b079" + integrity sha512-fxmOjs+UqNQGpztD5BOo+KriE0jLFrBP4Ct++0QExv/xfDOT1cpcMxgsZ+5qPmnR0t+GjbwAe1Um1PHpv3G4oA== dependencies: - "@types/d3-path" "*" + "@types/d3-path" "^1" "@types/debug@^0.0.30": version "0.0.30" @@ -3268,24 +3498,37 @@ integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== "@types/express-serve-static-core@*": - version "4.17.8" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.8.tgz#b8f7b714138536742da222839892e203df569d1c" - integrity sha512-1SJZ+R3Q/7mLkOD9ewCBDYD2k0WyZQtWYqF/2VvoNN2/uhI49J9CDN4OAm+wGMA0DbArA4ef27xl4+JwMtGggw== + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.13.tgz#d9af025e925fc8b089be37423b8d1eac781be084" + integrity sha512-RgDi5a4nuzam073lRGKTUIaL3eF2+H7LJvJ8eUnCI0wA6SNjXc44DCmWNiTLs/AZ7QlsFWZiw/gTG3nSQGL0fA== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/express@^4.17.2": - version "4.17.6" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.6.tgz#6bce49e49570507b86ea1b07b806f04697fac45e" - integrity sha512-n/mr9tZI83kd4azlPG5y997C/M4DNABK9yErhFM6hKdym4kkmd9j0vtsJyjFIwfRBxtrxZtAfGZCNRIBMFLK5w== + version "4.17.8" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.8.tgz#3df4293293317e61c60137d273a2e96cd8d5f27a" + integrity sha512-wLhcKh3PMlyA2cNAB9sjM1BntnhPMiM0JOBwPBqttjHev2428MLEB4AYVN+d8s2iyCVZac+o41Pflm/ZH5vLXQ== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "*" "@types/qs" "*" "@types/serve-static" "*" +"@types/glob-base@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@types/glob-base/-/glob-base-0.3.0.tgz#a581d688347e10e50dd7c17d6f2880a10354319d" + integrity sha1-pYHWiDR+EOUN18F9byiAoQNUMZ0= + +"@types/glob@*": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" + integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + "@types/graceful-fs@^4.1.2": version "4.1.3" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.3.tgz#039af35fe26bec35003e8d86d2ee9c586354348f" @@ -3294,14 +3537,14 @@ "@types/node" "*" "@types/history@*": - version "4.7.6" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.6.tgz#ed8fc802c45b8e8f54419c2d054e55c9ea344356" - integrity sha512-GRTZLeLJ8ia00ZH8mxMO8t0aC9M1N9bN461Z2eaRurJo6Fpa+utgCwLzI4jQHcrdzuzp5WPN9jRwpsCQ1VhJ5w== + version "4.7.8" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.8.tgz#49348387983075705fe8f4e02fb67f7daaec4934" + integrity sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA== "@types/html-minifier-terser@^5.0.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz#551a4589b6ee2cc9c1dff08056128aec29b94880" - integrity sha512-iYCgjm1dGPRuo12+BStjd1HiVQqhlRhWDOQigNxn023HcjnhsiFz9pc6CzJj4HwDCSQca9bxTL4PxJDbkdm3PA== + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#3c9ee980f1a10d6021ae6632ca3e79ca2ec4fb50" + integrity sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA== "@types/html-minifier@*": version "4.0.0" @@ -3346,10 +3589,17 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" +"@types/istanbul-reports@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821" + integrity sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA== + dependencies: + "@types/istanbul-lib-report" "*" + "@types/jest@*": - version "26.0.3" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.3.tgz#79534e0e94857171c0edc596db0ebe7cb7863251" - integrity sha512-v89ga1clpVL/Y1+YI0eIu1VMW+KU7Xl8PhylVtDKVWaSUHBHYPLXMQGBdrpHewaKoTvlXkksbYqPgz8b4cmRZg== + version "26.0.14" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.14.tgz#078695f8f65cb55c5a98450d65083b2b73e5a3f3" + integrity sha512-Hz5q8Vu0D288x3iWXePSn53W7hAjP0H7EQ6QvDO9c7t46mR0lNOLlfuwQ+JkVxuhygHzlzPX+0jKdA3ZgSh+Vg== dependencies: jest-diff "^25.2.1" pretty-format "^25.2.1" @@ -3367,10 +3617,10 @@ resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.5.tgz#136d5e6a57a931e1cce6f9d8126aa98a9c92a6bb" integrity sha512-JCcp6J0GV66Y4ZMDAQCXot4xprYB+Zfd3meK9+INSJeVZwJmHAW30BBEEkPzXswMXuiyReUGOP3GxrADc9wPww== -"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.4": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" - integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== +"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" + integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== "@types/linkify-it@^2.1.0": version "2.1.0" @@ -3378,9 +3628,9 @@ integrity sha512-Q7DYAOi9O/+cLLhdaSvKdaumWyHbm7HAk/bFwwyTuU0arR5yyCeW5GOoqt4tJTpDRxhpx9Q8kQL6vMpuw9hDSw== "@types/lodash@^4.14.68": - version "4.14.157" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.157.tgz#fdac1c52448861dfde1a2e1515dbc46e54926dc8" - integrity sha512-Ft5BNFmv2pHDgxV5JDsndOWTRJ+56zte0ZpYLowp03tW+K+t8u8YMOzAnpuqPgzX6WO1XpDIUm7u04M8vdDiVQ== + version "4.14.161" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.161.tgz#a21ca0777dabc6e4f44f3d07f37b765f54188b18" + integrity sha512-EP6O3Jkr7bXvZZSZYlsgt5DIjiGr0dXP1/jVEwVLTFgg0d+3lWVQkRavYVQszV7dYUwvg0B8R0MBDpcmXg7XIA== "@types/long@^3.0.32": version "3.0.32" @@ -3397,6 +3647,13 @@ resolved "https://registry.yarnpkg.com/@types/lossless-json/-/lossless-json-1.0.0.tgz#6493f813b9421f45bfef9b30e99242652cbd025e" integrity sha512-knKgXT5I1x87nKLuwCKWi7nfwwYrmyi51ss7O8kAnbj8c116wBm86Laj9yguoN+Ju1S8jkjasam/OdearnQKRw== +"@types/markdown-to-jsx@^6.11.0": + version "6.11.2" + resolved "https://registry.yarnpkg.com/@types/markdown-to-jsx/-/markdown-to-jsx-6.11.2.tgz#05d1aaffbf15be7be12c70535fa4fed65cc7c64f" + integrity sha512-ESuCu8Bk7jpTZ3YPdMW1+6wUj13F5N15vXfc7BuUAN0eCp0lrvVL9nzOTzoqvbRzXMciuqXr1KrHt3xQAhfwPA== + dependencies: + "@types/react" "*" + "@types/memoize-one@^4.1.0": version "4.1.1" resolved "https://registry.yarnpkg.com/@types/memoize-one/-/memoize-one-4.1.1.tgz#41dd138a4335b5041f7d8fc038f9d593d88b3369" @@ -3409,10 +3666,22 @@ dependencies: "@types/node" "*" +"@types/micromatch@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/micromatch/-/micromatch-4.0.1.tgz#9381449dd659fc3823fd2a4190ceacc985083bc7" + integrity sha512-my6fLBvpY70KattTNzYOK6KU1oR1+UCz9ug/JbcF5UrEmeCt9P7DV2t7L8+t18mMPINqGQCE4O8PLOPbI84gxw== + dependencies: + "@types/braces" "*" + "@types/mime@*": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.2.tgz#857a118d8634c84bba7ae14088e4508490cd5da5" - integrity sha512-4kPlzbljFcsttWEq6aBW0OZe6BDajAmyvr2xknBG92tejQnvdGtT9+kXSZ580DqpxY9qG2xeQVF9Dq0ymUTo5Q== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a" + integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q== + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/minimist@^1.2.0": version "1.2.0" @@ -3420,26 +3689,34 @@ integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= "@types/moment-timezone@^0.5.13": - version "0.5.13" - resolved "https://registry.yarnpkg.com/@types/moment-timezone/-/moment-timezone-0.5.13.tgz#0317ccc91eb4c7f4901704166166395c39276528" - integrity sha512-SWk1qM8DRssS5YR9L4eEX7WUhK/wc96aIr4nMa6p0kTk9YhGGOJjECVhIdPEj13fvJw72Xun69gScXSZ/UmcPg== + version "0.5.30" + resolved "https://registry.yarnpkg.com/@types/moment-timezone/-/moment-timezone-0.5.30.tgz#340ed45fe3e715f4a011f5cfceb7cb52aad46fc7" + integrity sha512-aDVfCsjYnAQaV/E9Qc24C5Njx1CoDjXsEgkxtp9NyXDpYu4CCbmclb6QhWloS9UTU/8YROUEEdEkWI0D7DxnKg== + dependencies: + moment-timezone "*" + +"@types/node-fetch@^2.5.4": + version "2.5.7" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.7.tgz#20a2afffa882ab04d44ca786449a276f9f6bbf3c" + integrity sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw== dependencies: - moment ">=2.14.0" + "@types/node" "*" + form-data "^3.0.0" "@types/node@*", "@types/node@>= 8": - version "14.0.14" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.14.tgz#24a0b5959f16ac141aeb0c5b3cd7a15b7c64cbce" - integrity sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ== + version "14.11.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.2.tgz#2de1ed6670439387da1c9f549a2ade2b0a799256" + integrity sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA== "@types/node@^10.1.0": - version "10.17.26" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.26.tgz#a8a119960bff16b823be4c617da028570779bcfd" - integrity sha512-myMwkO2Cr82kirHY8uknNRHEVtn0wV3DTQfkrjx17jmkstDRZ24gNUdl8AHXVyVclTYI/bNjgTPTAWvWLqXqkw== + version "10.17.35" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.35.tgz#58058f29b870e6ae57b20e4f6e928f02b7129f56" + integrity sha512-gXx7jAWpMddu0f7a+L+txMplp3FnHl53OhQIF9puXKq3hDGY/GjH+MF04oWnV/adPSCrbtHumDCFwzq2VhltWA== "@types/node@^13.7.1": - version "13.13.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.12.tgz#9c72e865380a7dc99999ea0ef20fc9635b503d20" - integrity sha512-zWz/8NEPxoXNT9YyF2osqyA9WjssZukYpgI4UYZpOjcyqwIUqWGkcCionaEb9Ki+FULyPyvNFpg/329Kd2/pbw== + version "13.13.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.21.tgz#e48d3c2e266253405cf404c8654d1bcf0d333e5c" + integrity sha512-tlFWakSzBITITJSxHV4hg4KvrhR/7h3xbJdSFbYJBVzKubrASbnnIFuSgolUh7qKGo/ZeJPKUfbZ0WS6Jp14DQ== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -3456,6 +3733,11 @@ resolved "https://registry.yarnpkg.com/@types/object-hash/-/object-hash-1.3.3.tgz#624ed28222bd5af0f936b162589c06a2b0550161" integrity sha512-75t+H8u2IU1zJPPqezkGLP4YxDlj8tx7H9SgYOT1G61NjJUUEELu1Lp7RKQKXhW+FL8nV7XyD/cNFAtrKGViYQ== +"@types/overlayscrollbars@^1.9.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@types/overlayscrollbars/-/overlayscrollbars-1.12.0.tgz#98456caceca8ad73bd5bb572632a585074e70764" + integrity sha512-h/pScHNKi4mb+TrJGDon8Yb06ujFG0mSg12wIO0sWMUF3dQIe2ExRRdNRviaNt9IjxIiOfnRr7FsQAdHwK4sMg== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" @@ -3481,20 +3763,20 @@ resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== -"@types/qs@*": - version "6.9.3" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.3.tgz#b755a0934564a200d3efdf88546ec93c369abd03" - integrity sha512-7s9EQWupR1fTc2pSMtXRQ9w9gLOcrJn+h7HOXw4evxyvVqMi4f+q7d2tnFe3ng3SNHjtK+0EzGMGFUQX4/AQRA== +"@types/qs@*", "@types/qs@^6.9.0": + version "6.9.5" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.5.tgz#434711bdd49eb5ee69d90c1d67c354a9a8ecb18b" + integrity sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ== "@types/range-parser@*": version "1.2.3" resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== -"@types/reach__router@^1.2.3": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/reach__router/-/reach__router-1.3.5.tgz#14e1e981cccd3a5e50dc9e969a72de0b9d472f6d" - integrity sha512-h0NbqXN/tJuBY/xggZSej1SKQEstbHO7J/omt1tYoFGmj3YXOodZKbbqD4mNDh7zvEGYd7YFrac1LTtAr3xsYQ== +"@types/reach__router@^1.2.3", "@types/reach__router@^1.3.5": + version "1.3.6" + resolved "https://registry.yarnpkg.com/@types/reach__router/-/reach__router-1.3.6.tgz#413417ce74caab331c70ce6a03a4c825188e4709" + integrity sha512-RHYataCUPQnt+GHoASyRLq6wmZ0n8jWlBW8Lxcwd30NN6vQfbmTeoSDfkgxO0S1lEzArp8OFDsq5KIs7FygjtA== dependencies: "@types/history" "*" "@types/react" "*" @@ -3574,9 +3856,9 @@ "@types/react" "*" "@types/react-test-renderer@^16.9.0": - version "16.9.2" - resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-16.9.2.tgz#e1c408831e8183e5ad748fdece02214a7c2ab6c5" - integrity sha512-4eJr1JFLIAlWhzDkBCkhrOIWOvOxcCAfQh+jiKg7l/nNZcCIL2MHl2dZhogIFKyHzedVWHaVP1Yydq/Ruu4agw== + version "16.9.3" + resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-16.9.3.tgz#96bab1860904366f4e848b739ba0e2f67bcae87e" + integrity sha512-wJ7IlN5NI82XMLOyHSa+cNN4Z0I+8/YaLl04uDgcZ+W+ExWCmCiVTLT/7fRNqzy4OhStZcUwIqLNF7q+AdW43Q== dependencies: "@types/react" "*" @@ -3603,12 +3885,12 @@ "@types/react" "*" "@types/react@*", "@types/react@^16.9.34": - version "16.9.41" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.41.tgz#925137ee4d2ff406a0ecf29e8e9237390844002e" - integrity sha512-6cFei7F7L4wwuM+IND/Q2cV1koQUvJ8iSV+Gwn0c3kvABZ691g7sp3hfEQHOUBJtccl1gPi+EyNjMIl9nGA0ug== + version "16.9.49" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.49.tgz#09db021cf8089aba0cdb12a49f8021a69cce4872" + integrity sha512-DtLFjSj0OYAdVLBbyjhuV9CdGVHCkHn2R+xr3XkBvK2rS1Y1tkc14XSGjYgm5Fjjr90AxH9tiSzc1pCFMGO06g== dependencies: "@types/prop-types" "*" - csstype "^2.2.0" + csstype "^3.0.2" "@types/reactcss@*": version "1.2.3" @@ -3628,9 +3910,9 @@ integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/serve-static@*", "@types/serve-static@^1.7.31": - version "1.13.4" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.4.tgz#6662a93583e5a6cabca1b23592eb91e12fa80e7c" - integrity sha512-jTDt0o/YbpNwZbQmE/+2e+lfjJEJJR0I3OFaKQKPWkASkCoW3i6fsUnqudSMcNAfbtmADGu8f4MV4q+GqULmug== + version "1.13.5" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.5.tgz#3d25d941a18415d3ab092def846e135a08bbcf53" + integrity sha512-6M64P58N+OXjU432WoLLBQxbA0LRGBCRm7aAGQJ+SMC1IMl0dgRVi9EFfoDcS2a7Xogygk/eGN94CfwU9UF7UQ== dependencies: "@types/express-serve-static-core" "*" "@types/mime" "*" @@ -3682,16 +3964,16 @@ integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA== "@types/testing-library__jest-dom@^5.9.1": - version "5.9.1" - resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.9.1.tgz#aba5ee062b7880f69c212ef769389f30752806e5" - integrity sha512-yYn5EKHO3MPEMSOrcAb1dLWY+68CG29LiXKsWmmpVHqoP5+ZRiAVLyUHvPNrO2dABDdUGZvavMsaGpWNjM6N2g== + version "5.9.4" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.9.4.tgz#f5e009540bbea7b82745e352038c60db7320c327" + integrity sha512-6spmpkKOCVCO9XolAR23gfv09Nfd4QByRM3WbnYnPhVfjmOzEKlNrcj6GqFLZKduUvtJIH7Mf5t2TY6rs93zDA== dependencies: "@types/jest" "*" "@types/uglify-js@*": - version "3.9.2" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.9.2.tgz#01992579debba674e1e359cd6bcb1a1d0ab2e02b" - integrity sha512-d6dIfpPbF+8B7WiCi2ELY7m0w1joD8cRW4ms88Emdb2w062NeEpbNCeWwVCgzLRpVG+5e74VFSg4rgJ2xXjEiQ== + version "3.11.0" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.11.0.tgz#2868d405cc45cd9dc3069179052103032c33afbc" + integrity sha512-I0Yd8TUELTbgRHq2K65j8rnDPAzAP+DiaF/syLem7yXwYLsHZhPd+AM2iXsWmf9P2F2NlFCgl5erZPQx9IbM9Q== dependencies: source-map "^0.6.1" @@ -3704,10 +3986,10 @@ "@types/memory-fs" "*" "@types/webpack" "*" -"@types/webpack-env@^1.13.1", "@types/webpack-env@^1.15.0": - version "1.15.2" - resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.15.2.tgz#927997342bb9f4a5185a86e6579a0a18afc33b0a" - integrity sha512-67ZgZpAlhIICIdfQrB5fnDvaKFcDxpKibxznfYRVAT4mQE41Dido/3Ty+E3xGBmTogc5+0Qb8tWhna+5B8z1iQ== +"@types/webpack-env@^1.13.1", "@types/webpack-env@^1.15.0", "@types/webpack-env@^1.15.2": + version "1.15.3" + resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.15.3.tgz#fb602cd4c2f0b7c0fb857e922075fdf677d25d84" + integrity sha512-5oiXqR7kwDGZ6+gmzIO2lTC+QsriNuQXZDWNYRV3l2XRN/zmPgnC21DLSx2D05zvD8vnXW6qUg7JnXZ4I6qLVQ== "@types/webpack-hot-middleware@^2.15.0": version "2.25.3" @@ -3718,18 +4000,18 @@ "@types/webpack" "*" "@types/webpack-sources@*": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-1.4.0.tgz#e58f1f05f87d39a5c64cf85705bdbdbb94d4d57e" - integrity sha512-c88dKrpSle9BtTqR6ifdaxu1Lvjsl3C5OsfvuUbUwdXymshv1TkufUAXBajCCUM/f/TmnkZC/Esb03MinzSiXQ== + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-2.0.0.tgz#08216ab9be2be2e1499beaebc4d469cec81e82a7" + integrity sha512-a5kPx98CNFRKQ+wqawroFunvFqv7GHm/3KOI52NY9xWADgc8smu4R6prt4EU/M4QfVjvgBkMqU4fBhw3QfMVkg== dependencies: "@types/node" "*" "@types/source-list-map" "*" source-map "^0.7.3" "@types/webpack@*", "@types/webpack@^4.1.3", "@types/webpack@^4.41.8": - version "4.41.18" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.18.tgz#2945202617866ecdffa582087f1b6de04a7eed55" - integrity sha512-mQm2R8vV2BZE/qIDVYqmBVLfX73a8muwjs74SpjEyJWJxeXBbsI9L65Pcia9XfYLYWzD1c1V8m+L0p30y2N7MA== + version "4.41.22" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.22.tgz#ff9758a17c6bd499e459b91e78539848c32d0731" + integrity sha512-JQDJK6pj8OMV9gWOnN1dcLCyU9Hzs6lux0wBO4lr1+gyEhIBR9U3FMrz12t2GPkg110XAxEAw2WHF6g7nZIbRQ== dependencies: "@types/anymatch" "*" "@types/node" "*" @@ -3744,9 +4026,9 @@ integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== "@types/yargs@^15.0.0": - version "15.0.5" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.5.tgz#947e9a6561483bdee9adffc983e91a6902af8b79" - integrity sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w== + version "15.0.7" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.7.tgz#dad50a7a234a35ef9460737a56024287a3de1d2b" + integrity sha512-Gf4u3EjaPNcC9cTu4/j2oN14nSVhr8PQ+BvBcBQHAhDZfl0bVIiLgvnRXv/dn58XhTm9UXvBpvJpDlwV65QxOA== dependencies: "@types/yargs-parser" "*" @@ -3922,10 +4204,25 @@ "@webassemblyjs/wast-parser" "1.9.0" "@xtuc/long" "4.2.2" -"@xstate/react@^0.8.1": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@xstate/react/-/react-0.8.1.tgz#df200547cca24c909572b7aef1ddab8bca3a0603" - integrity sha512-8voZm4GX3x70lNQVvoGedoObPYapkQIbgMhE+xOQEsm8Ait4Zto6R01SZ6WJD4qvLl8JPV6uq96OcFRdEsVESg== +"@webpack-contrib/schema-utils@^1.0.0-beta.0": + version "1.0.0-beta.0" + resolved "https://registry.yarnpkg.com/@webpack-contrib/schema-utils/-/schema-utils-1.0.0-beta.0.tgz#bf9638c9464d177b48209e84209e23bee2eb4f65" + integrity sha512-LonryJP+FxQQHsjGBi6W786TQB1Oym+agTpY0c+Kj8alnIw+DLUJb6SI8Y1GHGhLCH1yPRrucjObUmxNICQ1pg== + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + chalk "^2.3.2" + strip-ansi "^4.0.0" + text-table "^0.2.0" + webpack-log "^1.1.2" + +"@xstate/react@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@xstate/react/-/react-1.0.1.tgz#cb6d64c277b20c5357eb3fc4742feeb395759090" + integrity sha512-FMQiXSbe2sZQdA1XSyUxTXangmpYJsLvEUyGal2C7+VMZCGoJnlxdoExKw09MR9QWpHMwsbhc8kJUvswqwxf2w== + dependencies: + use-isomorphic-layout-effect "^1.0.0" + use-subscription "^1.3.0" "@xtuc/ieee754@^1.2.0": version "1.2.0" @@ -3946,9 +4243,9 @@ JSONStream@^1.0.4, JSONStream@^1.3.4, JSONStream@^1.3.5: through ">=2.2.7 <3" abab@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" - integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== abbrev@1, abbrev@~1.1.1: version "1.1.1" @@ -3972,9 +4269,9 @@ acorn-globals@^4.3.2: acorn-walk "^6.0.1" acorn-jsx@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" - integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== acorn-walk@^6.0.1: version "6.2.0" @@ -3987,9 +4284,9 @@ acorn@^6.0.1, acorn@^6.0.7, acorn@^6.4.1: integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== acorn@^7.1.0: - version "7.3.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" - integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== + version "7.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" + integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== add-asset-html-webpack-plugin@^2.1.3: version "2.1.3" @@ -4026,9 +4323,9 @@ agent-base@4, agent-base@^4.3.0: es6-promisify "^5.0.0" agent-base@6: - version "6.0.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.0.tgz#5d0101f19bbfaed39980b22ae866de153b93f09a" - integrity sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw== + version "6.0.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.1.tgz#808007e4e5867decb0ab6ab2f928fbdb5a596db4" + integrity sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg== dependencies: debug "4" @@ -4047,9 +4344,9 @@ agentkeepalive@^3.4.1: humanize-ms "^1.2.1" aggregate-error@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" - integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" indent-string "^4.0.0" @@ -4082,25 +4379,15 @@ ajv-errors@^1.0.0: resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: - version "3.5.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.0.tgz#5c894537098785926d71e696114a53ce768ed773" - integrity sha512-eyoaac3btgU8eJlvh01En8OCKzRqlLe2G5jDsCr3RiE2uLGMEEB1aaGwVVpwR8M95956tGH6R+9edC++OvzaVw== - -ajv@^6.1.0, ajv@^6.1.1, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.9.1: - version "6.12.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" - integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.5.5: - version "6.12.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" - integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== +ajv@^6.1.0, ajv@^6.1.1, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.9.1: + version "6.12.5" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.5.tgz#19b0e8bae8f476e5ba666300387775fb1a00a4da" + integrity sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" @@ -4372,24 +4659,20 @@ arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= -arrify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" - integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== - asap@^2.0.0, asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== dependencies: bn.js "^4.0.0" inherits "^2.0.1" minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" asn1@~0.2.3: version "0.2.4" @@ -4422,9 +4705,11 @@ ast-types@0.11.3: integrity sha512-XA5o5dsNw8MhyW0Q7MWXJWc4oOzZKbdsEJq45h7c8q/d9DwWZ5F2ugUc1PuMLPGsUnphCt/cNDHu8JeBbxf1qA== ast-types@^0.13.2: - version "0.13.3" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.3.tgz#50da3f28d17bdbc7969a3a2d83a0e4a72ae755a7" - integrity sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA== + version "0.13.4" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" + integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== + dependencies: + tslib "^2.0.1" astral-regex@^1.0.0: version "1.0.0" @@ -4436,6 +4721,11 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== +async@0.9.x: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= + async@^2.5.0: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" @@ -4476,13 +4766,13 @@ autoprefixer@^8.3.0: postcss-value-parser "^3.2.3" autoprefixer@^9.7.2: - version "9.8.4" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.4.tgz#736f1012673a70fa3464671d78d41abd54512863" - integrity sha512-84aYfXlpUe45lvmS+HoAWKCkirI/sw4JK0/bTeeqgHYco3dcsOn0NqdejISjptsYwNji/21dnkDri9PsYKk89A== + version "9.8.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" + integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== dependencies: browserslist "^4.12.0" - caniuse-lite "^1.0.30001087" - colorette "^1.2.0" + caniuse-lite "^1.0.30001109" + colorette "^1.2.1" normalize-range "^0.1.2" num2fraction "^1.2.2" postcss "^7.0.32" @@ -4494,14 +4784,14 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2" - integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA== + version "1.10.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428" + integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA== axios-mock-adapter@^1.16.0: - version "1.18.1" - resolved "https://registry.yarnpkg.com/axios-mock-adapter/-/axios-mock-adapter-1.18.1.tgz#a2ba2638ef513d954793f96bde3e26bd4a1b7940" - integrity sha512-kFBZsG1Ma5yxjRGHq5KuuL55mPb7WzFULhypquEhzPg8SH5CXICb+qwC2CCA5u+GQVpiqGPwKSRkd3mBCs6gdw== + version "1.18.2" + resolved "https://registry.yarnpkg.com/axios-mock-adapter/-/axios-mock-adapter-1.18.2.tgz#01fa9e88e692e8f1bbc1ad1200dde672486e03c7" + integrity sha512-e5aTsPy2Viov22zNpFTlid76W1Scz82pXeEwwCXdtO85LROhHAF8pHF2qDhiyMONLxKyY3lQ+S4UCsKgrlx8Hw== dependencies: fast-deep-equal "^3.1.1" is-buffer "^2.0.3" @@ -4577,7 +4867,7 @@ babel-jest@^25.5.0, babel-jest@^25.5.1: graceful-fs "^4.2.4" slash "^3.0.0" -babel-loader@^8.0.0-beta.2: +babel-loader@^8.0.0-beta.2, babel-loader@^8.0.6: version "8.1.0" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== @@ -4654,7 +4944,7 @@ babel-plugin-jest-hoist@^25.5.0: "@babel/types" "^7.3.3" "@types/babel__traverse" "^7.0.6" -babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.7.0: +babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.7.0, babel-plugin-macros@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== @@ -4744,10 +5034,10 @@ babel-plugin-named-asset-import@^0.3.1: resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz#c9750a1b38d85112c9e166bf3ef7c5dbc605f4be" integrity sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA== -babel-plugin-react-docgen@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.1.0.tgz#1dfa447dac9ca32d625a123df5733a9e47287c26" - integrity sha512-vzpnBlfGv8XOhJM2zbPyyqw2OLEbelgZZsaaRRTpVwNKuYuc+pUg4+dy7i9gCRms0uOQn4osX571HRcCJMJCmA== +babel-plugin-react-docgen@^4.0.0, babel-plugin-react-docgen@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.2.0.tgz#4f425692f0ca06c73a1462274d370a3ac0637b46" + integrity sha512-B3tjZwKskcia9TsqkND+9OTjl/F5A5OBvRJ6Ktg34CONoxm+kB3CJ52wk5TjbszX9gqCPcAuc0GgkhT0CLuT/Q== dependencies: lodash "^4.17.15" react-docgen "^5.0.0" @@ -4940,6 +5230,13 @@ before-after-hook@^2.1.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635" integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A== +better-opn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/better-opn/-/better-opn-2.0.0.tgz#c70d198e51164bdc220306a28a885d9ac7a14c44" + integrity sha512-PPbGRgO/K0LowMHbH/JNvaV3qY3Vt+A2nH28fzJxy16h/DfR5OsVti6ldGl6S9SMsyUqT13sltikiAVtI6tKLA== + dependencies: + open "^7.0.3" + big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" @@ -4955,7 +5252,7 @@ bignumber.js@^2.1.0: resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-2.4.0.tgz#838a992da9f9d737e0f4b2db0be62bb09dd0c5e8" integrity sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg= -bin-links@^1.1.2, bin-links@^1.1.7: +bin-links@^1.1.2, bin-links@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.8.tgz#bd39aadab5dc4bdac222a07df5baf1af745b2228" integrity sha512-KgmVfx+QqggqP9dA3iIc5pA4T1qEEEL+hOhOhNPaUm77OTrJoOXE/C05SJLNJe6m/2wUK7F1tDSou7n5TfCDzQ== @@ -4984,7 +5281,7 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" -bl@^4.0.1: +bl@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489" integrity sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg== @@ -5019,9 +5316,9 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== bn.js@^5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0" - integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA== + version "5.1.3" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" + integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== body-parser@1.19.0: version "1.19.0" @@ -5164,15 +5461,15 @@ browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: randombytes "^2.0.1" browserify-sign@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz#545d0b1b07e6b2c99211082bf1b12cce7a0b0e11" - integrity sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA== + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== dependencies: bn.js "^5.1.1" browserify-rsa "^4.0.1" create-hash "^1.2.0" create-hmac "^1.1.7" - elliptic "^6.5.2" + elliptic "^6.5.3" inherits "^2.0.4" parse-asn1 "^5.1.5" readable-stream "^3.6.0" @@ -5185,6 +5482,16 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" +browserslist@4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9" + integrity sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA== + dependencies: + caniuse-lite "^1.0.30001035" + electron-to-chromium "^1.3.378" + node-releases "^1.1.52" + pkg-up "^3.1.0" + browserslist@4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.0.tgz#9ee89225ffc07db03409f2fee524dc8227458a17" @@ -5203,14 +5510,14 @@ browserslist@^3.2.8: electron-to-chromium "^1.3.47" browserslist@^4.12.0, browserslist@^4.8.5: - version "4.12.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.2.tgz#76653d7e4c57caa8a1a28513e2f4e197dc11a711" - integrity sha512-MfZaeYqR8StRZdstAK9hCKDd2StvePCYp5rHzQCPicUjfFliDgmuaBNPHYUTpAywBN8+Wc/d7NYVFkO0aqaBUw== + version "4.14.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.5.tgz#1c751461a102ddc60e40993639b709be7f2c4015" + integrity sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA== dependencies: - caniuse-lite "^1.0.30001088" - electron-to-chromium "^1.3.483" - escalade "^3.0.1" - node-releases "^1.1.58" + caniuse-lite "^1.0.30001135" + electron-to-chromium "^1.3.571" + escalade "^3.1.0" + node-releases "^1.1.61" bs-logger@0.x: version "0.2.6" @@ -5375,6 +5682,29 @@ cacache@^13.0.1: ssri "^7.0.0" unique-filename "^1.1.1" +cacache@^15.0.5: + version "15.0.5" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.5.tgz#69162833da29170d6732334643c60e005f5f17d0" + integrity sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A== + dependencies: + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.0" + tar "^6.0.2" + unique-filename "^1.1.1" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -5502,10 +5832,10 @@ can-use-dom@^0.1.0: resolved "https://registry.yarnpkg.com/can-use-dom/-/can-use-dom-0.1.0.tgz#22cc4a34a0abc43950f42c6411024a3f6366b45a" integrity sha1-IsxKNKCrxDlQ9CxkEQJKP2NmtFo= -caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000864, caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30001087, caniuse-lite@^1.0.30001088: - version "1.0.30001090" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001090.tgz#ff7766332f60e80fea4903f30d360622e5551850" - integrity sha512-QzPRKDCyp7RhjczTPZaqK3CjPA5Ht2UnXhZhCI4f7QiB5JK6KEuZBxIzyWnB3wO4hgAj4GMRxAhuiacfw0Psjg== +caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000864, caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001135: + version "1.0.30001141" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001141.tgz#214a196d81aa938b268fb0cb6d8fab23fdf14378" + integrity sha512-EHfInJHoQTmlMdVZrEc5gmwPc0zyN/hVufmGHPbVNQwlk7tJfCmQ2ysRZMY2MeleBivALUTyyxXnQjK18XrVpA== capture-exit@^2.0.0: version "2.0.0" @@ -5565,7 +5895,7 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== @@ -5629,10 +5959,10 @@ chokidar@^2.0.4, chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chokidar@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" - integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== +chokidar@^3.3.0, chokidar@^3.4.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" + integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -5649,6 +5979,11 @@ chownr@^1.0.1, chownr@^1.1.1, chownr@^1.1.2, chownr@^1.1.4: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + chrome-trace-event@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" @@ -5714,9 +6049,9 @@ cli-boxes@^1.0.0: integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= cli-boxes@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d" - integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w== + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== cli-columns@^3.1.2: version "3.1.2" @@ -5750,6 +6085,16 @@ cli-table3@0.5.1, cli-table3@^0.5.0, cli-table3@^0.5.1: optionalDependencies: colors "^1.1.2" +cli-table3@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.0.tgz#b7b1bc65ca8e7b5cef9124e13dc2b21e2ce4faee" + integrity sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ== + dependencies: + object-assign "^4.1.0" + string-width "^4.2.0" + optionalDependencies: + colors "^1.1.2" + cli-table@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" @@ -5770,6 +6115,11 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + clipboard@^2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.6.tgz#52921296eec0fdf77ead1749421b21c968647376" @@ -5788,15 +6138,6 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -5855,7 +6196,7 @@ cloneable-readable@^1.0.0: process-nextick-args "^2.0.0" readable-stream "^2.3.5" -clsx@^1.0.1, clsx@^1.0.2, clsx@^1.0.4: +clsx@^1.0.2, clsx@^1.0.4: version "1.1.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== @@ -5940,10 +6281,10 @@ color@^3.1.1: color-convert "^1.9.1" color-string "^1.5.2" -colorette@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.0.tgz#45306add826d196e8c87236ac05d797f25982e63" - integrity sha512-soRSroY+OF/8OdA3PTQXwaDJeMc7TfknKKrxeSCencL2a4+Tx5zhxmmv7hdpCjhKBjehzp8+bwe/T68K0hpIjw== +colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== colors@1.0.3: version "1.0.3" @@ -5963,7 +6304,7 @@ columnify@~1.5.4: strip-ansi "^3.0.0" wcwidth "^1.0.0" -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -5990,6 +6331,11 @@ commander@^4.0.1, commander@^4.1.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" @@ -6018,6 +6364,14 @@ compare-func@^1.3.1: array-ify "^1.0.0" dot-prop "^3.0.0" +compare-func@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== + dependencies: + array-ify "^1.0.0" + dot-prop "^5.1.0" + compare-versions@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" @@ -6064,11 +6418,11 @@ config-chain@^1.1.12: proto-list "~1.2.1" configstore@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" - integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== + version "3.1.5" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.5.tgz#e9af331fadc14dabd544d3e7e76dc446a09a530f" + integrity sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA== dependencies: - dot-prop "^4.1.0" + dot-prop "^4.2.1" graceful-fs "^4.1.2" make-dir "^1.0.0" unique-string "^1.0.0" @@ -6118,11 +6472,11 @@ conventional-changelog-angular@^1.3.3: q "^1.5.1" conventional-changelog-angular@^5.0.0: - version "5.0.10" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.10.tgz#5cf7b00dd315b6a6a558223c80d5ef24ddb34205" - integrity sha512-k7RPPRs0vp8+BtPsM9uDxRl6KcgqtCJmzRD1wRtgqmhQ96g8ifBGo9O/TZBG23jqlXS/rg8BKRDELxfnQQGiaA== + version "5.0.11" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.11.tgz#99a3ca16e4a5305e0c2c2fae3ef74fd7631fc3fb" + integrity sha512-nSLypht/1yEflhuTogC03i7DX7sOrXGsRn14g131Potqi6cbGbGEE9PSDEHKldabB6N76HiSyw9Ph+kLmC04Qw== dependencies: - compare-func "^1.3.1" + compare-func "^2.0.0" q "^1.5.1" conventional-changelog-conventionalcommits@4.2.1: @@ -6135,11 +6489,11 @@ conventional-changelog-conventionalcommits@4.2.1: q "^1.5.1" conventional-changelog-writer@^4.0.0: - version "4.0.16" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.16.tgz#ca10f2691a8ea6d3c2eb74bd35bcf40aa052dda5" - integrity sha512-jmU1sDJDZpm/dkuFxBeRXvyNcJQeKhGtVcFFkwTphUAzyYWcwz2j36Wcv+Mv2hU3tpvLMkysOPXJTLO55AUrYQ== + version "4.0.17" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.17.tgz#4753aaa138bf5aa59c0b274cb5937efcd2722e21" + integrity sha512-IKQuK3bib/n032KWaSb8YlBFds+aLmzENtnKtxJy3+HqDq5kohu3g/UdNbIHeJWygfnEbZjnCKFxAW0y7ArZAw== dependencies: - compare-func "^1.3.1" + compare-func "^2.0.0" conventional-commits-filter "^2.0.6" dateformat "^3.0.0" handlebars "^4.7.6" @@ -6262,7 +6616,7 @@ core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.7, core-js@^2.6.5: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== -core-js@^3.0.1, core-js@^3.0.4: +core-js@^3.0.1, core-js@^3.0.4, core-js@^3.6.5: version "3.6.5" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== @@ -6301,13 +6655,24 @@ cosmiconfig@^6.0.0: path-type "^4.0.0" yaml "^1.7.2" +cosmiconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== dependencies: bn.js "^4.1.0" - elliptic "^6.0.0" + elliptic "^6.5.3" create-emotion@^10.0.27: version "10.0.27" @@ -6371,9 +6736,9 @@ create-react-context@0.3.0, create-react-context@^0.3.0: warning "^4.0.3" cronstrue@^1.31.0: - version "1.94.0" - resolved "https://registry.yarnpkg.com/cronstrue/-/cronstrue-1.94.0.tgz#d6e545f14daf43a4b4b00b04614ab9ac637174b7" - integrity sha512-DW5OIfJwNGj9R8RCRGsFt0lxp0LKUl6BOElhaNAEkswwihbv6s867oKyOVgh/eQt1z90bBpelWMTR5/mGRB9Hw== + version "1.100.0" + resolved "https://registry.yarnpkg.com/cronstrue/-/cronstrue-1.100.0.tgz#97ac31a1c879e06eb6f09a20dae8f6f089fa0921" + integrity sha512-Hz+xjjmq2QgCQhnPxIVM02dwhOt5GwUywjKa17je9JWX4z2E0uecObXCFap8bmJE87JL9mToW/cGw5O06JgigQ== cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" @@ -6386,6 +6751,15 @@ cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -6431,7 +6805,7 @@ crypto-random-string@^2.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== -css-loader@^3.0.0: +css-loader@^3.0.0, css-loader@^3.5.3: version "3.6.0" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ== @@ -6510,16 +6884,16 @@ css-what@2.1: integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== css-what@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.3.0.tgz#10fec696a9ece2e591ac772d759aacabac38cd39" - integrity sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg== + version "3.4.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.0.tgz#f8d042a1ebb31a8251e64d2a0f0ec3fee9a05267" + integrity sha512-HA4iK1F5BEjbfSAguPk03XboiTvzS0tsqkoSJhkZVf52TgigRpIRGXtvSGRVgHcr1ln1Ubqx2flxKFwtY3kX9A== css.escape@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= -css@^2.0.0, css@^2.2.4: +css@^2.0.0: version "2.2.4" resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== @@ -6529,6 +6903,15 @@ css@^2.0.0, css@^2.2.4: source-map-resolve "^0.5.2" urix "^0.1.0" +css@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" + integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== + dependencies: + inherits "^2.0.4" + source-map "^0.6.1" + source-map-resolve "^0.6.0" + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" @@ -6558,10 +6941,15 @@ cssstyle@^2.0.0: dependencies: cssom "~0.3.6" -csstype@^2.2.0, csstype@^2.5.2, csstype@^2.5.7, csstype@^2.6.5, csstype@^2.6.7: - version "2.6.10" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b" - integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w== +csstype@^2.5.2, csstype@^2.5.7: + version "2.6.13" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.13.tgz#a6893015b90e84dd6e85d0e3b442a1e84f2dbe0f" + integrity sha512-ul26pfSQTZW8dcOnD2iiJssfXw0gdNVX9IJDH/X3K5DGPfj+fUYe3kB+swUY6BF3oZDxaID3AJt+9/ojSAE05A== + +csstype@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.3.tgz#2b410bbeba38ba9633353aff34b05d9755d065f8" + integrity sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag== currently-unhandled@^0.4.1: version "0.4.1" @@ -6602,6 +6990,14 @@ d3-shape@^1.2.2: dependencies: d3-path "1" +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + dargs@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" @@ -6648,11 +7044,11 @@ debug@3.1.0, debug@=3.1.0: ms "2.0.0" debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + version "4.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" + integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== dependencies: - ms "^2.1.1" + ms "2.1.2" debug@^3.0.0, debug@^3.1.0, debug@^3.2.5: version "3.2.6" @@ -6661,7 +7057,7 @@ debug@^3.0.0, debug@^3.1.0, debug@^3.2.5: dependencies: ms "^2.1.1" -debuglog@^1.0.1: +debuglog@*, debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= @@ -6832,10 +7228,10 @@ detect-newline@^3.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -detect-node@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" - integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== +detect-node-es@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.0.0.tgz#c0318b9e539a5256ca780dd9575c9345af05b8ed" + integrity sha512-S4AHriUkTX9FoFvL4G8hXDcx6t3gp2HpfCza3Q0v6S78gul2hKWifLQbeW+ZF89+hSm2ZIc/uF3J97ZgytgTRg== detect-port-alt@1.1.6: version "1.1.6" @@ -6917,10 +7313,10 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-accessibility-api@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.4.5.tgz#d9c1cefa89f509d8cf132ab5d250004d755e76e3" - integrity sha512-HcPDilI95nKztbVikaN2vzwvmv0sE8Y2ZJFODy/m15n7mGXLeOKGiys9qWVbFbh+aq/KYj2lqMLybBOkYAEXqg== +dom-accessibility-api@^0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.3.tgz#0ea493c924d4070dfbf531c4aaca3d7a2c601aab" + integrity sha512-yfqzAi1GFxK6EoJIZKgxqJyK6j/OjEFEUi2qkNThD/kUhoCFSG1izq31B5xuxzbJBGw9/67uPtkPMYAzWL7L7Q== dom-converter@^0.2: version "0.2.0" @@ -6936,13 +7332,13 @@ dom-helpers@^3.4.0: dependencies: "@babel/runtime" "^7.1.2" -dom-helpers@^5.0.0, dom-helpers@^5.0.1: - version "5.1.4" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.4.tgz#4609680ab5c79a45f2531441f1949b79d6587f4b" - integrity sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A== +dom-helpers@^5.0.1, dom-helpers@^5.1.3: + version "5.2.0" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.0.tgz#57fd054c5f8f34c52a3eeffdb7e7e93cd357d95b" + integrity sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ== dependencies: "@babel/runtime" "^7.8.7" - csstype "^2.6.7" + csstype "^3.0.2" dom-serializer@0: version "0.2.2" @@ -6976,9 +7372,9 @@ domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domelementtype@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" - integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + version "2.0.2" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.2.tgz#f3b6e549201e46f588b59463dd77187131fe6971" + integrity sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA== domexception@^1.0.1: version "1.0.1" @@ -7025,13 +7421,20 @@ dot-prop@^3.0.0: dependencies: is-obj "^1.0.0" -dot-prop@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== +dot-prop@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" + integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ== dependencies: is-obj "^1.0.0" +dot-prop@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + 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" @@ -7084,9 +7487,9 @@ duplexer3@^0.1.4: integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= duplexer@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== duplexify@^3.4.2, duplexify@^3.6.0: version "3.7.1" @@ -7121,10 +7524,17 @@ ejs@^2.7.4: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== -electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.483: - version "1.3.483" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.483.tgz#9269e7cfc1c8e72709824da171cbe47ca5e3ca9e" - integrity sha512-+05RF8S9rk8S0G8eBCqBRBaRq7+UN3lDs2DAvnG8SBSgQO3hjy0+qt4CmRk5eiuGbTcaicgXfPmBi31a+BD3lg== +ejs@^3.1.2: + version "3.1.5" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.5.tgz#aed723844dc20acb4b170cd9ab1017e476a0d93b" + integrity sha512-dldq3ZfFtgVTJMLjOe+/3sROTzALlL9E34V4/sDtUd/KlBSS0s6U1/+WPE1B4sj9CXHJpL1M6rhNJnc9Wbal9w== + dependencies: + jake "^10.6.1" + +electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.571: + version "1.3.576" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.576.tgz#2e70234484e03d7c7e90310d7d79fd3775379c34" + integrity sha512-uSEI0XZ//5ic+0NdOqlxp0liCD44ck20OAGyLMSymIWTEAtHKVJi6JM18acOnRgUgX7Q65QqnI+sNncNvIy8ew== elegant-spinner@^1.0.1: version "1.0.1" @@ -7138,7 +7548,7 @@ element-resize-detector@^1.2.1: dependencies: batch-processor "1.0.0" -elliptic@^6.0.0, elliptic@^6.5.2: +elliptic@^6.5.3: version "6.5.3" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== @@ -7202,11 +7612,11 @@ encodeurl@~1.0.2: integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: - iconv-lite "~0.4.13" + iconv-lite "^0.6.2" end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" @@ -7215,10 +7625,19 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" -enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0, enhanced-resolve@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.2.0.tgz#5d43bda4a0fd447cb0ebbe71bef8deff8805ad0d" - integrity sha512-S7eiFb/erugyd1rLb6mQ3Vuq+EXHv5cpCkNqqIkYkBgN2QdFnyCZzFBleqwGEx4lgNGYij81BWnCrFNK7vxvjQ== +endent@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/endent/-/endent-2.0.1.tgz#fb18383a3f37ae3213a5d9f6c4a880d1061eb4c5" + integrity sha512-mADztvcC+vCk4XEZaCz6xIPO2NHQuprv5CAEjuVAu6aZwqAj7nVNlMyl1goPFYqCCpS2OJV9jwpumJLkotZrNw== + dependencies: + dedent "^0.7.0" + fast-json-parse "^1.0.3" + objectorarray "^1.0.4" + +enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.1, enhanced-resolve@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" + integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== dependencies: graceful-fs "^4.1.2" memory-fs "^0.5.0" @@ -7267,19 +7686,37 @@ error-ex@^1.2.0, error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.17.0, es-abstract@^1.17.0-next.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.4, es-abstract@^1.17.5: - version "1.17.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" - integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== + version "1.17.7" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" + integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.1" - is-callable "^1.2.0" - is-regex "^1.1.0" - object-inspect "^1.7.0" + is-callable "^1.2.2" + is-regex "^1.1.1" + object-inspect "^1.8.0" object-keys "^1.1.1" - object.assign "^4.1.0" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-abstract@^1.18.0-next.0, es-abstract@^1.18.0-next.1: + version "1.18.0-next.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" + integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-negative-zero "^2.0.0" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" string.prototype.trimend "^1.0.1" string.prototype.trimstart "^1.0.1" @@ -7310,11 +7747,29 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es5-ext@^0.10.35, es5-ext@^0.10.50: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + es5-shim@^4.5.13: version "4.5.14" resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.5.14.tgz#90009e1019d0ea327447cb523deaff8fe45697ef" integrity sha512-7SwlpL+2JpymWTt8sNLuC2zdhhc+wrfe5cMPI2j0o6WsPdfAiPwmFy2f0AocPB4RQVBOZ9kNTgi5YF7TdhkvEg== +es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + es6-promise@^3.0.2: version "3.3.1" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" @@ -7337,10 +7792,18 @@ es6-shim@^0.35.5: resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.5.tgz#46f59dc0a84a1c5029e8ff1166ca0a902077a9ab" integrity sha512-E9kK/bjtCQRpN1K28Xh4BlmP8egvZBGJJ+9GtnzOwt7mdqtrjHFuVGr7QJfdjBIKqrlU5duPf3pCBoDrkjVYFg== -escalade@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.1.tgz#52568a77443f6927cd0ab9c73129137533c965ed" - integrity sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA== +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +escalade@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.0.tgz#e8e2d7c7a8b76f6ee64c2181d6b8151441602d4e" + integrity sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig== escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" @@ -7352,6 +7815,11 @@ 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: + 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== + escodegen@^1.11.1: version "1.14.3" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" @@ -7461,21 +7929,21 @@ esquery@^1.0.1: estraverse "^5.1.0" esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - estraverse "^4.1.0" + estraverse "^5.2.0" -estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" - integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== esutils@^1.1.6: version "1.1.6" @@ -7498,14 +7966,14 @@ eventemitter3@^3.1.0: integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== eventemitter3@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" - integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== events@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" - integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" + integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== eventsource@^1.0.7: version "1.0.7" @@ -7583,9 +8051,9 @@ execa@^3.2.0: strip-final-newline "^2.0.0" execa@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.2.tgz#ad87fb7b2d9d564f70d2b62d511bee41d5cbb240" - integrity sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q== + version "4.0.3" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.3.tgz#0a34dabbad6d66100bd6f2c576c8669403f317f2" + integrity sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A== dependencies: cross-spawn "^7.0.0" get-stream "^5.0.0" @@ -7674,6 +8142,13 @@ express@^4.14.0, express@^4.17.0: utils-merge "1.0.1" vary "~1.1.2" +ext@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + dependencies: + type "^2.0.0" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -7752,6 +8227,11 @@ fast-glob@^3.1.1: micromatch "^4.0.2" picomatch "^2.2.1" +fast-json-parse@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fast-json-parse/-/fast-json-parse-1.0.3.tgz#43e5c61ee4efa9265633046b770fb682a7577c4d" + integrity sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw== + fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -7892,6 +8372,14 @@ file-loader@^4.2.0: loader-utils "^1.2.3" schema-utils "^2.5.0" +file-loader@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.1.0.tgz#65b9fcfb0ea7f65a234a1f10cdd7f1ab9a33f253" + integrity sha512-26qPdHyTsArQ6gU4P1HJbAbnFTyT2r0pG7czh1GFAd9TZbj0n94wWbupgixZH/ET/meqi2/5+F7DhW4OAXD+Lg== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.7.1" + file-system-cache@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/file-system-cache/-/file-system-cache-1.0.5.tgz#84259b36a2bbb8d3d6eb1021d3132ffe64cfff4f" @@ -7916,11 +8404,23 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== +filelist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.1.tgz#f10d1a3ae86c1694808e8f20906f43d4c9132dbb" + integrity sha512-8zSK6Nu0DQIC08mUC46sWGXi+q3GGpKydAG36k+JDba6VRpkevvOWUW5a/PhShij4+vHT9M+ghgG7eM+a9JDUQ== + dependencies: + minimatch "^3.0.4" + filesize@3.6.1: version "3.6.1" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== +filesize@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.0.1.tgz#f850b509909c7c86f7e450ea19006c31c2ed3d2f" + integrity sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg== + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -7960,7 +8460,7 @@ find-cache-dir@^1.0.0: make-dir "^1.0.0" pkg-dir "^2.0.0" -find-cache-dir@^2.1.0: +find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== @@ -8000,14 +8500,7 @@ find-up@3.0.0, find-up@^3.0.0: dependencies: locate-path "^3.0.0" -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - -find-up@^4.0.0, find-up@^4.1.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== @@ -8015,6 +8508,13 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + find-versions@^3.0.0, find-versions@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e" @@ -8107,7 +8607,21 @@ fork-ts-checker-webpack-plugin@1.5.0: tapable "^1.0.0" worker-rpc "^0.1.0" -fork-ts-checker-webpack-plugin@^4.0.3: +fork-ts-checker-webpack-plugin@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz#a1642c0d3e65f50c2cc1742e9c0a80f441f86b19" + integrity sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ== + dependencies: + babel-code-frame "^6.22.0" + chalk "^2.4.1" + chokidar "^3.3.0" + micromatch "^3.1.10" + minimatch "^3.0.4" + semver "^5.6.0" + tapable "^1.0.0" + worker-rpc "^0.1.0" + +fork-ts-checker-webpack-plugin@^4.0.3, fork-ts-checker-webpack-plugin@^4.1.4: 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== @@ -8120,6 +8634,15 @@ fork-ts-checker-webpack-plugin@^4.0.3: tapable "^1.0.0" worker-rpc "^0.1.0" +form-data@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" + integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -8280,7 +8803,7 @@ functions-have-names@^1.2.0: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.1.tgz#a981ac397fa0c9964551402cdc5533d7a4d52f91" integrity sha512-j48B/ZI7VKs3sgeI2cZp7WXWmZXu7Iq5pl5/vptV5N2mq+DGFuS/ulaDjtaoLpYzuD6u8UgrUKHfgo7fDTSiBA== -fuse.js@^3.4.6: +fuse.js@^3.4.6, fuse.js@^3.6.1: version "3.6.1" resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.6.1.tgz#7de85fdd6e1b3377c23ce010892656385fd9b10c" integrity sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw== @@ -8314,7 +8837,7 @@ gensync@^1.0.0-beta.1: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== -gentle-fs@^2.3.0: +gentle-fs@^2.3.0, gentle-fs@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/gentle-fs/-/gentle-fs-2.3.1.tgz#11201bf66c18f930ddca72cf69460bdfa05727b1" integrity sha512-OlwBBwqCFPcjm33rF2BjW+Pr6/ll2741l+xooiwTCeaX2CA1ZuclavyMBe0/KlR21/XGsgY6hzEQZ15BdNa13Q== @@ -8377,9 +8900,9 @@ get-stream@^4.0.0, get-stream@^4.1.0: pump "^3.0.0" get-stream@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" - integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" @@ -8453,6 +8976,13 @@ glob-parent@^5.1.0, glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" +glob-promise@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/glob-promise/-/glob-promise-3.4.0.tgz#b6b8f084504216f702dc2ce8c9bc9ac8866fdb20" + integrity sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw== + dependencies: + "@types/glob" "*" + glob-to-regexp@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" @@ -8643,11 +9173,11 @@ har-schema@^2.0.0: integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: - ajv "^6.5.5" + ajv "^6.12.3" har-schema "^2.0.0" hard-rejection@^2.1.0: @@ -8677,7 +9207,7 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.0, has-symbols@^1.0.1: +has-symbols@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== @@ -8777,6 +9307,11 @@ highlight.js@~9.13.0: resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.13.1.tgz#054586d53a6863311168488a0f58d6c505ce641e" integrity sha512-Sc28JNQNDzaH6PORtRLMvif9RSn1mYuOoX3omVjnb0+HbpPygU2ALBI0R/wsiqCb4/fcp07Gdo8g+fhtFrQl6A== +highlight.js@~9.15.0, highlight.js@~9.15.1: + version "9.15.10" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.15.10.tgz#7b18ed75c90348c045eef9ed08ca1319a2219ad2" + integrity sha512-RoV7OkQm0T3os3Dd2VHLNMoaoDVx77Wygln3n9l5YV172XonWG6rgQD3XnF/BuFFZw9A0TJgmMSO8FEWQgvcXw== + history@^4.9.0: version "4.10.1" resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" @@ -8828,11 +9363,11 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.7.1, hosted-git-info@^2.8.8: integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== hosted-git-info@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.4.tgz#be4973eb1fd2737b11c9c7c19380739bb249f60d" - integrity sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ== + version "3.0.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.5.tgz#bea87905ef7317442e8df3087faa3c842397df03" + integrity sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ== dependencies: - lru-cache "^5.1.1" + lru-cache "^6.0.0" html-encoding-sniffer@^1.0.2: version "1.0.2" @@ -8908,10 +9443,10 @@ html-webpack-plugin@^3.2.0: toposort "^1.0.0" util.promisify "1.0.0" -html-webpack-plugin@^4.0.0-beta.2: - version "4.3.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.3.0.tgz#53bf8f6d696c4637d5b656d3d9863d89ce8174fd" - integrity sha512-C0fzKN8yQoVLTelcJxZfJCE+aAvQiY2VUf3UuKrR4a9k5UMWYOtpDLsaXwATbcVCnI05hUS7L9ULQHWLZhyi3w== +html-webpack-plugin@^4.0.0-beta.2, html-webpack-plugin@^4.2.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz#625097650886b97ea5dae331c320e3238f6c121c" + integrity sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw== dependencies: "@types/html-minifier-terser" "^5.0.0" "@types/tapable" "^1.0.5" @@ -9027,14 +9562,14 @@ humanize-ms@^1.2.1: ms "^2.0.0" husky@^4.2.5: - version "4.2.5" - resolved "https://registry.yarnpkg.com/husky/-/husky-4.2.5.tgz#2b4f7622673a71579f901d9885ed448394b5fa36" - integrity sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.0.tgz#0b2ec1d66424e9219d359e26a51c58ec5278f0de" + integrity sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA== dependencies: chalk "^4.0.0" ci-info "^2.0.0" compare-versions "^3.6.0" - cosmiconfig "^6.0.0" + cosmiconfig "^7.0.0" find-versions "^3.2.0" opencollective-postinstall "^2.0.2" pkg-dir "^4.2.0" @@ -9043,17 +9578,24 @@ husky@^4.2.5: which-pm-runs "^1.0.0" hyphenate-style-name@^1.0.0, hyphenate-style-name@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz#097bb7fa0b8f1a9cf0bd5c734cf95899981a9b48" - integrity sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ== + version "1.0.4" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" + integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + icss-utils@^4.0.0, icss-utils@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" @@ -9135,7 +9677,7 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.0.0, import-fresh@^3.1.0: +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== @@ -9178,7 +9720,7 @@ import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" -imurmurhash@^0.1.4: +imurmurhash@*, imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= @@ -9264,6 +9806,25 @@ inquirer@6.5.0: strip-ansi "^5.1.0" through "^2.3.6" +inquirer@7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" + integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + inquirer@^6.2.2: version "6.5.2" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" @@ -9284,20 +9845,20 @@ inquirer@^6.2.2: through "^2.3.6" inquirer@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.2.0.tgz#63ce99d823090de7eb420e4bb05e6f3449aa389a" - integrity sha512-E0c4rPwr9ByePfNlTIB8z51kK1s2n6jrHuJeEHENl/sbq2G/S1auvibgEwNR4uSyiU+PiYHqSwsgGiXjG8p5ZQ== + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== dependencies: ansi-escapes "^4.2.1" - chalk "^3.0.0" + chalk "^4.1.0" cli-cursor "^3.1.0" - cli-width "^2.0.0" + cli-width "^3.0.0" external-editor "^3.0.3" figures "^3.0.0" - lodash "^4.17.15" + lodash "^4.17.19" mute-stream "0.0.8" run-async "^2.4.0" - rxjs "^6.5.3" + rxjs "^6.6.0" string-width "^4.1.0" strip-ansi "^6.0.0" through "^2.3.6" @@ -9351,11 +9912,6 @@ invert-kv@^1.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - ip-regex@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" @@ -9442,10 +9998,10 @@ is-buffer@^2.0.2, is-buffer@^2.0.3: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== -is-callable@^1.1.4, is-callable@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" - integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== +is-callable@^1.1.4, is-callable@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" + integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== is-ci@^1.0.10: version "1.2.1" @@ -9516,9 +10072,9 @@ is-directory@^0.3.1: integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= is-docker@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b" - integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" + integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== is-dom@^1.0.9: version "1.1.0" @@ -9567,7 +10123,7 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-function@^1.0.1: +is-function@^1.0.1, is-function@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== @@ -9621,6 +10177,11 @@ is-map@^2.0.1: resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw== +is-negative-zero@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" + integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= + is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" @@ -9643,6 +10204,11 @@ is-obj@^1.0.0, is-obj@^1.0.1: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + is-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" @@ -9679,6 +10245,11 @@ is-plain-object@^3.0.0: 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-promise@^2.1.0: version "2.2.2" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" @@ -9689,10 +10260,10 @@ is-redirect@^1.0.0: resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= -is-regex@^1.0.4, is-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" - integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== +is-regex@^1.0.4, is-regex@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== dependencies: has-symbols "^1.0.1" @@ -9887,6 +10458,16 @@ iterate-value@^1.0.0: es-get-iterator "^1.0.2" iterate-iterator "^1.0.1" +jake@^10.6.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b" + integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== + dependencies: + async "0.9.x" + chalk "^2.4.2" + filelist "^1.0.1" + minimatch "^3.0.4" + java-properties@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-1.0.2.tgz#ccd1fa73907438a5b5c38982269d0e771fe78211" @@ -9951,7 +10532,7 @@ jest-config@^25.5.4: pretty-format "^25.5.0" realpath-native "^2.0.0" -jest-diff@^25.1.0, jest-diff@^25.2.1, jest-diff@^25.5.0: +jest-diff@^25.2.1, jest-diff@^25.5.0: version "25.5.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.5.0.tgz#1dd26ed64f96667c068cef026b677dfa01afcfa9" integrity sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A== @@ -10069,7 +10650,7 @@ jest-leak-detector@^25.5.0: jest-get-type "^25.2.6" pretty-format "^25.5.0" -jest-matcher-utils@^25.1.0, jest-matcher-utils@^25.5.0: +jest-matcher-utils@^25.5.0: version "25.5.0" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz#fbc98a12d730e5d2453d7f1ed4a4d948e34b7867" integrity sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw== @@ -10272,6 +10853,15 @@ jest-worker@^25.4.0, jest-worker@^25.5.0: merge-stream "^2.0.0" supports-color "^7.0.0" +jest-worker@^26.2.1: + version "26.3.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.3.0.tgz#7c8a97e4f4364b4f05ed8bca8ca0c24de091871f" + integrity sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + jest@^25.5.0: version "25.5.4" resolved "https://registry.yarnpkg.com/jest/-/jest-25.5.4.tgz#f21107b6489cfe32b076ce2adcadee3587acb9db" @@ -10399,6 +10989,11 @@ json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-bet resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -10487,72 +11082,72 @@ jsprim@^1.2.2: verror "1.10.0" jss-plugin-camel-case@^10.0.3: - version "10.3.0" - resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.3.0.tgz#ae4da53b39a6e3ea94b70a20fc41c11f0b87386a" - integrity sha512-tadWRi/SLWqLK3EUZEdDNJL71F3ST93Zrl9JYMjV0QDqKPAl0Liue81q7m/nFUpnSTXczbKDy4wq8rI8o7WFqA== + version "10.4.0" + resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.4.0.tgz#46c75ff7fd61c304984c21af5817823f0f501ceb" + integrity sha512-9oDjsQ/AgdBbMyRjc06Kl3P8lDCSEts2vYZiPZfGAxbGCegqE4RnMob3mDaBby5H9vL9gWmyyImhLRWqIkRUCw== dependencies: "@babel/runtime" "^7.3.1" hyphenate-style-name "^1.0.3" - jss "^10.3.0" + jss "10.4.0" jss-plugin-default-unit@^10.0.3: - version "10.3.0" - resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.3.0.tgz#cd74cf5088542620a82591f76c62c6b43a7e50a6" - integrity sha512-tT5KkIXAsZOSS9WDSe8m8lEHIjoEOj4Pr0WrG0WZZsMXZ1mVLFCSsD2jdWarQWDaRNyMj/I4d7czRRObhOxSuw== + version "10.4.0" + resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.4.0.tgz#2b10f01269eaea7f36f0f5fd1cfbfcc76ed42854" + integrity sha512-BYJ+Y3RUYiMEgmlcYMLqwbA49DcSWsGgHpVmEEllTC8MK5iJ7++pT9TnKkKBnNZZxTV75ycyFCR5xeLSOzVm4A== dependencies: "@babel/runtime" "^7.3.1" - jss "^10.3.0" + jss "10.4.0" jss-plugin-global@^10.0.3: - version "10.3.0" - resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.3.0.tgz#6b883e74900bb71f65ac2b19bea78f7d1e85af3f" - integrity sha512-etYTG/y3qIR/vxZnKY+J3wXwObyBDNhBiB3l/EW9/pE3WHE//BZdK8LFvQcrCO48sZW1Z6paHo6klxUPP7WbzA== + version "10.4.0" + resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.4.0.tgz#19449425a94e4e74e113139b629fd44d3577f97d" + integrity sha512-b8IHMJUmv29cidt3nI4bUI1+Mo5RZE37kqthaFpmxf5K7r2aAegGliAw4hXvA70ca6ckAoXMUl4SN/zxiRcRag== dependencies: "@babel/runtime" "^7.3.1" - jss "^10.3.0" + jss "10.4.0" jss-plugin-nested@^10.0.3: - version "10.3.0" - resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.3.0.tgz#ae8aceac95e09c3d40c991ea32403fb647d9e0a8" - integrity sha512-qWiEkoXNEkkZ+FZrWmUGpf+zBsnEOmKXhkjNX85/ZfWhH9dfGxUCKuJFuOWFM+rjQfxV4csfesq4hY0jk8Qt0w== + version "10.4.0" + resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.4.0.tgz#017d0c02c0b6b454fd9d7d3fc33470a15eea9fd1" + integrity sha512-cKgpeHIxAP0ygeWh+drpLbrxFiak6zzJ2toVRi/NmHbpkNaLjTLgePmOz5+67ln3qzJiPdXXJB1tbOyYKAP4Pw== dependencies: "@babel/runtime" "^7.3.1" - jss "^10.3.0" + jss "10.4.0" tiny-warning "^1.0.2" jss-plugin-props-sort@^10.0.3: - version "10.3.0" - resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.3.0.tgz#5b0625f87b6431a7969c56b0d8c696525969bfe4" - integrity sha512-boetORqL/lfd7BWeFD3K+IyPqyIC+l3CRrdZr+NPq7Noqp+xyg/0MR7QisgzpxCEulk+j2CRcEUoZsvgPC4nTg== + version "10.4.0" + resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.4.0.tgz#7110bf0b6049cc2080b220b506532bf0b70c0e07" + integrity sha512-j/t0R40/2fp+Nzt6GgHeUFnHVY2kPGF5drUVlgkcwYoHCgtBDOhTTsOfdaQFW6sHWfoQYgnGV4CXdjlPiRrzwA== dependencies: "@babel/runtime" "^7.3.1" - jss "^10.3.0" + jss "10.4.0" jss-plugin-rule-value-function@^10.0.3: - version "10.3.0" - resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.3.0.tgz#498b0e2bae16cb316a6bdb73fd783cf9604ba747" - integrity sha512-7WiMrKIHH3rwxTuJki9+7nY11r1UXqaUZRhHvqTD4/ZE+SVhvtD5Tx21ivNxotwUSleucA/8boX+NF21oXzr5Q== + version "10.4.0" + resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.4.0.tgz#7cff4a91e84973536fa49b6ebbdbf7f339b01c82" + integrity sha512-w8504Cdfu66+0SJoLkr6GUQlEb8keHg8ymtJXdVHWh0YvFxDG2l/nS93SI5Gfx0fV29dO6yUugXnKzDFJxrdFQ== dependencies: "@babel/runtime" "^7.3.1" - jss "^10.3.0" + jss "10.4.0" tiny-warning "^1.0.2" jss-plugin-vendor-prefixer@^10.0.3: - version "10.3.0" - resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.3.0.tgz#b09c13a4d05a055429d8a24e19cc01ce049f0ed4" - integrity sha512-sZQbrcZyP5V0ADjCLwUA1spVWoaZvM7XZ+2fSeieZFBj31cRsnV7X70FFDerMHeiHAXKWzYek+67nMDjhrZAVQ== + version "10.4.0" + resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.4.0.tgz#2a78f3c5d57d1e024fe7ad7c41de34d04e72ecc0" + integrity sha512-DpF+/a+GU8hMh/948sBGnKSNfKkoHg2p9aRFUmyoyxgKjOeH9n74Ht3Yt8lOgdZsuWNJbPrvaa3U4PXKwxVpTQ== dependencies: "@babel/runtime" "^7.3.1" css-vendor "^2.0.8" - jss "^10.3.0" + jss "10.4.0" -jss@^10.0.3, jss@^10.3.0: - version "10.3.0" - resolved "https://registry.yarnpkg.com/jss/-/jss-10.3.0.tgz#2cf7be265f72b59c1764d816fdabff1c5dd18326" - integrity sha512-B5sTRW9B6uHaUVzSo9YiMEOEp3UX8lWevU0Fsv+xtRnsShmgCfIYX44bTH8bPJe6LQKqEXku3ulKuHLbxBS97Q== +jss@10.4.0, jss@^10.0.3: + version "10.4.0" + resolved "https://registry.yarnpkg.com/jss/-/jss-10.4.0.tgz#473a6fbe42e85441020a07e9519dac1e8a2e79ca" + integrity sha512-l7EwdwhsDishXzqTc3lbsbyZ83tlUl5L/Hb16pHCvZliA9lRDdNBZmHzeJHP0sxqD0t1mrMmMR8XroR12JBYzw== dependencies: "@babel/runtime" "^7.3.1" - csstype "^2.6.5" + csstype "^3.0.2" is-in-browser "^1.1.3" tiny-warning "^1.0.2" @@ -10639,13 +11234,6 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - leven@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" @@ -10671,7 +11259,7 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -libcipm@^4.0.7: +libcipm@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-4.0.8.tgz#dcea4919e10dfbce420327e63901613b9141bc89" integrity sha512-IN3hh2yDJQtZZ5paSV4fbvJg4aHxCCg5tcZID/dSVlTuUiWktsgaldVljJv6Z5OUlYspx6xQkbR0efNodnIrOA== @@ -10791,10 +11379,10 @@ libnpmteam@^1.0.2: get-stream "^4.0.0" npm-registry-fetch "^4.0.0" -libnpx@^10.2.2: - version "10.2.3" - resolved "https://registry.yarnpkg.com/libnpx/-/libnpx-10.2.3.tgz#d5e01f12d383ffca9a947807ca6a8f587d38fe2c" - integrity sha512-bCvdARu55fLQBhMfcYGF0GznF1kB2sqxq/9zKZ3652M8DDFWpVpCnpgzjzn0yWMDMez5ZGMBiX24yR11uEYZVQ== +libnpx@^10.2.4: + version "10.2.4" + resolved "https://registry.yarnpkg.com/libnpx/-/libnpx-10.2.4.tgz#ef0e3258e29aef2ec7ee3276115e20e67f67d4ee" + integrity sha512-BPc0D1cOjBeS8VIBKUu5F80s6njm0wbVt7CsGMrIcJ+SI7pi7V0uVPGpEMH9H5L8csOcclTxAXFE2VAsJXUhfA== dependencies: dotenv "^5.0.1" npm-package-arg "^6.0.0" @@ -10803,7 +11391,7 @@ libnpx@^10.2.2: update-notifier "^2.3.0" which "^1.3.0" y18n "^4.0.0" - yargs "^11.0.0" + yargs "^14.2.3" lines-and-columns@^1.1.6: version "1.1.6" @@ -10890,9 +11478,9 @@ listr@^0.14.1: rxjs "^6.3.3" load-bmfont@^1.2.3, load-bmfont@^1.3.1, load-bmfont@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.0.tgz#75f17070b14a8c785fe7f5bee2e6fd4f98093b6b" - integrity sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g== + version "1.4.1" + resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.1.tgz#c0f5f4711a1e2ccff725a7b6078087ccfcddd3e9" + integrity sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA== dependencies: buffer-equal "0.0.1" mime "^1.3.4" @@ -10989,9 +11577,9 @@ locate-path@^5.0.0: p-locate "^4.1.0" lock-verify@^2.0.2, lock-verify@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.2.0.tgz#12432feb68bb647071c78c44bde16029a0f7d935" - integrity sha512-BhM1Vqsu7x0s+EalTifNjdDPks+ZjdAhComvnA6VcCIlDOI5ouELXqAe1BYuEIP4zGN0W08xVm6byJV1LnCiJg== + version "2.2.1" + resolved "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.2.1.tgz#81107948c51ed16f97b96ff8b60675affb243fc1" + integrity sha512-n0Zw2DVupKfZMazy/HIFVNohJ1z8fIoZ77WBnyyBGG6ixw83uJNyrbiJvvHWe1QKkGiBCjj8RCPlymltliqEww== dependencies: "@iarna/cli" "^1.2.0" npm-package-arg "^6.1.0" @@ -11017,6 +11605,11 @@ lodash._basecopy@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY= +lodash._baseindexof@*: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" + integrity sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw= + lodash._baseuniq@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" @@ -11025,11 +11618,16 @@ lodash._baseuniq@~4.6.0: lodash._createset "~4.0.0" lodash._root "~3.0.0" -lodash._bindcallback@^3.0.0: +lodash._bindcallback@*, lodash._bindcallback@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= +lodash._cacheindexof@*: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" + integrity sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI= + lodash._createassigner@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" @@ -11039,12 +11637,19 @@ lodash._createassigner@^3.0.0: lodash._isiterateecall "^3.0.0" lodash.restparam "^3.0.0" +lodash._createcache@*: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" + integrity sha1-VtagZAF2JeeevKa4AY4XRAvc8JM= + dependencies: + lodash._getnative "^3.0.0" + lodash._createset@~4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY= -lodash._getnative@^3.0.0: +lodash._getnative@*, lodash._getnative@^3.0.0: version "3.9.1" resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= @@ -11165,7 +11770,7 @@ lodash.memoize@4.x, lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.restparam@^3.0.0: +lodash.restparam@*, lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= @@ -11230,10 +11835,10 @@ lodash@4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -lodash@^4.0.1, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1: - version "4.17.19" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" - integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== +lodash@^4.0.1, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== log-symbols@^1.0.2: version "1.0.2" @@ -11242,7 +11847,7 @@ log-symbols@^1.0.2: dependencies: chalk "^1.0.0" -log-symbols@^2.2.0: +log-symbols@^2.1.0, log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== @@ -11258,6 +11863,14 @@ log-update@^2.3.0: cli-cursor "^2.0.0" wrap-ansi "^3.0.1" +loglevelnext@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/loglevelnext/-/loglevelnext-1.0.5.tgz#36fc4f5996d6640f539ff203ba819641680d75a2" + integrity sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A== + dependencies: + es6-symbol "^3.1.1" + object.assign "^4.1.0" + lolex@^5.0.0: version "5.1.2" resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" @@ -11270,7 +11883,7 @@ long@^4.0.0: resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.0, loose-envify@^1.3.1, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -11307,6 +11920,14 @@ lowercase-keys@^1.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== +lowlight@1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.12.1.tgz#014acf8dd73a370e02ff1cc61debcde3bb1681eb" + integrity sha512-OqaVxMGIESnawn+TU/QMV5BJLbUghUfjDWPAtFqDYDmDtr4FnB+op8xM+pR7nKlauHNUHXGt0VgWatFB8voS5w== + dependencies: + fault "^1.0.2" + highlight.js "~9.15.0" + lowlight@~1.11.0: version "1.11.0" resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.11.0.tgz#1304d83005126d4e8b1dc0f07981e9b689ec2efc" @@ -11338,10 +11959,17 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + macos-release@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" - integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA== + version "2.4.1" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.4.1.tgz#64033d0ec6a5e6375155a74b1a1eba8e509820ac" + integrity sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg== make-dir@^1.0.0: version "1.3.0" @@ -11394,13 +12022,6 @@ makeerror@1.0.x: dependencies: tmpl "1.0.x" -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -11454,9 +12075,9 @@ marked-terminal@^4.0.0: supports-hyperlinks "^2.1.0" marked@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-1.1.0.tgz#62504ad4d11550c942935ccc5e39d64e5a4c4e50" - integrity sha512-EkE7RW6KcXfMHy2PA7Jg0YJE1l8UPEZE8k45tylzmZM30/r1M1MUXWQfJlrSbsTeh7m/XTwHbWUENvAJZpp1YA== + version "1.2.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-1.2.0.tgz#7221ce2395fa6cf6d722e6f2871a32d3513c85ca" + integrity sha512-tiRxakgbNPBr301ihe/785NntvYyhxlqcL3YaC8CaxJQh7kiaEtrN9B/eK2I2943Yjkh5gw25chYFDQhOMCwMA== matchmediaquery@^0.2.1: version "0.2.1" @@ -11489,10 +12110,10 @@ mdn-data@2.0.6: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== -meant@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/meant/-/meant-1.0.1.tgz#66044fea2f23230ec806fb515efea29c44d2115d" - integrity sha512-UakVLFjKkbbUwNWJ2frVLnnAtbb7D7DsloxRd3s/gDpI8rdv8W5Hp3NaDb+POBI1fQdeussER6NB8vpcRURvlg== +meant@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/meant/-/meant-1.0.2.tgz#5d0c78310a3d8ae1408a16be0fe0bd42a969f560" + integrity sha512-KN+1uowN/NK+sT/Lzx7WSGIj2u+3xe5n2LbwObfjOhPZiA+cCfCm6idVl0RkEfjThkw5XJ96CyRcanq6GmKtUg== media-typer@0.3.0: version "0.3.0" @@ -11506,15 +12127,6 @@ mem@^1.1.0: dependencies: mimic-fn "^1.0.0" -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - memoize-one@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0" @@ -11559,17 +12171,15 @@ meow@5.0.0: yargs-parser "^10.0.0" meow@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-7.0.1.tgz#1ed4a0a50b3844b451369c48362eb0515f04c1dc" - integrity sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw== + version "7.1.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-7.1.1.tgz#7c01595e3d337fcb0ec4e8eed1666ea95903d306" + integrity sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA== dependencies: "@types/minimist" "^1.2.0" - arrify "^2.0.1" - camelcase "^6.0.0" camelcase-keys "^6.2.2" decamelize-keys "^1.1.0" hard-rejection "^2.1.0" - minimist-options "^4.0.2" + minimist-options "4.1.0" normalize-package-data "^2.5.0" read-pkg-up "^7.0.1" redent "^3.0.0" @@ -11632,7 +12242,7 @@ mime-db@1.44.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== -mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: +mime-types@^2.1.12, mime-types@^2.1.26, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.27" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== @@ -11654,7 +12264,7 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -mimic-fn@^2.0.0, mimic-fn@^2.1.0: +mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== @@ -11684,16 +12294,6 @@ mini-create-react-context@^0.4.0: "@babel/runtime" "^7.5.5" tiny-warning "^1.0.3" -mini-css-extract-plugin@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.7.0.tgz#5ba8290fbb4179a43dd27cca444ba150bee743a0" - integrity sha512-RQIw6+7utTYn8DBGsf/LpRgZCJMpZt+kuawJ/fju0KiOL6nAaTBNmCJwS7HtwSCXfS47gCkmtBFS7HdsquhdxQ== - dependencies: - loader-utils "^1.1.0" - normalize-url "1.9.1" - schema-utils "^1.0.0" - webpack-sources "^1.1.0" - mini-css-extract-plugin@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e" @@ -11721,15 +12321,7 @@ minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist-options@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - -minimist-options@^4.0.2: +minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== @@ -11738,6 +12330,14 @@ minimist-options@^4.0.2: is-plain-obj "^1.1.0" kind-of "^6.0.3" +minimist-options@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" + integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -11763,9 +12363,9 @@ minipass-flush@^1.0.5: minipass "^3.0.0" minipass-pipeline@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz#55f7839307d74859d6e8ada9c3ebe72cec216a34" - integrity sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ== + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== dependencies: minipass "^3.0.0" @@ -11791,6 +12391,14 @@ minizlib@^1.2.1: dependencies: minipass "^2.9.0" +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + mississippi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" @@ -11858,22 +12466,27 @@ mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~ dependencies: minimist "^1.2.5" +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + modify-values@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== -moment-timezone@^0.5.28: +moment-timezone@*, moment-timezone@^0.5.28: version "0.5.31" resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.31.tgz#9c40d8c5026f0c7ab46eda3d63e49c155148de05" integrity sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA== dependencies: moment ">= 2.9.0" -"moment@>= 2.9.0", moment@>=2.14.0, moment@^2.18.1: - version "2.27.0" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.27.0.tgz#8bff4e3e26a236220dfe3e36de756b6ebaa0105d" - integrity sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ== +"moment@>= 2.9.0", moment@^2.18.1: + version "2.29.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.0.tgz#fcbef955844d91deb55438613ddcec56e86a3425" + integrity sha512-z6IJ5HXYiuxvFTI6eiQ9dm77uE0gyy1yXNApVHqTcnIKfY9tIwEjlzsZ6u1LQXvVgKeTnv9Xm7NDvJ7lso3MtA== morgan@^1.8.2: version "1.10.0" @@ -11908,7 +12521,7 @@ ms@2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@^2.0.0, ms@^2.1.1: +ms@2.1.2, ms@^2.0.0, ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== @@ -11944,15 +12557,20 @@ negotiator@0.6.2: integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== nerf-dart@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/nerf-dart/-/nerf-dart-1.0.0.tgz#e6dab7febf5ad816ea81cf5c629c5a0ebde72c1a" integrity sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo= +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -11974,9 +12592,9 @@ no-case@^3.0.3: tslib "^1.10.0" node-abi@^2.7.0: - version "2.18.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.18.0.tgz#1f5486cfd7d38bd4f5392fa44a4ad4d9a0dffbf4" - integrity sha512-yi05ZoiuNNEbyT/xXfSySZE+yVnQW6fxPZuFbLyS1s6b5Kw3HzV2PHOM4XR+nsjzkHxByK+2Wg+yCQbe35l8dw== + version "2.19.1" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.19.1.tgz#6aa32561d0a5e2fdb6810d8c25641b657a8cea85" + integrity sha512-HbtmIuByq44yhAzK7b9j/FelKlHYISKQn0mtvcBrU5QBkhoCMp5bu8Hv5AI34DcKfOAcJBcOEMwLlwO62FFu9A== dependencies: semver "^5.4.1" @@ -12011,10 +12629,10 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" -node-fetch@^2.3.0, node-fetch@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" - integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== +node-fetch@^2.6.0, node-fetch@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== node-gyp@^5.0.2, node-gyp@^5.1.0: version "5.1.1" @@ -12083,10 +12701,10 @@ node-notifier@^6.0.0: shellwords "^0.1.1" which "^1.3.1" -node-releases@^1.1.29, node-releases@^1.1.58: - version "1.1.58" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.58.tgz#8ee20eef30fa60e52755fcc0942def5a734fe935" - integrity sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg== +node-releases@^1.1.29, node-releases@^1.1.52, node-releases@^1.1.61: + version "1.1.61" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.61.tgz#707b0fca9ce4e11783612ba4a2fcba09047af16e" + integrity sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g== noop-logger@^0.1.1: version "0.1.1" @@ -12146,11 +12764,11 @@ normalize-url@1.9.1: sort-keys "^1.0.0" normalize-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-5.0.0.tgz#f46c9dc20670495e4e18fbd1b4396e41d199f63c" - integrity sha512-bAEm2fx8Dq/a35Z6PIRkkBBJvR56BbEJvhpNtvCZ4W9FyORSna77fn+xtYFjqk5JpBS+fMnAOG/wFgkQBmB7hw== + version "5.2.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-5.2.1.tgz#492a22a8443e604b13cef4b3a97983d66f08bf65" + integrity sha512-bFT2ilr7p37ZPEQ9LO9HP/tdFIAE7Q4UoeojXNKeLjs0vXxZetM+C2K9jdbVS7b6ut66CflVLgk1yqHJVrXmiw== -npm-audit-report@^1.3.2: +npm-audit-report@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-1.3.3.tgz#8226deeb253b55176ed147592a3995442f2179ed" integrity sha512-8nH/JjsFfAWMvn474HB9mpmMjrnKb1Hx/oTAdjv4PT9iZBvBxiZ+wtDUapHCJwLqYGQVPaAfs+vL5+5k9QndXw== @@ -12177,7 +12795,7 @@ npm-install-checks@^3.0.2: dependencies: semver "^2.3.0 || 3.x || 4 || 5" -npm-lifecycle@^3.0.0, npm-lifecycle@^3.1.4: +npm-lifecycle@^3.0.0, npm-lifecycle@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz#9882d3642b8c82c815782a12e6a1bfeed0026309" integrity sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g== @@ -12245,10 +12863,10 @@ npm-profile@^4.0.2, npm-profile@^4.0.4: figgy-pudding "^3.4.1" npm-registry-fetch "^4.0.0" -npm-registry-fetch@^4.0.0, npm-registry-fetch@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-4.0.5.tgz#cb87cf7f25bfb048d6c3ee19d115bebf93ea5bfa" - integrity sha512-yQ0/U4fYpCCqmueB2g8sc+89ckQ3eXpmU4+Yi2j5o/r0WkKvE2+Y0tK3DEILAtn2UaQTkjTHxIXe2/CSdit+/Q== +npm-registry-fetch@^4.0.0, npm-registry-fetch@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz#57951bf6541e0246b34c9f9a38ab73607c9449d7" + integrity sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ== dependencies: JSONStream "^1.3.4" bluebird "^3.5.1" @@ -12286,10 +12904,10 @@ npm-which@^3.0.1: npm-path "^2.0.2" which "^1.2.10" -npm@^6.10.3: - version "6.14.6" - resolved "https://registry.yarnpkg.com/npm/-/npm-6.14.6.tgz#1a81ce1fac2bf5457dbf6342ceed503627ff228f" - integrity sha512-axnz6iHFK6WPE0js/+mRp+4IOwpHn5tJEw5KB6FiCU764zmffrhsYHbSHi2kKqNkRBt53XasXjngZfBD3FQzrQ== +npm@^6.13.0: + version "6.14.8" + resolved "https://registry.yarnpkg.com/npm/-/npm-6.14.8.tgz#64ef754345639bc035982ec3f609353c8539033c" + integrity sha512-HBZVBMYs5blsj94GTeQZel7s9odVuuSUHy1+AlZh7rPVux1os2ashvEGLy/STNK7vUjbrCg5Kq9/GXisJgdf6A== dependencies: JSONStream "^1.3.5" abbrev "~1.1.1" @@ -12297,7 +12915,7 @@ npm@^6.10.3: ansistyles "~0.1.3" aproba "^2.0.0" archy "~1.0.0" - bin-links "^1.1.7" + bin-links "^1.1.8" bluebird "^3.5.5" byte-size "^5.0.1" cacache "^12.0.3" @@ -12317,7 +12935,7 @@ npm@^6.10.3: find-npm-prefix "^1.0.2" fs-vacuum "~1.2.10" fs-write-stream-atomic "~1.0.10" - gentle-fs "^2.3.0" + gentle-fs "^2.3.1" glob "^7.1.6" graceful-fs "^4.2.4" has-unicode "~2.0.1" @@ -12331,14 +12949,14 @@ npm@^6.10.3: is-cidr "^3.0.0" json-parse-better-errors "^1.0.2" lazy-property "~1.0.0" - libcipm "^4.0.7" + libcipm "^4.0.8" libnpm "^3.0.1" libnpmaccess "^3.0.2" libnpmhook "^5.0.3" libnpmorg "^1.0.1" libnpmsearch "^2.0.2" libnpmteam "^1.0.2" - libnpx "^10.2.2" + libnpx "^10.2.4" lock-verify "^2.1.0" lockfile "^1.0.4" lodash._baseuniq "~4.6.0" @@ -12347,22 +12965,22 @@ npm@^6.10.3: lodash.uniq "~4.5.0" lodash.without "~4.4.0" lru-cache "^5.1.1" - meant "~1.0.1" + meant "^1.0.2" mississippi "^3.0.0" mkdirp "^0.5.5" move-concurrently "^1.0.1" node-gyp "^5.1.0" nopt "^4.0.3" normalize-package-data "^2.5.0" - npm-audit-report "^1.3.2" + npm-audit-report "^1.3.3" npm-cache-filename "~1.0.2" npm-install-checks "^3.0.2" - npm-lifecycle "^3.1.4" + npm-lifecycle "^3.1.5" npm-package-arg "^6.1.1" npm-packlist "^1.4.8" npm-pick-manifest "^3.0.2" npm-profile "^4.0.4" - npm-registry-fetch "^4.0.5" + npm-registry-fetch "^4.0.7" npm-user-validate "~1.0.0" npmlog "~4.1.2" once "~1.4.0" @@ -12463,20 +13081,20 @@ object-hash@^1.3.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== -object-inspect@^1.7.0: +object-inspect@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== object-is@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" - integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ== + version "1.1.3" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.3.tgz#2e3b9e65560137455ee3bd62aec4d90a2ea1cc81" + integrity sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg== dependencies: define-properties "^1.1.3" - es-abstract "^1.17.5" + es-abstract "^1.18.0-next.1" -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -12493,15 +13111,15 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== +object.assign@^4.1.0, object.assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd" + integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA== dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.0" + has-symbols "^1.0.1" + object-keys "^1.1.1" object.entries@^1.1.0: version "1.1.2" @@ -12540,6 +13158,11 @@ object.values@^1.1.0: function-bind "^1.1.1" has "^1.0.3" +objectorarray@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/objectorarray/-/objectorarray-1.0.4.tgz#d69b2f0ff7dc2701903d308bb85882f4ddb49483" + integrity sha512-91k8bjcldstRz1bG6zJo8lWD7c6QXcB4nTDUqiEvIL1xAsLoZlOOZZG+nd6YPz+V7zY1580J4Xxh1vZtyv4i/w== + omggif@^1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19" @@ -12572,9 +13195,9 @@ onetime@^2.0.0: mimic-fn "^1.0.0" onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" @@ -12585,10 +13208,10 @@ open@^6.3.0: dependencies: is-wsl "^1.1.0" -open@^7.0.0: - version "7.0.4" - resolved "https://registry.yarnpkg.com/open/-/open-7.0.4.tgz#c28a9d315e5c98340bf979fdcb2e58664aa10d83" - integrity sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ== +open@^7.0.0, open@^7.0.2, open@^7.0.3: + version "7.3.0" + resolved "https://registry.yarnpkg.com/open/-/open-7.3.0.tgz#45461fdee46444f3645b6e14eb3ca94b82e1be69" + integrity sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw== dependencies: is-docker "^2.0.0" is-wsl "^2.1.1" @@ -12599,9 +13222,9 @@ opencollective-postinstall@^2.0.2: integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== opener@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" - integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== optionator@^0.8.1, optionator@^0.8.2: version "0.8.3" @@ -12641,15 +13264,6 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" -os-locale@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - os-name@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" @@ -12671,10 +13285,10 @@ osenv@^0.1.4, osenv@^0.1.5: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= +overlayscrollbars@^1.10.2: + version "1.13.0" + resolved "https://registry.yarnpkg.com/overlayscrollbars/-/overlayscrollbars-1.13.0.tgz#1edb436328133b94877b558f77966d5497ca36a7" + integrity sha512-p8oHrMeRAKxXDMPI/EBNITj/zTVHKNnAnM59Im+xnoZUlV07FyTg46wom2286jJlXGGfcPFG/ba5NUiCwWNd4w== p-each-series@^1.0.0: version "1.0.0" @@ -12705,11 +13319,6 @@ p-finally@^2.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - p-is-promise@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-3.0.0.tgz#58e78c7dfe2e163cf2a04ff869e7c1dba64a5971" @@ -12729,6 +13338,13 @@ p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.3.0: dependencies: p-try "^2.0.0" +p-limit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe" + integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg== + dependencies: + p-try "^2.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -12767,6 +13383,13 @@ p-map@^3.0.0: dependencies: aggregate-error "^3.0.0" +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + p-reduce@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" @@ -12878,13 +13501,12 @@ parent-module@^1.0.0: callsites "^3.0.0" parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.5" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" - integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== dependencies: - asn1.js "^4.0.0" + asn1.js "^5.2.0" browserify-aes "^1.0.0" - create-hash "^1.1.0" evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" safe-buffer "^5.1.1" @@ -12947,13 +13569,13 @@ parse-json@^4.0.0: json-parse-better-errors "^1.0.1" parse-json@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" - integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" + integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== dependencies: "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" + json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" parse-passwd@^1.0.0: @@ -13127,7 +13749,7 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pirates@^4.0.1: +pirates@^4.0.0, pirates@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== @@ -13177,6 +13799,13 @@ pkg-up@2.0.0: dependencies: find-up "^2.1.0" +pkg-up@3.1.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" + please-upgrade-node@^3.0.2, please-upgrade-node@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" @@ -13201,10 +13830,17 @@ pnp-webpack-plugin@1.5.0: dependencies: ts-pnp "^1.1.2" -polished@^3.3.1: - version "3.6.5" - resolved "https://registry.yarnpkg.com/polished/-/polished-3.6.5.tgz#dbefdde64c675935ec55119fe2a2ab627ca82e9c" - integrity sha512-VwhC9MlhW7O5dg/z7k32dabcAFW1VI2+7fSe8cE/kXcfL7mVdoa5UxciYGW2sJU78ldDLT6+ROEKIZKFNTnUXQ== +pnp-webpack-plugin@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + dependencies: + ts-pnp "^1.1.6" + +polished@^3.3.1, polished@^3.4.4: + version "3.6.7" + resolved "https://registry.yarnpkg.com/polished/-/polished-3.6.7.tgz#44cbd0047f3187d83db0c479ef0c7d5583af5fb6" + integrity sha512-b4OViUOihwV0icb9PHmWbR+vPqaSzSAEbgLskvb7ANPATVXGiYv/TQFHQo65S53WU9i5EQ1I03YDOJW7K0bmYg== dependencies: "@babel/runtime" "^7.9.2" @@ -13226,9 +13862,9 @@ postcss-flexbugs-fixes@^4.1.0: postcss "^7.0.26" postcss-load-config@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" - integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q== + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" + integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw== dependencies: cosmiconfig "^5.0.0" import-cwd "^2.0.0" @@ -13251,14 +13887,14 @@ postcss-modules-extract-imports@^2.0.0: postcss "^7.0.5" postcss-modules-local-by-default@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" - integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ== + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" + integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== dependencies: icss-utils "^4.1.1" - postcss "^7.0.16" + postcss "^7.0.32" postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.0.0" + postcss-value-parser "^4.1.0" postcss-modules-scope@^2.2.0: version "2.2.0" @@ -13277,20 +13913,21 @@ postcss-modules-values@^3.0.0: postcss "^7.0.6" postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" - integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" + integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== dependencies: cssesc "^3.0.0" indexes-of "^1.0.1" uniq "^1.0.1" + util-deprecate "^1.0.2" postcss-value-parser@^3.2.3: version "3.3.1" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0: +postcss-value-parser@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== @@ -13304,10 +13941,10 @@ postcss@^6.0.23: source-map "^0.6.1" supports-color "^5.4.0" -postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.32" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" - integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== +postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" + integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -13375,15 +14012,25 @@ pretty-format@^25.2.1, pretty-format@^25.5.0: ansi-styles "^4.0.0" react-is "^16.12.0" +pretty-format@^26.4.2: + version "26.4.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.4.2.tgz#d081d032b398e801e2012af2df1214ef75a81237" + integrity sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA== + dependencies: + "@jest/types" "^26.3.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + pretty-hrtime@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= prismjs@^1.8.4: - version "1.20.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.20.0.tgz#9b685fc480a3514ee7198eac6a3bf5024319ff03" - integrity sha512-AEDjSrVNkynnw6A+B1DsFkd6AVdTnp+/WoUixFRULlCLZVRZlVQMVWio/16jv7G1FscUxQxOQhWwApgbnxr6kQ== + version "1.21.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.21.0.tgz#36c086ec36b45319ec4218ee164c110f9fc015a3" + integrity sha512-uGdSIu1nk3kej2iZsLyDoJ7e9bnPzIgY0naW/HdknGj61zScaprVEVGHrPoXqI+M9sP0NDnTK2jpkvmldpuqDw== optionalDependencies: clipboard "^2.0.0" @@ -13394,7 +14041,7 @@ prismjs@~1.17.0: optionalDependencies: clipboard "^2.0.0" -private@^0.1.8, private@~0.1.5: +private@~0.1.5: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== @@ -13640,9 +14287,9 @@ query-string@^4.1.0: strict-uri-encode "^1.0.0" query-string@^6.5.0, query-string@^6.8.2: - version "6.13.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.1.tgz#d913ccfce3b4b3a713989fe6d39466d92e71ccad" - integrity sha512-RfoButmcK+yCta1+FuU8REvisx1oEzhMKwhLUNcepQTPGcNMp1sIqjnfCtfnvGSQZQEhaBHvccujtWoUV3TTbA== + version "6.13.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.4.tgz#b35a9a3bd4955bce55f94feb0e819b3d0be6f66f" + integrity sha512-E2NPIeJoBEJGQNy3ib1k/Z/OkDBUKIo8IV2ZVwbKfoa65IS9unqWWUlLcbfU70Da0qNoxUZZA8CfKUjKLE641Q== dependencies: decode-uri-component "^0.2.0" split-on-first "^1.0.0" @@ -13659,9 +14306,9 @@ querystring@0.2.0, querystring@^0.2.0: integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= querystringify@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" - integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== quick-lru@^1.0.0: version "1.1.0" @@ -13728,6 +14375,14 @@ raw-loader@^3.1.0: loader-utils "^1.1.0" schema-utils "^2.0.1" +raw-loader@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.1.tgz#14e1f726a359b68437e183d5a5b7d33a3eba6933" + integrity sha512-baolhQBSi3iNh1cglJjA0mYzga+wePk7vdEX//1dTFd+v4TsQlQE0jitJSNF1OIP82rdYulH7otaVmdlDaJ64A== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.6.5" + rc@^1.0.1, rc@^1.1.6, rc@^1.2.7, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -13767,6 +14422,36 @@ react-color@^2.17.0: reactcss "^1.2.0" tinycolor2 "^1.4.1" +react-dev-utils@^10.0.0: + version "10.2.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-10.2.1.tgz#f6de325ae25fa4d546d09df4bb1befdc6dd19c19" + integrity sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ== + dependencies: + "@babel/code-frame" "7.8.3" + address "1.1.2" + browserslist "4.10.0" + chalk "2.4.2" + cross-spawn "7.0.1" + detect-port-alt "1.1.6" + escape-string-regexp "2.0.0" + filesize "6.0.1" + find-up "4.1.0" + fork-ts-checker-webpack-plugin "3.1.1" + global-modules "2.0.0" + globby "8.0.2" + gzip-size "5.1.1" + immer "1.10.0" + inquirer "7.0.4" + is-root "2.1.0" + loader-utils "1.2.3" + open "^7.0.2" + pkg-up "3.1.0" + react-error-overlay "^6.0.7" + recursive-readdir "2.2.2" + shell-quote "1.7.2" + strip-ansi "6.0.0" + text-table "0.2.0" + react-dev-utils@^9.0.0: version "9.1.0" resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-9.1.0.tgz#3ad2bb8848a32319d760d0a84c56c14bdaae5e81" @@ -13798,6 +14483,32 @@ react-dev-utils@^9.0.0: strip-ansi "5.2.0" text-table "0.2.0" +react-docgen-typescript-loader@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/react-docgen-typescript-loader/-/react-docgen-typescript-loader-3.7.2.tgz#45cb2305652c0602767242a8700ad1ebd66bbbbd" + integrity sha512-fNzUayyUGzSyoOl7E89VaPKJk9dpvdSgyXg81cUkwy0u+NBvkzQG3FC5WBIlXda0k/iaxS+PWi+OC+tUiGxzPA== + dependencies: + "@webpack-contrib/schema-utils" "^1.0.0-beta.0" + loader-utils "^1.2.3" + react-docgen-typescript "^1.15.0" + +react-docgen-typescript-plugin@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-0.5.2.tgz#2b294d75ef3145c36303da82be5d447cb67dc0dc" + integrity sha512-NQfWyWLmzUnedkiN2nPDb6Nkm68ik6fqbC3UvgjqYSeZsbKijXUA4bmV6aU7qICOXdop9PevPdjEgJuAN0nNVQ== + dependencies: + debug "^4.1.1" + endent "^2.0.1" + micromatch "^4.0.2" + react-docgen-typescript "^1.20.1" + react-docgen-typescript-loader "^3.7.2" + tslib "^2.0.0" + +react-docgen-typescript@^1.15.0, react-docgen-typescript@^1.20.1: + version "1.20.5" + resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-1.20.5.tgz#fb8d78a707243498436c2952bd3f6f488a68d4f3" + integrity sha512-AbLGMtn76bn7SYBJSSaKJrZ0lgNRRR3qL60PucM5M4v/AXyC8221cKBXW5Pyt9TfDRfe+LDnPNlg7TibxX0ovA== + react-docgen@^5.0.0: version "5.3.0" resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-5.3.0.tgz#9aabde5e69f1993c8ba839fd9a86696504654589" @@ -13830,7 +14541,7 @@ react-draggable@^4.0.3: classnames "^2.2.5" prop-types "^15.6.0" -react-error-overlay@^6.0.3: +react-error-overlay@^6.0.3, react-error-overlay@^6.0.7: version "6.0.7" resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108" integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA== @@ -13840,7 +14551,7 @@ react-fast-compare@^2.0.2: resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== -react-fast-compare@^3.0.1: +react-fast-compare@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== @@ -13856,9 +14567,9 @@ react-focus-lock@^1.18.3: react-clientside-effect "^1.2.0" react-focus-lock@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.4.0.tgz#11235eff41f47567288d7ef574e5b006527739d5" - integrity sha512-mue/boxdfNhfxnQcZtEBvqwZ5XQxk0uRoAMwLGl8j6XolFV3UIlt6iGFBGqRdJsvVHhtyKC5i8fkLnBidxCTbA== + version "2.4.1" + resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.4.1.tgz#e842cc93da736b5c5d331799012544295cbcee4f" + integrity sha512-c5ZP56KSpj9EAxzScTqQO7bQQNPltf/W1ZEBDqNDOV1XOIwvAyHX0O7db9ekiAtxyKgnqZjQlLppVg94fUeL9w== dependencies: "@babel/runtime" "^7.0.0" focus-lock "^0.7.0" @@ -13868,14 +14579,14 @@ react-focus-lock@^2.1.0: use-sidecar "^1.0.1" react-helmet-async@^1.0.2: - version "1.0.6" - resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.0.6.tgz#11c15c74e79b3f66670c73779bef3e0e352b1d4e" - integrity sha512-t+bhAI4NgxfEv8ez4r77cLfR4O4Z55E/FH2DT+uiE4U7yfWgAk7OAOi7IxHxuYEVLI26bqjZvlVCkpC5/5AoNA== + version "1.0.7" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.0.7.tgz#b988fbc3abdc4b704982bb74b9cb4a08fcf062c1" + integrity sha512-By90p5uxAriGukbyejq2poK41DwTxpNWOpOjN8mIyX/BKrCd3+sXZ5pHUZXjHyjR5OYS7PGsOD9dbM61YxfFmA== dependencies: - "@babel/runtime" "^7.9.2" + "@babel/runtime" "^7.11.2" invariant "^2.2.4" prop-types "^15.7.2" - react-fast-compare "^3.0.1" + react-fast-compare "^3.2.0" shallowequal "^1.1.0" react-helmet@^5.1.3: @@ -13889,9 +14600,9 @@ react-helmet@^5.1.3: react-side-effect "^1.1.0" react-hot-loader@^4.1.2: - version "4.12.21" - resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.12.21.tgz#332e830801fb33024b5a147d6b13417f491eb975" - integrity sha512-Ynxa6ROfWUeKWsTHxsrL2KMzujxJVPjs385lmB2t5cHUxdoRPGind9F00tOkdc1l5WBleOF4XEAMILY1KPIIDA== + version "4.13.0" + resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.13.0.tgz#c27e9408581c2a678f5316e69c061b226dc6a202" + integrity sha512-JrLlvUPqh6wIkrK2hZDfOyq/Uh/WeVEr8nc7hkn2/3Ul0sx1Kr5y4kOGNacNRoj7RhwLNcQ3Udf1KJXrqc0ZtA== dependencies: fast-levenshtein "^2.0.6" global "^4.3.0" @@ -13926,11 +14637,9 @@ react-inspector@^3.0.2: prop-types "^15.6.1" react-intersection-observer@^8.25.1: - version "8.26.2" - resolved "https://registry.yarnpkg.com/react-intersection-observer/-/react-intersection-observer-8.26.2.tgz#0562ff0c06b2b10e809190c2fa9b6ded656e6e16" - integrity sha512-GmSjLNK+oV7kS+BHfrJSaA4wF61ELA33gizKHmN+tk59UT6/aW8kkqvlrFGPwxGoaIzLKS2evfG5fgkw5MIIsg== - dependencies: - tiny-invariant "^1.1.0" + version "8.29.0" + resolved "https://registry.yarnpkg.com/react-intersection-observer/-/react-intersection-observer-8.29.0.tgz#8349a6301bfc24329a029036c6bed30f9864f3ad" + integrity sha512-Bqp7GBa5Aieo8C33Bz0e5WuUnFUKN3WOayKMT/2f0ujfW+YpzOEdNE4MK/TnaHp+cisK7n1At3qcFaNPfhHbqw== react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.1, react-is@^16.8.6: version "16.13.1" @@ -13958,7 +14667,7 @@ react-loading-skeleton@^1.1.2: dependencies: emotion "^10.0.17" -react-popper-tooltip@^2.8.3: +react-popper-tooltip@^2.11.0, react-popper-tooltip@^2.8.3: version "2.11.1" resolved "https://registry.yarnpkg.com/react-popper-tooltip/-/react-popper-tooltip-2.11.1.tgz#3c4bdfd8bc10d1c2b9a162e859bab8958f5b2644" integrity sha512-04A2f24GhyyMicKvg/koIOQ5BzlrRbKiAgP6L+Pdj1MVX3yJ1NeZ8+EidndQsbejFT55oW1b++wg2Z8KlAyhfQ== @@ -14072,6 +14781,17 @@ react-syntax-highlighter@^11.0.2: prismjs "^1.8.4" refractor "^2.4.1" +react-syntax-highlighter@^12.2.1: + version "12.2.1" + resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-12.2.1.tgz#14d78352da1c1c3f93c6698b70ec7c706b83493e" + integrity sha512-CTsp0ZWijwKRYFg9xhkWD4DSpQqE4vb2NKVMdPAkomnILSmsNBHE0n5GuI5zB+PU3ySVvXvdt9jo+ViD9XibCA== + dependencies: + "@babel/runtime" "^7.3.1" + highlight.js "~9.15.1" + lowlight "1.12.1" + prismjs "^1.8.4" + refractor "^2.4.1" + react-syntax-highlighter@^8.0.1: version "8.1.0" resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-8.1.0.tgz#59103ff17a828a27ed7c8f035ae2558f09b6b78c" @@ -14101,6 +14821,15 @@ react-textarea-autosize@^7.1.0: "@babel/runtime" "^7.1.2" prop-types "^15.6.0" +react-textarea-autosize@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.2.0.tgz#fae38653f5ec172a855fd5fffb39e466d56aebdb" + integrity sha512-grajUlVbkx6VdtSxCgzloUIphIZF5bKr21OYMceWPKkniy7H0mRAT/AXPrRtObAe+zUePnNlBwUc4ivVjUGIjw== + dependencies: + "@babel/runtime" "^7.10.2" + use-composed-ref "^1.0.0" + use-latest "^1.0.0" + react-transition-group@^2.2.1, react-transition-group@^2.3.1: version "2.9.0" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" @@ -14122,15 +14851,15 @@ react-transition-group@^4.0.0, react-transition-group@^4.3.0, react-transition-g prop-types "^15.6.2" react-virtualized@^9.21.1: - version "9.21.2" - resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.21.2.tgz#02e6df65c1e020c8dbf574ec4ce971652afca84e" - integrity sha512-oX7I7KYiUM7lVXQzmhtF4Xg/4UA5duSA+/ZcAvdWlTLFCoFYq1SbauJT5gZK9cZS/wdYR6TPGpX/dqzvTqQeBA== + version "9.22.2" + resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.22.2.tgz#217a870bad91e5438f46f01a009e1d8ce1060a5a" + integrity sha512-5j4h4FhxTdOpBKtePSs1yk6LDNT4oGtUwjT7Nkh61Z8vv3fTG/XeOf8J4li1AYaexOwTXnw0HFVxsV0GBUqwRw== dependencies: - babel-runtime "^6.26.0" - clsx "^1.0.1" - dom-helpers "^5.0.0" - loose-envify "^1.3.0" - prop-types "^15.6.0" + "@babel/runtime" "^7.7.2" + clsx "^1.0.4" + dom-helpers "^5.1.3" + loose-envify "^1.4.0" + prop-types "^15.7.2" react-lifecycles-compat "^3.0.4" react@^16.13.1, react@^16.8.3: @@ -14176,16 +14905,14 @@ read-installed@~4.0.3: graceful-fs "^4.1.2" "read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.13, read-package-json@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.1.tgz#16aa66c59e7d4dad6288f179dd9295fd59bb98f1" - integrity sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A== + version "2.1.2" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a" + integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA== dependencies: glob "^7.1.1" - json-parse-better-errors "^1.0.1" + json-parse-even-better-errors "^2.3.0" normalize-package-data "^2.0.0" npm-normalize-package-bin "^1.0.0" - optionalDependencies: - graceful-fs "^4.1.2" read-package-tree@^5.3.1: version "5.3.1" @@ -14415,17 +15142,16 @@ regenerator-runtime@^0.11.0: integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: - version "0.13.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" - integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== regenerator-transform@^0.14.2: - version "0.14.4" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" - integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== dependencies: "@babel/runtime" "^7.8.4" - private "^0.1.8" regex-not@^1.0.2: version "1.0.2" @@ -14436,9 +15162,9 @@ regex-not@^1.0.2: safe-regex "^1.1.0" regex-parser@^2.2.9: - version "2.2.10" - resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.10.tgz#9e66a8f73d89a107616e63b39d4deddfee912b37" - integrity sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA== + version "2.2.11" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" + integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: version "1.3.0" @@ -14454,9 +15180,9 @@ regexpp@^2.0.1: integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== regexpu-core@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" - integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== + version "4.7.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== dependencies: regenerate "^1.4.0" regenerate-unicode-properties "^8.2.0" @@ -14474,9 +15200,9 @@ registry-auth-token@^3.0.1: safe-buffer "^5.0.1" registry-auth-token@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.1.1.tgz#40a33be1e82539460f94328b0f7f0f84c16d9479" - integrity sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA== + version "4.2.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.0.tgz#1d37dffda72bbecd0f581e4715540213a65eb7da" + integrity sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w== dependencies: rc "^1.2.8" @@ -14535,19 +15261,19 @@ replace-ext@^1.0.0: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a" integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw== -request-promise-core@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" - integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== dependencies: - lodash "^4.17.15" + lodash "^4.17.19" request-promise-native@^1.0.7: - version "1.0.8" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" - integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== dependencies: - request-promise-core "1.1.3" + request-promise-core "1.1.4" stealthy-require "^1.1.1" tough-cookie "^2.3.3" @@ -14770,7 +15496,7 @@ rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3, rimra dependencies: glob "^7.1.3" -rimraf@^3.0.0: +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -14807,10 +15533,10 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.3.3, rxjs@^6.4.0, rxjs@^6.5.3: - version "6.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" - integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== +rxjs@^6.3.3, rxjs@^6.4.0, rxjs@^6.5.3, rxjs@^6.6.0: + version "6.6.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" + integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== dependencies: tslib "^1.9.0" @@ -14836,7 +15562,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -14893,14 +15619,14 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.0.1, schema-utils@^2.5.0, schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== +schema-utils@^2.0.1, schema-utils@^2.5.0, schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0, schema-utils@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" select@^1.1.2: version "1.1.2" @@ -14908,9 +15634,9 @@ select@^1.1.2: integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= semantic-release@^17.0.7: - version "17.1.1" - resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-17.1.1.tgz#d9775968e841b2b7c5020559e4481aea8520ca75" - integrity sha512-9H+207eynBJElrQBHySZm+sIEoJeUhPA2zU4cdlY1QSInd2lnE8GRD2ALry9EassE22c9WW+aCREwBhro5AIIg== + version "17.1.2" + resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-17.1.2.tgz#7d77555185722012b34e3ca74e4d13f813daf3cd" + integrity sha512-szYBXm10QjQO5Tb1S2PSkvOBW3MajWJat5EWtx+MzaVT/jquuxf9o+Zn8FC1j157xvJ5p9r1d/MZGslgs7oQQg== dependencies: "@semantic-release/commit-analyzer" "^8.0.0" "@semantic-release/error" "^2.2.0" @@ -15019,10 +15745,10 @@ serialize-javascript@^2.1.2: resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== -serialize-javascript@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea" - integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg== +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== dependencies: randombytes "^2.1.0" @@ -15167,12 +15893,12 @@ shellwords@^0.1.1: integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== side-channel@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" - integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== + version "1.0.3" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.3.tgz#cdc46b057550bbab63706210838df5d4c19519c3" + integrity sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g== dependencies: - es-abstract "^1.17.0-next.1" - object-inspect "^1.7.0" + es-abstract "^1.18.0-next.0" + object-inspect "^1.8.0" signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" @@ -15189,9 +15915,9 @@ signale@^1.2.1: pkg-conf "^2.1.0" simple-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" - integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== simple-get@^3.0.3: version "3.1.0" @@ -15383,7 +16109,15 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.17, source-map-support@^0.5.3, source-map-support@^0.5.6, source-map-support@~0.5.12: +source-map-resolve@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" + integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + +source-map-support@^0.5.16, source-map-support@^0.5.17, source-map-support@^0.5.3, source-map-support@^0.5.6, source-map-support@~0.5.12: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== @@ -15443,9 +16177,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + version "3.0.6" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce" + integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw== split-on-first@^1.0.0: version "1.1.0" @@ -15522,6 +16256,13 @@ ssri@^7.0.0: figgy-pudding "^3.5.1" minipass "^3.1.1" +ssri@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.0.tgz#79ca74e21f8ceaeddfcb4b90143c458b8d988808" + integrity sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA== + dependencies: + minipass "^3.1.1" + stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" @@ -15556,9 +16297,9 @@ stealthy-require@^1.1.1: integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= store2@^2.7.1: - version "2.11.2" - resolved "https://registry.yarnpkg.com/store2/-/store2-2.11.2.tgz#a298e5e97b21b3ce7419b732540bc7c79cb007db" - integrity sha512-TQMKs+C6n9idtzLpxluikmDCYiDJrTbbIGn9LFxMg0BVTu+8JZKSlXTWYRpOFKlfKD5HlDWLVpJJyNGZ2e9l1A== + version "2.12.0" + resolved "https://registry.yarnpkg.com/store2/-/store2-2.12.0.tgz#e1f1b7e1a59b6083b2596a8d067f6ee88fd4d3cf" + integrity sha512-7t+/wpKLanLzSnQPX8WAcuLCCeuSHoWdQuh9SB3xD0kNOM38DNf+0Oa+wmvxmYueRzkmh6IcdKFtvTa+ecgPDw== storybook-react-router@^1.0.5: version "1.0.8" @@ -15769,6 +16510,13 @@ strip-ansi@5.2.0, 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, 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" @@ -15783,13 +16531,6 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.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-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -15827,7 +16568,7 @@ strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -style-loader@^1.0.0: +style-loader@^1.0.0, style-loader@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.2.1.tgz#c5cbbfbf1170d076cfdd86e0109c5bba114baa1a" integrity sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg== @@ -15865,9 +16606,9 @@ supports-color@^6.1.0: has-flag "^3.0.0" supports-color@^7.0.0, supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" @@ -15879,7 +16620,7 @@ supports-hyperlinks@^2.0.0, supports-hyperlinks@^2.1.0: has-flag "^4.0.0" supports-color "^7.0.0" -svg-parser@^2.0.0: +svg-parser@^2.0.0, svg-parser@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== @@ -15947,11 +16688,11 @@ tar-fs@^2.0.0: tar-stream "^2.0.0" tar-stream@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.2.tgz#6d5ef1a7e5783a95ff70b69b97455a5968dc1325" - integrity sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q== + version "2.1.4" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.4.tgz#c4fb1a11eb0da29b893a5b25476397ba2d053bfa" + integrity sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw== dependencies: - bl "^4.0.1" + bl "^4.0.3" end-of-stream "^1.4.1" fs-constants "^1.0.0" inherits "^2.0.3" @@ -15970,6 +16711,18 @@ tar@^4.4.10, tar@^4.4.12, tar@^4.4.13, tar@^4.4.8: safe-buffer "^5.1.2" yallist "^3.0.3" +tar@^6.0.2: + version "6.0.5" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.5.tgz#bde815086e10b39f1dcd298e89d596e1535e200f" + integrity sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + telejson@^2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/telejson/-/telejson-2.2.2.tgz#d61d721d21849a6e4070d547aab302a9bd22c720" @@ -15997,6 +16750,20 @@ telejson@^3.2.0: lodash "^4.17.15" memoizerific "^1.11.3" +telejson@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/telejson/-/telejson-5.0.2.tgz#ed1e64be250cc1c757a53c19e1740b49832b3d51" + integrity sha512-XCrDHGbinczsscs8LXFr9jDhvy37yBk9piB7FJrCfxE8oP66WDkolNMpaBkWYgQqB9dQGBGtTDzGQPedc9KJmw== + dependencies: + "@types/is-function" "^1.0.0" + global "^4.4.0" + is-function "^1.0.2" + is-regex "^1.1.1" + is-symbol "^1.0.3" + isobject "^4.0.0" + lodash "^4.17.19" + memoizerific "^1.11.3" + temp-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" @@ -16033,36 +16800,51 @@ terminal-link@^2.0.0: supports-hyperlinks "^2.0.0" terser-webpack-plugin@^1.4.3: - version "1.4.4" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz#2c63544347324baafa9a56baaddf1634c8abfc2f" - integrity sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA== + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== dependencies: cacache "^12.0.2" find-cache-dir "^2.1.0" is-wsl "^1.1.0" schema-utils "^1.0.0" - serialize-javascript "^3.1.0" + serialize-javascript "^4.0.0" source-map "^0.6.1" terser "^4.1.2" webpack-sources "^1.4.0" worker-farm "^1.7.0" terser-webpack-plugin@^2.1.2: - version "2.3.7" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.7.tgz#4910ff5d1a872168cc7fa6cd3749e2b0d60a8a0b" - integrity sha512-xzYyaHUNhzgaAdBsXxk2Yvo/x1NJdslUaussK3fdpBbvttm1iIwU+c26dj9UxJcwk2c5UWt5F55MUTIA8BE7Dg== + version "2.3.8" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz#894764a19b0743f2f704e7c2a848c5283a696724" + integrity sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w== dependencies: cacache "^13.0.1" find-cache-dir "^3.3.1" jest-worker "^25.4.0" p-limit "^2.3.0" schema-utils "^2.6.6" - serialize-javascript "^3.1.0" + serialize-javascript "^4.0.0" source-map "^0.6.1" terser "^4.6.12" webpack-sources "^1.4.3" -terser@^4.1.2, terser@^4.6.12, terser@^4.6.3: +terser-webpack-plugin@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-3.1.0.tgz#91e6d39571460ed240c0cf69d295bcf30ebf98cb" + integrity sha512-cjdZte66fYkZ65rQ2oJfrdCAkkhJA7YLYk5eGOcGCSGlq0ieZupRdjedSQXYknMPo2IveQL+tPdrxUkERENCFA== + dependencies: + cacache "^15.0.5" + find-cache-dir "^3.3.1" + jest-worker "^26.2.1" + p-limit "^3.0.2" + schema-utils "^2.6.6" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.8.0" + webpack-sources "^1.4.3" + +terser@^4.1.2, terser@^4.6.12, terser@^4.6.3, terser@^4.8.0: version "4.8.0" resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== @@ -16096,9 +16878,9 @@ throat@^5.0.0: integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== throttle-debounce@^2.1.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-2.2.1.tgz#fbd933ae6793448816f7d5b3cae259d464c98137" - integrity sha512-i9hAVld1f+woAiyNGqWelpDD5W1tpMroL3NofTz9xzwq6acWBlO2dC8k5EFSZepU6oOINtV5Q3aSPoRg7o4+fA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-2.3.0.tgz#fd31865e66502071e411817e241465b3e9c372e2" + integrity sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ== through2@^2.0.0, through2@^2.0.2, through2@~2.0.0: version "2.0.5" @@ -16134,16 +16916,16 @@ timers-browserify@^2.0.4: setimmediate "^1.0.4" timm@^1.6.1: - version "1.6.2" - resolved "https://registry.yarnpkg.com/timm/-/timm-1.6.2.tgz#dfd8c6719f7ba1fcfc6295a32670a1c6d166c0bd" - integrity sha512-IH3DYDL1wMUwmIlVmMrmesw5lZD6N+ZOAFWEyLrtpoL9Bcrs9u7M/vyOnHzDD2SMs4irLkVjqxZbHrXStS/Nmw== + version "1.7.1" + resolved "https://registry.yarnpkg.com/timm/-/timm-1.7.1.tgz#96bab60c7d45b5a10a8a4d0f0117c6b7e5aff76f" + integrity sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw== tiny-emitter@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== -tiny-invariant@^1.0.2, tiny-invariant@^1.1.0: +tiny-invariant@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== @@ -16159,9 +16941,9 @@ tiny-warning@^1.0.0, tiny-warning@^1.0.2, tiny-warning@^1.0.3: integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== tinycolor2@^1.1.2, tinycolor2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8" - integrity sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g= + version "1.4.2" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803" + integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA== tmp@^0.0.33: version "0.0.33" @@ -16313,10 +17095,15 @@ trim-off-newlines@^1.0.0: resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= -ts-dedent@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-1.1.1.tgz#68fad040d7dbd53a90f545b450702340e17d18f3" - integrity sha512-UGTRZu1evMw4uTPyYF66/KFd22XiU+jMaIuHrkIHQ2GivAXVlLV0v/vHrpOuTRf9BmpNHi/SO7Vd0rLu0y57jg== +ts-dedent@^1.1.0, ts-dedent@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-1.2.0.tgz#6aa2229d837159bb6d635b6b233002423b91e0b0" + integrity sha512-6zSJp23uQI+Txyz5LlXMXAHpUhY4Hi0oluXny0OgIR7g/Cromq4vDBnhtbBdyIV34g0pgwxUvnvg+jLJe4c1NA== + +ts-essentials@^2.0.3: + version "2.0.12" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-2.0.12.tgz#c9303f3d74f75fa7528c3d49b80e089ab09d8745" + integrity sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w== ts-jest@^25.4.0: version "25.5.1" @@ -16356,7 +17143,7 @@ ts-node@^8.0.2: source-map-support "^0.5.17" yn "3.1.1" -ts-pnp@^1.1.2: +ts-pnp@^1.1.2, ts-pnp@^1.1.6: version "1.2.0" resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== @@ -16371,6 +17158,11 @@ tslib@^1.10.0, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1. resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== +tslib@^2.0.0, tslib@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e" + integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ== + tslint-config-airbnb@^5.11.2: version "5.11.2" resolved "https://registry.yarnpkg.com/tslint-config-airbnb/-/tslint-config-airbnb-5.11.2.tgz#2f3d239fa3923be8e7a4372217a7ed552671528f" @@ -16528,6 +17320,16 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.1.0.tgz#9bdc22c648cf8cf86dd23d32336a41cfb6475e3f" + integrity sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA== + typed-styles@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" @@ -16546,14 +17348,14 @@ typedarray@^0.0.6: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript@^3.8.3: - version "3.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" - integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ== + version "3.9.7" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" + integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== ua-parser-js@^0.7.18: - version "0.7.21" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" - integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== + version "0.7.22" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.22.tgz#960df60a5f911ea8f1c818f3747b99c6e177eae3" + integrity sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q== uc.micro@^1.0.1: version "1.0.6" @@ -16577,9 +17379,9 @@ uglify-js@3.4.x: source-map "~0.6.1" uglify-js@^3.1.4: - version "3.10.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.10.0.tgz#397a7e6e31ce820bfd1cb55b804ee140c587a9e7" - integrity sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA== + version "3.11.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.11.0.tgz#67317658d76c21e0e54d3224aee2df4ee6c3e1dc" + integrity sha512-e1KQFRCpOxnrJsJVqDUCjURq+wXvIn7cK2sRAx9XL3HYLL9aezOP4Pb1+Y3/o693EPk111Yj2Q+IUXxcpHlygQ== uglifyjs-webpack-plugin@^1.2.5: version "1.3.0" @@ -16606,9 +17408,9 @@ umask@^1.1.0, umask@~1.1.0: integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= unfetch@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.1.0.tgz#6ec2dd0de887e58a4dee83a050ded80ffc4137db" - integrity sha512-crP/n3eAPUJxZXM9T80/yv0YhkTEx2K1D3h7D1AJM6fzsWZrxdyRuLN0JH/dkZh1LNH8LxCnBzoPFCPbb2iGpg== + version "4.2.0" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" + integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" @@ -16683,6 +17485,11 @@ universal-user-agent@^5.0.0: dependencies: os-name "^3.1.0" +universal-user-agent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" + integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -16743,9 +17550,9 @@ upper-case@^1.1.1: integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.0" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" + integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== dependencies: punycode "^2.1.0" @@ -16768,6 +17575,15 @@ url-loader@^2.0.1: mime "^2.4.4" schema-utils "^2.5.0" +url-loader@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.0.tgz#c7d6b0d6b0fccd51ab3ffc58a78d32b8d89a7be2" + integrity sha512-IzgAAIC8wRrg6NYkFIJY09vtktQcsvU8V6HhtQj9PTefbYImzLB1hufqo4m+RyM5N3mLx5BqJKccgxJS+W3kqw== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.26" + schema-utils "^2.6.5" + url-parse-lax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" @@ -16808,11 +17624,30 @@ use-callback-ref@^1.2.1: resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.2.4.tgz#d86d1577bfd0b955b6e04aaf5971025f406bea3c" integrity sha512-rXpsyvOnqdScyied4Uglsp14qzag1JIemLeTWGKbwpotWht57hbP78aNT+Q4wdFKQfQibbUX4fb6Qb4y11aVOQ== +use-composed-ref@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.0.0.tgz#bb13e8f4a0b873632cde4940abeb88b92d03023a" + integrity sha512-RVqY3NFNjZa0xrmK3bIMWNmQ01QjKPDc7DeWR3xa/N8aliVppuutOE5bZzPkQfvL+5NRWMMp0DJ99Trd974FIw== + dependencies: + ts-essentials "^2.0.3" + use-force-update@^1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/use-force-update/-/use-force-update-1.0.7.tgz#f5e672633f5a398b25c33b2287150918bcb3526b" integrity sha512-k5dppYhO+I5X/cd7ildbrzeMZJkWwdAh5adaIk0qKN2euh7J0h2GBGBcB4QZ385eyHHnp7LIygvebdRx3XKdwA== +use-isomorphic-layout-effect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.0.0.tgz#f56b4ed633e1c21cd9fc76fe249002a1c28989fb" + integrity sha512-JMwJ7Vd86NwAt1jH7q+OIozZSIxA4ND0fx6AsOe2q1H8ooBUp5aN6DvVCqZiIaYU6JaMRJGyR0FO7EBCIsb/Rg== + +use-latest@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.1.0.tgz#7bf9684555869c3f5f37e10d0884c8accf4d3aa6" + integrity sha512-gF04d0ZMV3AMB8Q7HtfkAWe+oq1tFXP6dZKwBHQF5nVXtGsh2oAYeeqma5ZzxtlpOcW8Ro/tLcfmEodjDeqtuw== + dependencies: + use-isomorphic-layout-effect "^1.0.0" + use-react-router@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/use-react-router/-/use-react-router-1.0.7.tgz#04216066d87e45040309f24d2fd5e9f28308b3e2" @@ -16821,13 +17656,20 @@ use-react-router@^1.0.7: use-force-update "^1.0.5" use-sidecar@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.0.2.tgz#e72f582a75842f7de4ef8becd6235a4720ad8af6" - integrity sha512-287RZny6m5KNMTb/Kq9gmjafi7lQL0YHO1lYolU6+tY1h9+Z3uCtkJJ3OSOq3INwYf2hBryCcDh4520AhJibMA== + version "1.0.3" + resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.0.3.tgz#17a4e567d4830c0c0ee100040e85a7fe68611e0f" + integrity sha512-ygJwGUBeQfWgDls7uTrlEDzJUUR67L8Rm14v/KfFtYCdHhtjHZx1Krb3DIQl3/Q5dJGfXLEQ02RY8BdNBv87SQ== dependencies: - detect-node "^2.0.4" + detect-node-es "^1.0.0" tslib "^1.9.3" +use-subscription@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.4.1.tgz#edcbcc220f1adb2dd4fa0b2f61b6cc308e620069" + integrity sha512-7+IIwDG/4JICrWHL/Q/ZPK5yozEnvRm6vHImu0LKwQlmWGKeiF7mbAenLlK/cTNXrTtXHU/SFASQHzB6+oSJMQ== + dependencies: + object-assign "^4.1.1" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" @@ -16899,7 +17741,7 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.3.2, uuid@^3.3.3: +uuid@^3.1.0, uuid@^3.3.2, uuid@^3.3.3: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -16953,9 +17795,9 @@ verror@1.10.0: extsprintf "^1.2.0" vinyl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" - integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== + version "2.2.1" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.1.tgz#23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974" + integrity sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw== dependencies: clone "^2.1.1" clone-buffer "^1.0.0" @@ -17006,15 +17848,15 @@ watchpack-chokidar2@^2.0.0: dependencies: chokidar "^2.1.8" -watchpack@^1.6.1: - version "1.7.2" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz#c02e4d4d49913c3e7e122c3325365af9d331e9aa" - integrity sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g== +watchpack@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b" + integrity sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg== dependencies: graceful-fs "^4.1.2" neo-async "^2.5.0" optionalDependencies: - chokidar "^3.4.0" + chokidar "^3.4.1" watchpack-chokidar2 "^2.0.0" wcwidth@^1.0.0: @@ -17077,6 +17919,16 @@ webpack-hot-server-middleware@^0.5.0: source-map-support "^0.5.3" yarn "^1.5.1" +webpack-log@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-1.2.0.tgz#a4b34cda6b22b518dbb0ab32e567962d5c72a43d" + integrity sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA== + dependencies: + chalk "^2.1.0" + log-symbols "^2.1.0" + loglevelnext "^1.0.1" + uuid "^3.1.0" + webpack-log@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" @@ -17103,17 +17955,17 @@ webpack-stats-plugin@^0.2.1: resolved "https://registry.yarnpkg.com/webpack-stats-plugin/-/webpack-stats-plugin-0.2.1.tgz#1f5bac13fc25d62cbb5fd0ff646757dc802b8595" integrity sha512-OYMZLpZrK/qLA79NE4kC4DCt85h/5ipvWJcsefKe9MMw0qU4/ck/IJg+4OmWA+5EfrZZpHXDq92IptfYDWVfkw== -webpack-virtual-modules@^0.2.0: +webpack-virtual-modules@^0.2.0, webpack-virtual-modules@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.2.2.tgz#20863dc3cb6bb2104729fff951fbe14b18bd0299" integrity sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA== dependencies: debug "^3.0.0" -webpack@^4.33.0, webpack@^4.38.0, webpack@^4.41.5: - version "4.43.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.43.0.tgz#c48547b11d563224c561dad1172c8aa0b8a678e6" - integrity sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g== +webpack@^4.33.0, webpack@^4.38.0, webpack@^4.41.5, webpack@^4.43.0: + version "4.44.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" + integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== dependencies: "@webassemblyjs/ast" "1.9.0" "@webassemblyjs/helper-module-context" "1.9.0" @@ -17123,7 +17975,7 @@ webpack@^4.33.0, webpack@^4.38.0, webpack@^4.41.5: ajv "^6.10.2" ajv-keywords "^3.4.1" chrome-trace-event "^1.0.2" - enhanced-resolve "^4.1.0" + enhanced-resolve "^4.3.0" eslint-scope "^4.0.3" json-parse-better-errors "^1.0.2" loader-runner "^2.4.0" @@ -17136,7 +17988,7 @@ webpack@^4.33.0, webpack@^4.38.0, webpack@^4.41.5: schema-utils "^1.0.0" tapable "^1.1.3" terser-webpack-plugin "^1.4.3" - watchpack "^1.6.1" + watchpack "^1.7.4" webpack-sources "^1.4.1" websocket-driver@>=0.5.1: @@ -17161,9 +18013,9 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: iconv-lite "0.4.24" whatwg-fetch@>=0.10.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.1.0.tgz#49d630cdfa308dba7f2819d49d09364f540dbcc6" - integrity sha512-pgmbsVWKpH9GxLXZmtdowDIqtb/rvPyjjQv3z9wLcmgWKFHilKnZD3ldgrOlwJoPGOUluQsRPWd52yVkPfmI1A== + version "3.4.1" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.4.1.tgz#e5f871572d6879663fa5674c8f833f15a8425ab3" + integrity sha512-sofZVzE1wKwO+EYPbWfiwzaKovWiZXf4coEzjGP9b2GBVgQRLQUZ2QcuPpQExGDAW5GItpEm6Tl4OU5mywnAoQ== whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: version "2.3.0" @@ -17225,9 +18077,9 @@ widest-line@^3.1.0: string-width "^4.0.0" windows-release@^3.1.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.1.tgz#cb4e80385f8550f709727287bf71035e209c4ace" - integrity sha512-Pngk/RDCaI/DkuHPlGTdIkDiTAnAkyMjoQMZqRsxydNl1qGXNIoZrB7RK8g53F2tEgQBMqQJHQdYZuQEEAu54A== + version "3.3.3" + resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.3.tgz#1c10027c7225743eec6b89df160d64c2e0293999" + integrity sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg== dependencies: execa "^1.0.0" @@ -17321,9 +18173,9 @@ write@1.0.3: mkdirp "^0.5.1" ws@^7.0.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.0.tgz#4b2f7f219b3d3737bc1a2fbf145d825b94d38ffd" - integrity sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w== + version "7.3.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" + integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== xdg-basedir@^3.0.0: version "3.0.0" @@ -17369,9 +18221,9 @@ xmlchars@^2.1.1: integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== xstate@^4.11.0: - version "4.11.0" - resolved "https://registry.yarnpkg.com/xstate/-/xstate-4.11.0.tgz#dc0bd31079fe22918c2c27c118d6310bef3dcd9e" - integrity sha512-v+S3jF2YrM2tFOit8o7+4N3FuFd9IIGcIKHyfHeeNjMlmNmwuiv/IbY9uw7ECifx7H/A9aGLcxPSr0jdjTGDww== + version "4.13.0" + resolved "https://registry.yarnpkg.com/xstate/-/xstate-4.13.0.tgz#0be22ceb8bae2bc6a025fab330fe44204d76771c" + integrity sha512-UnUJJzP2KTPqnmxIoD/ymXtpy/hehZnUlO6EXqWC/72XkPb15p9Oz/X4WhS3QE+by7NP+6b5bCi/GTGFzm5D+A== xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" @@ -17403,12 +18255,12 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.7.2: +yaml@^1.10.0, yaml@^1.7.2: version "1.10.0" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== -yargs-parser@18.x, yargs-parser@^18.1.1, yargs-parser@^18.1.3: +yargs-parser@18.x, yargs-parser@^18.1.2, yargs-parser@^18.1.3: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== @@ -17431,6 +18283,14 @@ yargs-parser@^13.1.2: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^15.0.1: + version "15.0.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.1.tgz#54786af40b820dcb2fb8025b11b4d659d76323b3" + integrity sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" @@ -17438,31 +18298,6 @@ yargs-parser@^7.0.0: dependencies: camelcase "^4.1.0" -yargs-parser@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" - integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= - dependencies: - camelcase "^4.1.0" - -yargs@^11.0.0: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.1.tgz#5052efe3446a4df5ed669c995886cc0f13702766" - integrity sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw== - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^3.1.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^9.0.2" - yargs@^13.3.2: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" @@ -17479,10 +18314,27 @@ yargs@^13.3.2: y18n "^4.0.0" yargs-parser "^13.1.2" +yargs@^14.2.3: + version "14.2.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" + integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== + dependencies: + cliui "^5.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^15.0.1" + yargs@^15.0.1, yargs@^15.3.1: - version "15.3.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" - integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: cliui "^6.0.0" decamelize "^1.2.0" @@ -17494,7 +18346,7 @@ yargs@^15.0.1, yargs@^15.3.1: string-width "^4.2.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^18.1.1" + yargs-parser "^18.1.2" yargs@^8.0.2: version "8.0.2" @@ -17516,9 +18368,9 @@ yargs@^8.0.2: yargs-parser "^7.0.0" yarn@^1.5.1: - version "1.22.4" - resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.4.tgz#01c1197ca5b27f21edc8bc472cd4c8ce0e5a470e" - integrity sha512-oYM7hi/lIWm9bCoDMEWgffW8aiNZXCWeZ1/tGy0DWrN6vmzjCXIKu2Y21o8DYVBUtiktwKcNoxyGl/2iKLUNGA== + version "1.22.10" + resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.10.tgz#c99daa06257c80f8fa2c3f1490724e394c26b18c" + integrity sha512-IanQGI9RRPAN87VGTF7zs2uxkSyQSrSPsju0COgbsKQOOXr5LtcVPeyXWgwVa0ywG3d8dg6kSYKGBuYK021qeA== yn@3.1.1: version "3.1.1"