diff --git a/apps/builder/components/analytics/StatsCards.tsx b/apps/builder/components/analytics/StatsCards.tsx index f77a3a6c8d..feeb5ca3e7 100644 --- a/apps/builder/components/analytics/StatsCards.tsx +++ b/apps/builder/components/analytics/StatsCards.tsx @@ -6,7 +6,7 @@ import { StatLabel, StatNumber, } from '@chakra-ui/react' -import { Stats } from 'bot-engine' +import { Stats } from 'models' import React from 'react' export const StatsCards = ({ diff --git a/apps/builder/components/analytics/graph/AnalyticsGraph.tsx b/apps/builder/components/analytics/graph/AnalyticsGraph.tsx index cd7fb57af1..7b52a6cc53 100644 --- a/apps/builder/components/analytics/graph/AnalyticsGraph.tsx +++ b/apps/builder/components/analytics/graph/AnalyticsGraph.tsx @@ -3,7 +3,6 @@ import { useAnalyticsGraph } from 'contexts/AnalyticsGraphProvider' import React, { useMemo, useRef } from 'react' import { AnswersCount } from 'services/analytics' import { BlockNode } from './blocks/BlockNode' -import { StartBlockNode } from './blocks/StartBlockNode' import { Edges } from './Edges' const AnalyticsGraph = ({ @@ -49,9 +48,8 @@ const AnalyticsGraph = ({ }} > - {typebot.startBlock && } - {(typebot.blocks ?? []).map((block) => ( - + {typebot.blocks.allIds.map((blockId) => ( + ))} diff --git a/apps/builder/components/analytics/graph/Edges/DropOffEdge.tsx b/apps/builder/components/analytics/graph/Edges/DropOffEdge.tsx index 7bb7459fb8..430568d4aa 100644 --- a/apps/builder/components/analytics/graph/Edges/DropOffEdge.tsx +++ b/apps/builder/components/analytics/graph/Edges/DropOffEdge.tsx @@ -7,11 +7,12 @@ type Props = { } export const DropOffEdge = ({ blockId }: Props) => { const { typebot } = useAnalyticsGraph() + const path = useMemo(() => { if (!typebot) return - const block = (typebot?.blocks ?? []).find((b) => b.id === blockId) + const block = typebot.blocks.byId[blockId] if (!block) return '' - return computeDropOffPath(block.graphCoordinates, block.steps.length - 1) + return computeDropOffPath(block.graphCoordinates, block.stepIds.length - 1) }, [blockId, typebot]) return diff --git a/apps/builder/components/analytics/graph/Edges/Edge.tsx b/apps/builder/components/analytics/graph/Edges/Edge.tsx index a8e0f98677..8567eac729 100644 --- a/apps/builder/components/analytics/graph/Edges/Edge.tsx +++ b/apps/builder/components/analytics/graph/Edges/Edge.tsx @@ -1,5 +1,3 @@ -import { Block } from 'bot-engine' -import { StepWithTarget } from 'components/board/graph/Edges/Edge' import { useAnalyticsGraph } from 'contexts/AnalyticsGraphProvider' import React, { useMemo } from 'react' import { @@ -7,42 +5,37 @@ import { computeFlowChartConnectorPath, } from 'services/graph' -export const Edge = ({ step }: { step: StepWithTarget }) => { +type Props = { stepId: string } + +export const Edge = ({ stepId }: Props) => { const { typebot } = useAnalyticsGraph() - const { blocks, startBlock } = typebot ?? {} const { sourceBlock, targetBlock, targetStepIndex } = useMemo(() => { - const targetBlock = blocks?.find( - (b) => b?.id === step.target.blockId - ) as Block + if (!typebot) return {} + const step = typebot.steps.byId[stepId] + if (!step.target) return {} + const targetBlock = typebot.blocks.byId[step.target.blockId] const targetStepIndex = step.target.stepId - ? targetBlock.steps.findIndex((s) => s.id === step.target.stepId) + ? targetBlock.stepIds.indexOf(step.target.stepId) : undefined + const sourceBlock = typebot.blocks.byId[step.blockId] return { - sourceBlock: [startBlock, ...(blocks ?? [])].find( - (b) => b?.id === step.blockId - ), + sourceBlock, targetBlock, targetStepIndex, } - }, [ - blocks, - startBlock, - step.blockId, - step.target.blockId, - step.target.stepId, - ]) + }, [stepId, typebot]) const path = useMemo(() => { if (!sourceBlock || !targetBlock) return `` const anchorsPosition = getAnchorsPosition( sourceBlock, targetBlock, - sourceBlock.steps.findIndex((s) => s.id === step.id), + sourceBlock.stepIds.indexOf(stepId), targetStepIndex ) return computeFlowChartConnectorPath(anchorsPosition) - }, [sourceBlock, step.id, targetBlock, targetStepIndex]) + }, [sourceBlock, stepId, targetBlock, targetStepIndex]) return ( { const { typebot } = useAnalyticsGraph() - const { blocks, startBlock } = typebot ?? {} - const stepsWithTarget: StepWithTarget[] = useMemo(() => { - if (!startBlock) return [] - return [ - ...(startBlock.steps.filter((s) => s.target) as StepWithTarget[]), - ...((blocks ?? []) - .flatMap((b) => b.steps) - .filter((s) => s.target) as StepWithTarget[]), - ] - }, [blocks, startBlock]) + + const stepIdsWithTarget: string[] = useMemo(() => { + if (!typebot) return [] + return typebot.steps.allIds.filter((stepId) => + isDefined(typebot.steps.byId[stepId].target) + ) + }, [typebot]) return ( <> @@ -32,8 +29,8 @@ export const Edges = ({ answersCounts }: Props) => { left="0" top="0" > - {stepsWithTarget.map((step) => ( - + {stepIdsWithTarget.map((stepId) => ( + ))} { - + ) } diff --git a/apps/builder/components/analytics/graph/blocks/DropOffBlock.tsx b/apps/builder/components/analytics/graph/blocks/DropOffBlock.tsx index e791091875..ca5665d548 100644 --- a/apps/builder/components/analytics/graph/blocks/DropOffBlock.tsx +++ b/apps/builder/components/analytics/graph/blocks/DropOffBlock.tsx @@ -1,5 +1,4 @@ import { Tag, Text, VStack } from '@chakra-ui/react' -import { Block } from 'bot-engine' import { useAnalyticsGraph } from 'contexts/AnalyticsGraphProvider' import React, { useMemo } from 'react' import { AnswersCount } from 'services/analytics' @@ -21,13 +20,13 @@ export const DropOffBlock = ({ answersCounts, blockId }: Props) => { const { totalDroppedUser, dropOffRate } = useMemo(() => { if (!typebot || totalAnswers === undefined) return { previousTotal: undefined, dropOffRate: undefined } - const previousTotal = answersCounts - .filter( - (a) => - [typebot.startBlock, ...typebot.blocks].find((b) => - (b as Block).steps.find((s) => s.target?.blockId === blockId) - )?.id === a.blockId + const previousBlockIds = typebot.blocks.allIds.filter(() => + typebot.steps.allIds.find( + (sId) => typebot.steps.byId[sId].target?.blockId === blockId ) + ) + const previousTotal = answersCounts + .filter((a) => previousBlockIds.includes(a.blockId)) .reduce((prev, acc) => acc.totalAnswers + prev, 0) if (previousTotal === 0) return { previousTotal: undefined, dropOffRate: undefined } @@ -41,11 +40,11 @@ export const DropOffBlock = ({ answersCounts, blockId }: Props) => { const labelCoordinates = useMemo(() => { if (!typebot) return { x: 0, y: 0 } - const sourceBlock = typebot?.blocks.find((b) => b.id === blockId) + const sourceBlock = typebot?.blocks.byId[blockId] if (!sourceBlock) return return computeSourceCoordinates( sourceBlock?.graphCoordinates, - sourceBlock?.steps.length - 1 + sourceBlock?.stepIds.length - 1 ) }, [blockId, typebot]) diff --git a/apps/builder/components/analytics/graph/blocks/StartBlockNode.tsx b/apps/builder/components/analytics/graph/blocks/StartBlockNode.tsx deleted file mode 100644 index c00619085c..0000000000 --- a/apps/builder/components/analytics/graph/blocks/StartBlockNode.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { - Editable, - EditableInput, - EditablePreview, - Stack, - useEventListener, -} from '@chakra-ui/react' -import React, { useState } from 'react' -import { StartBlock } from 'bot-engine' -import { useAnalyticsGraph } from 'contexts/AnalyticsGraphProvider' -import { StepsList } from './StepsList' - -type Props = { - block: StartBlock -} - -export const StartBlockNode = ({ block }: Props) => { - const { updateBlockPosition } = useAnalyticsGraph() - const [isMouseDown, setIsMouseDown] = useState(false) - - const handleMouseDown = () => { - setIsMouseDown(true) - } - const handleMouseUp = () => { - setIsMouseDown(false) - } - - const handleMouseMove = (event: MouseEvent) => { - if (!isMouseDown) return - const { movementX, movementY } = event - - updateBlockPosition(block.id, { - x: block.graphCoordinates.x + movementX, - y: block.graphCoordinates.y + movementY, - }) - } - - useEventListener('mousemove', handleMouseMove) - - return ( - - - - - - - - ) -} diff --git a/apps/builder/components/analytics/graph/blocks/StepsList.tsx b/apps/builder/components/analytics/graph/blocks/StepsList.tsx index 3a0eb180f1..30e094253f 100644 --- a/apps/builder/components/analytics/graph/blocks/StepsList.tsx +++ b/apps/builder/components/analytics/graph/blocks/StepsList.tsx @@ -1,27 +1,24 @@ import { Flex, Stack } from '@chakra-ui/react' -import { StartStep, Step } from 'bot-engine' import { StepNodeOverlay } from 'components/board/graph/BlockNode/StepNode' +import { useTypebot } from 'contexts/TypebotContext/TypebotContext' -export const StepsList = ({ - steps, -}: { - blockId: string - steps: Step[] | [StartStep] -}) => { +export const StepsList = ({ stepIds }: { stepIds: string[] }) => { + const { typebot } = useTypebot() return ( - {steps.map((step) => ( - - - - - ))} + {typebot && + stepIds.map((stepId) => ( + + + + + ))} ) } diff --git a/apps/builder/components/board/StepTypesList/StepCard.tsx b/apps/builder/components/board/StepTypesList/StepCard.tsx index e5274fdf9d..8d32cc8c22 100644 --- a/apps/builder/components/board/StepTypesList/StepCard.tsx +++ b/apps/builder/components/board/StepTypesList/StepCard.tsx @@ -1,5 +1,5 @@ import { Button, ButtonProps, Flex, HStack } from '@chakra-ui/react' -import { StepType } from 'bot-engine' +import { StepType } from 'models' import { useDnd } from 'contexts/DndContext' import React, { useEffect, useState } from 'react' import { StepIcon } from './StepIcon' diff --git a/apps/builder/components/board/StepTypesList/StepIcon.tsx b/apps/builder/components/board/StepTypesList/StepIcon.tsx index 90d30ce37b..8ae8f3db01 100644 --- a/apps/builder/components/board/StepTypesList/StepIcon.tsx +++ b/apps/builder/components/board/StepTypesList/StepIcon.tsx @@ -1,5 +1,5 @@ import { ChatIcon, FlagIcon, TextIcon } from 'assets/icons' -import { StepType } from 'bot-engine' +import { StepType } from 'models' import React from 'react' type StepIconProps = { type: StepType } diff --git a/apps/builder/components/board/StepTypesList/StepLabel.tsx b/apps/builder/components/board/StepTypesList/StepLabel.tsx index 8679fc56c7..4be13c6781 100644 --- a/apps/builder/components/board/StepTypesList/StepLabel.tsx +++ b/apps/builder/components/board/StepTypesList/StepLabel.tsx @@ -1,5 +1,5 @@ import { Text } from '@chakra-ui/react' -import { StepType } from 'bot-engine' +import { StepType } from 'models' import React from 'react' type Props = { type: StepType } diff --git a/apps/builder/components/board/StepTypesList/StepTypesList.tsx b/apps/builder/components/board/StepTypesList/StepTypesList.tsx index ea9ab7606c..cdf654483a 100644 --- a/apps/builder/components/board/StepTypesList/StepTypesList.tsx +++ b/apps/builder/components/board/StepTypesList/StepTypesList.tsx @@ -5,7 +5,7 @@ import { SimpleGrid, useEventListener, } from '@chakra-ui/react' -import { StepType } from 'bot-engine' +import { StepType } from 'models' import { useDnd } from 'contexts/DndContext' import React, { useState } from 'react' import { StepCard, StepCardOverlay } from './StepCard' diff --git a/apps/builder/components/board/graph/BlockNode/BlockNode.tsx b/apps/builder/components/board/graph/BlockNode/BlockNode.tsx index 81164e7381..c80ff6822b 100644 --- a/apps/builder/components/board/graph/BlockNode/BlockNode.tsx +++ b/apps/builder/components/board/graph/BlockNode/BlockNode.tsx @@ -6,12 +6,12 @@ import { useEventListener, } from '@chakra-ui/react' import React, { useEffect, useMemo, useState } from 'react' -import { Block } from 'bot-engine' +import { Block } from 'models' import { useGraph } from 'contexts/GraphContext' import { useDnd } from 'contexts/DndContext' import { StepsList } from './StepsList' -import { isDefined } from 'utils' -import { useTypebot } from 'contexts/TypebotContext' +import { filterTable, isDefined } from 'utils' +import { useTypebot } from 'contexts/TypebotContext/TypebotContext' import { ContextMenu } from 'components/shared/ContextMenu' import { BlockNodeContextMenu } from './BlockNodeContextMenu' @@ -21,7 +21,7 @@ type Props = { export const BlockNode = ({ block }: Props) => { const { connectingIds, setConnectingIds, previewingIds } = useGraph() - const { updateBlockPosition, addStepToBlock } = useTypebot() + const { typebot, updateBlock, createStep } = useTypebot() const { draggedStep, draggedStepType, setDraggedStepType, setDraggedStep } = useDnd() const [isMouseDown, setIsMouseDown] = useState(false) @@ -55,9 +55,11 @@ export const BlockNode = ({ block }: Props) => { if (!isMouseDown) return const { movementX, movementY } = event - updateBlockPosition(block.id, { - x: block.graphCoordinates.x + movementX, - y: block.graphCoordinates.y + movementY, + updateBlock(block.id, { + graphCoordinates: { + x: block.graphCoordinates.x + movementX, + y: block.graphCoordinates.y + movementY, + }, }) } @@ -77,11 +79,11 @@ export const BlockNode = ({ block }: Props) => { const handleStepDrop = (index: number) => { setShowSortPlaceholders(false) if (draggedStepType) { - addStepToBlock(block.id, draggedStepType, index) + createStep(block.id, draggedStepType, index) setDraggedStepType(undefined) } if (draggedStep) { - addStepToBlock(block.id, draggedStep, index) + createStep(block.id, draggedStep, index) setDraggedStep(undefined) } } @@ -119,12 +121,14 @@ export const BlockNode = ({ block }: Props) => { /> - + {typebot && ( + + )} )} diff --git a/apps/builder/components/board/graph/BlockNode/BlockNodeContextMenu.tsx b/apps/builder/components/board/graph/BlockNode/BlockNodeContextMenu.tsx index be95a922f0..8e404b55ca 100644 --- a/apps/builder/components/board/graph/BlockNode/BlockNodeContextMenu.tsx +++ b/apps/builder/components/board/graph/BlockNode/BlockNodeContextMenu.tsx @@ -1,13 +1,12 @@ import { MenuList, MenuItem } from '@chakra-ui/react' import { TrashIcon } from 'assets/icons' -import { useTypebot } from 'contexts/TypebotContext' +import { useTypebot } from 'contexts/TypebotContext/TypebotContext' export const BlockNodeContextMenu = ({ blockId }: { blockId: string }) => { - const { removeBlock } = useTypebot() + const { deleteBlock } = useTypebot() + + const handleDeleteClick = () => deleteBlock(blockId) - const handleDeleteClick = () => { - removeBlock(blockId) - } return ( } onClick={handleDeleteClick}> diff --git a/apps/builder/components/board/graph/BlockNode/StartBlockNode.tsx b/apps/builder/components/board/graph/BlockNode/StartBlockNode.tsx deleted file mode 100644 index 728da7c26f..0000000000 --- a/apps/builder/components/board/graph/BlockNode/StartBlockNode.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import { - Editable, - EditableInput, - EditablePreview, - Stack, - useEventListener, -} from '@chakra-ui/react' -import React, { useMemo, useState } from 'react' -import { StartBlock } from 'bot-engine' -import { StepNode } from './StepNode' -import { useTypebot } from 'contexts/TypebotContext' -import { useGraph } from 'contexts/GraphContext' - -type Props = { - block: StartBlock -} -export const StartBlockNode = ({ block }: Props) => { - const { previewingIds } = useGraph() - const [isMouseDown, setIsMouseDown] = useState(false) - const [titleValue, setTitleValue] = useState(block.title) - const { updateBlockPosition } = useTypebot() - const isPreviewing = useMemo( - () => previewingIds.sourceId === block.id, - [block.id, previewingIds.sourceId] - ) - - const handleTitleChange = (title: string) => setTitleValue(title) - - const handleMouseDown = () => { - setIsMouseDown(true) - } - const handleMouseUp = () => { - setIsMouseDown(false) - } - - const handleMouseMove = (event: MouseEvent) => { - if (!isMouseDown) return - const { movementX, movementY } = event - - updateBlockPosition(block.id, { - x: block.graphCoordinates.x + movementX, - y: block.graphCoordinates.y + movementY, - }) - } - useEventListener('mousemove', handleMouseMove) - - return ( - - - - - - - - ) -} diff --git a/apps/builder/components/board/graph/BlockNode/StepNode/RightClickMenu.tsx b/apps/builder/components/board/graph/BlockNode/StepNode/RightClickMenu.tsx index c522a33b65..a50d3860be 100644 --- a/apps/builder/components/board/graph/BlockNode/StepNode/RightClickMenu.tsx +++ b/apps/builder/components/board/graph/BlockNode/StepNode/RightClickMenu.tsx @@ -1,19 +1,12 @@ import { MenuList, MenuItem } from '@chakra-ui/react' import { TrashIcon } from 'assets/icons' -import { useTypebot } from 'contexts/TypebotContext' +import { useTypebot } from 'contexts/TypebotContext/TypebotContext' -export const StepNodeContextMenu = ({ - blockId, - stepId, -}: { - blockId: string - stepId: string -}) => { - const { removeStepFromBlock } = useTypebot() +export const StepNodeContextMenu = ({ stepId }: { stepId: string }) => { + const { deleteStep } = useTypebot() + + const handleDeleteClick = () => deleteStep(stepId) - const handleDeleteClick = () => { - removeStepFromBlock(blockId, stepId) - } return ( } onClick={handleDeleteClick}> diff --git a/apps/builder/components/board/graph/BlockNode/StepNode/StepContent.tsx b/apps/builder/components/board/graph/BlockNode/StepNode/StepContent.tsx index bbc2e2f922..e09e90f9ff 100644 --- a/apps/builder/components/board/graph/BlockNode/StepNode/StepContent.tsx +++ b/apps/builder/components/board/graph/BlockNode/StepNode/StepContent.tsx @@ -1,5 +1,5 @@ import { Flex, Text } from '@chakra-ui/react' -import { Step, StartStep, StepType } from 'bot-engine' +import { Step, StartStep, StepType } from 'models' export const StepContent = (props: Step | StartStep) => { switch (props.type) { diff --git a/apps/builder/components/board/graph/BlockNode/StepNode/StepNode.tsx b/apps/builder/components/board/graph/BlockNode/StepNode/StepNode.tsx index c94e40956c..88909f820f 100644 --- a/apps/builder/components/board/graph/BlockNode/StepNode/StepNode.tsx +++ b/apps/builder/components/board/graph/BlockNode/StepNode/StepNode.tsx @@ -1,6 +1,6 @@ import { Box, Flex, HStack, useEventListener } from '@chakra-ui/react' import React, { useEffect, useMemo, useState } from 'react' -import { Block, StartStep, Step, StepType } from 'bot-engine' +import { Block, Step, StepType } from 'models' import { SourceEndpoint } from './SourceEndpoint' import { useGraph } from 'contexts/GraphContext' import { StepIcon } from 'components/board/StepTypesList/StepIcon' @@ -8,7 +8,7 @@ import { isDefined } from 'utils' import { Coordinates } from '@dnd-kit/core/dist/types' import { TextEditor } from './TextEditor/TextEditor' import { StepContent } from './StepContent' -import { useTypebot } from 'contexts/TypebotContext' +import { useTypebot } from 'contexts/TypebotContext/TypebotContext' import { ContextMenu } from 'components/shared/ContextMenu' import { StepNodeContextMenu } from './RightClickMenu' @@ -19,7 +19,7 @@ export const StepNode = ({ onMouseMoveTopOfElement, onMouseDown, }: { - step: Step | StartStep + step: Step isConnectable: boolean onMouseMoveBottomOfElement?: () => void onMouseMoveTopOfElement?: () => void @@ -29,8 +29,7 @@ export const StepNode = ({ ) => void }) => { const { setConnectingIds, connectingIds } = useGraph() - const { removeStepFromBlock, typebot } = useTypebot() - const { blocks, startBlock } = typebot ?? {} + const { deleteStep, typebot } = useTypebot() const [isConnecting, setIsConnecting] = useState(false) const [mouseDownEvent, setMouseDownEvent] = useState<{ absolute: Coordinates; relative: Coordinates }>() @@ -59,9 +58,8 @@ export const StepNode = ({ }) } - const handleConnectionDragStart = () => { - setConnectingIds({ blockId: step.blockId, stepId: step.id }) - } + const handleConnectionDragStart = () => + setConnectingIds({ source: { blockId: step.blockId, stepId: step.id } }) const handleMouseDown = (e: React.MouseEvent) => { if (!onMouseDown) return @@ -95,7 +93,7 @@ export const StepNode = ({ (event.movementX > 0 || event.movementY > 0) if (isMovingAndIsMouseDown) { onMouseDown(mouseDownEvent, step as Step) - removeStepFromBlock(step.blockId, step.id) + deleteStep(step.id) setMouseDownEvent(undefined) } const element = event.currentTarget as HTMLDivElement @@ -110,18 +108,15 @@ export const StepNode = ({ } const connectedStubPosition: 'right' | 'left' | undefined = useMemo(() => { - const currentBlock = [startBlock, ...(blocks ?? [])].find( - (b) => b?.id === step.blockId - ) + if (!typebot) return + const currentBlock = typebot.blocks?.byId[step.blockId] const isDragginConnectorFromCurrentBlock = - connectingIds?.blockId === currentBlock?.id && + connectingIds?.source.blockId === currentBlock?.id && connectingIds?.target?.blockId const targetBlockId = isDragginConnectorFromCurrentBlock ? connectingIds.target?.blockId : step.target?.blockId - const targetedBlock = targetBlockId - ? (blocks ?? []).find((b) => b.id === targetBlockId) - : undefined + const targetedBlock = targetBlockId && typebot.blocks.byId[targetBlockId] return targetedBlock ? targetedBlock.graphCoordinates.x < (currentBlock as Block).graphCoordinates.x @@ -129,27 +124,24 @@ export const StepNode = ({ : 'right' : undefined }, [ - blocks, - connectingIds?.blockId, - connectingIds?.target?.blockId, + typebot, step.blockId, step.target?.blockId, - startBlock, + connectingIds?.source.blockId, + connectingIds?.target?.blockId, ]) return step.type === StepType.TEXT && (isEditing || (isEditing === undefined && step.content.plainText === '')) ? ( ) : ( - renderMenu={() => ( - - )} + renderMenu={() => } > {(ref, isOpened) => ( void } -export const TextEditor = ({ initialValue, ids, onClose }: TextEditorProps) => { +export const TextEditor = ({ + initialValue, + stepId, + onClose, +}: TextEditorProps) => { const editor = useMemo( - () => withPlate(createEditor(), { id: ids.stepId, plugins: platePlugins }), + () => withPlate(createEditor(), { id: stepId, plugins: platePlugins }), // eslint-disable-next-line react-hooks/exhaustive-deps [] ) @@ -48,13 +53,13 @@ export const TextEditor = ({ initialValue, ids, onClose }: TextEditorProps) => { const html = serializeHtml(editor, { nodes: value, }) - updateStep(ids, { + updateStep(stepId, { content: { html, richText: value, plainText: parseHtmlStringToPlainText(html), }, - }) + } as TextStep) } const handleMouseDown = (e: React.MouseEvent) => { @@ -72,7 +77,7 @@ export const TextEditor = ({ initialValue, ids, onClose }: TextEditorProps) => { > showSortPlaceholders: boolean onMouseUp: (index: number) => void }) => { @@ -88,12 +88,12 @@ export const StepsList = ({ rounded="lg" transition={showSortPlaceholders ? 'height 200ms' : 'none'} /> - {steps.map((step, idx) => ( - + {steps.allIds.map((stepId, idx) => ( + handleMouseOnTopOfStep(idx)} onMouseMoveBottomOfElement={() => { handleMouseOnBottomOfStep(idx) diff --git a/apps/builder/components/board/graph/Edges/DrawingEdge.tsx b/apps/builder/components/board/graph/Edges/DrawingEdge.tsx index 1f7624ba39..d5f0f9d670 100644 --- a/apps/builder/components/board/graph/Edges/DrawingEdge.tsx +++ b/apps/builder/components/board/graph/Edges/DrawingEdge.tsx @@ -1,6 +1,5 @@ import { useEventListener } from '@chakra-ui/hooks' import { Coordinates } from '@dnd-kit/core/dist/types' -import { Block } from 'bot-engine' import { headerHeight } from 'components/shared/TypebotHeader/TypebotHeader' import { blockWidth, @@ -9,7 +8,7 @@ import { stubLength, useGraph, } from 'contexts/GraphContext' -import { useTypebot } from 'contexts/TypebotContext' +import { useTypebot } from 'contexts/TypebotContext/TypebotContext' import React, { useMemo, useState } from 'react' import { computeFlowChartConnectorPath, @@ -19,34 +18,30 @@ import { roundCorners } from 'svg-round-corners' export const DrawingEdge = () => { const { graphPosition, setConnectingIds, connectingIds } = useGraph() - const { typebot, updateTarget } = useTypebot() - const { startBlock, blocks } = typebot ?? {} + const { typebot, updateStep } = useTypebot() const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 }) const sourceBlock = useMemo( - () => - [startBlock, ...(blocks ?? [])].find( - (b) => b?.id === connectingIds?.blockId - ), + () => connectingIds && typebot?.blocks.byId[connectingIds.source.blockId], // eslint-disable-next-line react-hooks/exhaustive-deps [connectingIds] ) const path = useMemo(() => { - if (!sourceBlock) return `` + if (!sourceBlock || !typebot) return `` if (connectingIds?.target) { - const targetedBlock = blocks?.find( - (b) => b.id === connectingIds.target?.blockId - ) as Block + const targetedBlock = typebot?.blocks.byId[connectingIds.target.blockId] const targetedStepIndex = connectingIds.target.stepId - ? targetedBlock.steps.findIndex( - (s) => s.id === connectingIds.target?.stepId + ? targetedBlock.stepIds.findIndex( + (stepId) => stepId === connectingIds.target?.stepId ) : undefined const anchorsPosition = getAnchorsPosition( sourceBlock, targetedBlock, - sourceBlock?.steps.findIndex((s) => s.id === connectingIds?.stepId), + sourceBlock?.stepIds.findIndex( + (stepId) => stepId === connectingIds?.source.stepId + ), targetedStepIndex ) return computeFlowChartConnectorPath(anchorsPosition) @@ -54,7 +49,9 @@ export const DrawingEdge = () => { return computeConnectingEdgePath( sourceBlock?.graphCoordinates, mousePosition, - sourceBlock.steps.findIndex((s) => s.id === connectingIds?.stepId) + sourceBlock.stepIds.findIndex( + (stepId) => stepId === connectingIds?.source.stepId + ) ) // eslint-disable-next-line react-hooks/exhaustive-deps }, [sourceBlock, mousePosition]) @@ -67,7 +64,8 @@ export const DrawingEdge = () => { } useEventListener('mousemove', handleMouseMove) useEventListener('mouseup', () => { - if (connectingIds?.target) updateTarget(connectingIds) + if (connectingIds?.target) + updateStep(connectingIds.source.stepId, { target: connectingIds.target }) setConnectingIds(null) }) diff --git a/apps/builder/components/board/graph/Edges/Edge.tsx b/apps/builder/components/board/graph/Edges/Edge.tsx index 0694883350..94ba80d8c0 100644 --- a/apps/builder/components/board/graph/Edges/Edge.tsx +++ b/apps/builder/components/board/graph/Edges/Edge.tsx @@ -1,6 +1,5 @@ -import { Block, StartStep, Step, Target } from 'bot-engine' import { Coordinates, useGraph } from 'contexts/GraphContext' -import { useTypebot } from 'contexts/TypebotContext' +import { useTypebot } from 'contexts/TypebotContext/TypebotContext' import React, { useMemo } from 'react' import { getAnchorsPosition, @@ -14,58 +13,43 @@ export type AnchorsPositionProps = { totalSegments: number } -export type StepWithTarget = Omit & { - target: Target -} - -export const Edge = ({ step }: { step: StepWithTarget }) => { +export const Edge = ({ stepId }: { stepId: string }) => { const { typebot } = useTypebot() const { previewingIds } = useGraph() + const step = typebot?.steps.byId[stepId] const isPreviewing = useMemo( () => - previewingIds.sourceId === step.blockId && - previewingIds.targetId === step.target.blockId, - [ - previewingIds.sourceId, - previewingIds.targetId, - step.blockId, - step.target.blockId, - ] + previewingIds.sourceId === step?.blockId && + previewingIds.targetId === step?.target?.blockId, + [previewingIds.sourceId, previewingIds.targetId, step] ) - const { blocks, startBlock } = typebot ?? {} const { sourceBlock, targetBlock, targetStepIndex } = useMemo(() => { - const targetBlock = blocks?.find( - (b) => b?.id === step.target.blockId - ) as Block + if (!typebot) return {} + const step = typebot.steps.byId[stepId] + if (!step.target) return {} + const sourceBlock = typebot.blocks.byId[step.blockId] + const targetBlock = typebot.blocks.byId[step.target.blockId] const targetStepIndex = step.target.stepId - ? targetBlock.steps.findIndex((s) => s.id === step.target.stepId) + ? targetBlock.stepIds.indexOf(step.target.stepId) : undefined return { - sourceBlock: [startBlock, ...(blocks ?? [])].find( - (b) => b?.id === step.blockId - ), + sourceBlock, targetBlock, targetStepIndex, } - }, [ - blocks, - startBlock, - step.blockId, - step.target.blockId, - step.target.stepId, - ]) + }, [stepId, typebot]) const path = useMemo(() => { if (!sourceBlock || !targetBlock) return `` const anchorsPosition = getAnchorsPosition( sourceBlock, targetBlock, - sourceBlock.steps.findIndex((s) => s.id === step.id), + sourceBlock.stepIds.indexOf(stepId), targetStepIndex ) return computeFlowChartConnectorPath(anchorsPosition) - }, [sourceBlock, step.id, targetBlock, targetStepIndex]) + }, [sourceBlock, stepId, targetBlock, targetStepIndex]) return ( { const { typebot } = useTypebot() - const { blocks, startBlock } = typebot ?? {} - const stepsWithTarget: StepWithTarget[] = useMemo(() => { - if (!startBlock) return [] - return [ - ...(startBlock.steps.filter((s) => s.target) as StepWithTarget[]), - ...((blocks ?? []) - .flatMap((b) => b.steps) - .filter((s) => s.target) as StepWithTarget[]), - ] - }, [blocks, startBlock]) + const stepIdsWithTarget: string[] = useMemo(() => { + if (!typebot) return [] + return typebot.steps.allIds.filter((stepId) => + isDefined(typebot.steps.byId[stepId].target) + ) + }, [typebot]) return ( { top="0" > - {stepsWithTarget.map((step) => ( - + {stepIdsWithTarget.map((stepId) => ( + ))} { const { draggedStepType, setDraggedStepType, draggedStep, setDraggedStep } = useDnd() const graphContainerRef = useRef(null) - const { addNewBlock, typebot } = useTypebot() + const { createBlock, typebot } = useTypebot() const { graphPosition, setGraphPosition } = useGraph() const transform = useMemo( () => @@ -41,11 +41,10 @@ const Graph = ({ ...props }: FlexProps) => { const handleMouseUp = (e: MouseEvent) => { if (!draggedStep && !draggedStepType) return - addNewBlock({ - step: draggedStep, - type: draggedStepType, + createBlock({ x: e.clientX - graphPosition.x - blockWidth / 3, y: e.clientY - graphPosition.y - 20 - headerHeight, + step: draggedStep ?? (draggedStepType as StepType), }) setDraggedStep(undefined) setDraggedStepType(undefined) @@ -71,9 +70,8 @@ const Graph = ({ ...props }: FlexProps) => { > {props.children} - {typebot.startBlock && } - {(typebot.blocks ?? []).map((block) => ( - + {typebot.blocks.allIds.map((blockId) => ( + ))} diff --git a/apps/builder/components/board/preview/PreviewDrawer.tsx b/apps/builder/components/board/preview/PreviewDrawer.tsx index 97befc31df..c64ea2883b 100644 --- a/apps/builder/components/board/preview/PreviewDrawer.tsx +++ b/apps/builder/components/board/preview/PreviewDrawer.tsx @@ -12,7 +12,7 @@ import { TypebotViewer } from 'bot-engine' import { headerHeight } from 'components/shared/TypebotHeader' import { useEditor } from 'contexts/EditorContext' import { useGraph } from 'contexts/GraphContext' -import { useTypebot } from 'contexts/TypebotContext' +import { useTypebot } from 'contexts/TypebotContext/TypebotContext' import React, { useMemo, useState } from 'react' import { parseTypebotToPublicTypebot } from 'services/publicTypebot' diff --git a/apps/builder/components/dashboard/FolderContent.tsx b/apps/builder/components/dashboard/FolderContent.tsx index 454f1ae5f6..2bd0449c5c 100644 --- a/apps/builder/components/dashboard/FolderContent.tsx +++ b/apps/builder/components/dashboard/FolderContent.tsx @@ -1,5 +1,5 @@ import { DashboardFolder } from '.prisma/client' -import { Typebot } from 'bot-engine' +import { Typebot } from 'models' import { Button, Flex, diff --git a/apps/builder/components/dashboard/FolderContent/TypebotButton.tsx b/apps/builder/components/dashboard/FolderContent/TypebotButton.tsx index 14da6bcca2..3b7a83fe6c 100644 --- a/apps/builder/components/dashboard/FolderContent/TypebotButton.tsx +++ b/apps/builder/components/dashboard/FolderContent/TypebotButton.tsx @@ -16,7 +16,7 @@ import { MoreButton } from 'components/MoreButton' import { ConfirmModal } from 'components/modals/ConfirmModal' import { GlobeIcon, ToolIcon } from 'assets/icons' import { deleteTypebot, duplicateTypebot } from 'services/typebots' -import { Typebot } from 'bot-engine' +import { Typebot } from 'models' type ChatbotCardProps = { typebot: Typebot diff --git a/apps/builder/components/dashboard/FolderContent/TypebotButtonOverlay.tsx b/apps/builder/components/dashboard/FolderContent/TypebotButtonOverlay.tsx index b40529a37e..e18261a53a 100644 --- a/apps/builder/components/dashboard/FolderContent/TypebotButtonOverlay.tsx +++ b/apps/builder/components/dashboard/FolderContent/TypebotButtonOverlay.tsx @@ -1,6 +1,6 @@ import { Button, Flex, Text, VStack } from '@chakra-ui/react' import { GlobeIcon, ToolIcon } from 'assets/icons' -import { Typebot } from 'bot-engine' +import { Typebot } from 'models' type Props = { typebot: Typebot diff --git a/apps/builder/components/results/SubmissionsTable/SubmissionsTable.tsx b/apps/builder/components/results/SubmissionsTable/SubmissionsTable.tsx index 66ed2ae208..b2bb0ca33c 100644 --- a/apps/builder/components/results/SubmissionsTable/SubmissionsTable.tsx +++ b/apps/builder/components/results/SubmissionsTable/SubmissionsTable.tsx @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable react/jsx-key */ import { Box, Checkbox, Flex } from '@chakra-ui/react' -import { useTypebot } from 'contexts/TypebotContext' +import { useTypebot } from 'contexts/TypebotContext/TypebotContext' import React, { useEffect, useMemo, useRef } from 'react' import { Hooks, useFlexLayout, useRowSelect, useTable } from 'react-table' import { parseSubmissionsColumns } from 'services/publicTypebot' diff --git a/apps/builder/components/settings/SettingsContent.tsx b/apps/builder/components/settings/SettingsContent.tsx index c138c545fc..adf6091a74 100644 --- a/apps/builder/components/settings/SettingsContent.tsx +++ b/apps/builder/components/settings/SettingsContent.tsx @@ -1,17 +1,17 @@ import { Flex, Stack } from '@chakra-ui/react' -import { TypingEmulationSettings } from 'bot-engine' -import { useTypebot } from 'contexts/TypebotContext' +import { TypingEmulationSettings } from 'models' +import { useTypebot } from 'contexts/TypebotContext/TypebotContext' import React from 'react' import { TypingEmulation } from './TypingEmulation' export const SettingsContent = () => { - const { typebot, updateSettings } = useTypebot() + const { typebot, updateTypebot } = useTypebot() const handleTypingEmulationUpdate = ( typingEmulation: TypingEmulationSettings ) => { if (!typebot) return - updateSettings({ ...typebot.settings, typingEmulation }) + updateTypebot({ settings: { ...typebot.settings, typingEmulation } }) } return ( diff --git a/apps/builder/components/settings/TypingEmulation.tsx b/apps/builder/components/settings/TypingEmulation.tsx index df64afc9ea..41a6c35f0e 100644 --- a/apps/builder/components/settings/TypingEmulation.tsx +++ b/apps/builder/components/settings/TypingEmulation.tsx @@ -1,5 +1,5 @@ import { Flex, Stack, Switch, Text } from '@chakra-ui/react' -import { TypingEmulationSettings } from 'bot-engine' +import { TypingEmulationSettings } from 'models' import React from 'react' import { SmartNumberInput } from './SmartNumberInput' diff --git a/apps/builder/components/share/ShareContent.tsx b/apps/builder/components/share/ShareContent.tsx index b03b57e6d0..3650521681 100644 --- a/apps/builder/components/share/ShareContent.tsx +++ b/apps/builder/components/share/ShareContent.tsx @@ -1,15 +1,15 @@ import { Flex, Heading, Stack } from '@chakra-ui/react' -import { useTypebot } from 'contexts/TypebotContext' +import { useTypebot } from 'contexts/TypebotContext/TypebotContext' import React from 'react' import { parseDefaultPublicId } from 'services/typebots' import { EditableUrl } from './EditableUrl' export const ShareContent = () => { - const { typebot, updatePublicId } = useTypebot() + const { typebot, updateTypebot } = useTypebot() const handlePublicIdChange = (publicId: string) => { if (publicId === typebot?.publicId) return - updatePublicId(publicId) + updateTypebot({ publicId }) } return ( diff --git a/apps/builder/components/shared/TypebotHeader/SaveButton.tsx b/apps/builder/components/shared/TypebotHeader/SaveButton.tsx index 3dd6a352b0..6b77957f43 100644 --- a/apps/builder/components/shared/TypebotHeader/SaveButton.tsx +++ b/apps/builder/components/shared/TypebotHeader/SaveButton.tsx @@ -1,6 +1,6 @@ import { IconButton, Text, Tooltip } from '@chakra-ui/react' import { CheckIcon, SaveIcon } from 'assets/icons' -import { useTypebot } from 'contexts/TypebotContext' +import { useTypebot } from 'contexts/TypebotContext/TypebotContext' import React from 'react' export const SaveButton = () => { diff --git a/apps/builder/components/shared/TypebotHeader/TypebotHeader.tsx b/apps/builder/components/shared/TypebotHeader/TypebotHeader.tsx index 241e4b48b8..7eabf2bd8a 100644 --- a/apps/builder/components/shared/TypebotHeader/TypebotHeader.tsx +++ b/apps/builder/components/shared/TypebotHeader/TypebotHeader.tsx @@ -2,7 +2,7 @@ import { Flex, HStack, Button, IconButton } from '@chakra-ui/react' import { ChevronLeftIcon } from 'assets/icons' import { NextChakraLink } from 'components/nextChakra/NextChakraLink' import { RightPanel, useEditor } from 'contexts/EditorContext' -import { useTypebot } from 'contexts/TypebotContext' +import { useTypebot } from 'contexts/TypebotContext/TypebotContext' import { useRouter } from 'next/router' import React from 'react' import { PublishButton } from '../buttons/PublishButton' diff --git a/apps/builder/components/shared/buttons/PublishButton.tsx b/apps/builder/components/shared/buttons/PublishButton.tsx index a3346c38be..f5dbaa76b7 100644 --- a/apps/builder/components/shared/buttons/PublishButton.tsx +++ b/apps/builder/components/shared/buttons/PublishButton.tsx @@ -1,5 +1,5 @@ import { Button } from '@chakra-ui/react' -import { useTypebot } from 'contexts/TypebotContext' +import { useTypebot } from 'contexts/TypebotContext/TypebotContext' export const PublishButton = () => { const { isPublishing, isPublished, publishTypebot } = useTypebot() diff --git a/apps/builder/components/theme/GeneralContent/BackgroundSelector/BackgroundContent.tsx b/apps/builder/components/theme/GeneralContent/BackgroundSelector/BackgroundContent.tsx index c647abe94a..1f85e423bb 100644 --- a/apps/builder/components/theme/GeneralContent/BackgroundSelector/BackgroundContent.tsx +++ b/apps/builder/components/theme/GeneralContent/BackgroundSelector/BackgroundContent.tsx @@ -1,5 +1,5 @@ import { Flex, Text } from '@chakra-ui/react' -import { Background, BackgroundType } from 'bot-engine' +import { Background, BackgroundType } from 'models' import React from 'react' import { ColorPicker } from '../ColorPicker' diff --git a/apps/builder/components/theme/GeneralContent/BackgroundSelector/BackgroundSelector.tsx b/apps/builder/components/theme/GeneralContent/BackgroundSelector/BackgroundSelector.tsx index 8dd3cd4b42..6715cd2c5b 100644 --- a/apps/builder/components/theme/GeneralContent/BackgroundSelector/BackgroundSelector.tsx +++ b/apps/builder/components/theme/GeneralContent/BackgroundSelector/BackgroundSelector.tsx @@ -1,5 +1,5 @@ import { Stack, Text } from '@chakra-ui/react' -import { Background, BackgroundType } from 'bot-engine' +import { Background, BackgroundType } from 'models' import { deepEqual } from 'fast-equals' import React, { useEffect, useState } from 'react' import { BackgroundContent } from './BackgroundContent' diff --git a/apps/builder/components/theme/GeneralContent/BackgroundSelector/BackgroundTypeRadioButtons.tsx b/apps/builder/components/theme/GeneralContent/BackgroundSelector/BackgroundTypeRadioButtons.tsx index dd43736b32..f171fa59eb 100644 --- a/apps/builder/components/theme/GeneralContent/BackgroundSelector/BackgroundTypeRadioButtons.tsx +++ b/apps/builder/components/theme/GeneralContent/BackgroundSelector/BackgroundTypeRadioButtons.tsx @@ -6,7 +6,7 @@ import { useRadioGroup, UseRadioProps, } from '@chakra-ui/react' -import { BackgroundType } from 'bot-engine' +import { BackgroundType } from 'models' import { ReactNode } from 'react' type Props = { diff --git a/apps/builder/components/theme/GeneralContent/GeneralContent.tsx b/apps/builder/components/theme/GeneralContent/GeneralContent.tsx index 9539555536..31f7571d56 100644 --- a/apps/builder/components/theme/GeneralContent/GeneralContent.tsx +++ b/apps/builder/components/theme/GeneralContent/GeneralContent.tsx @@ -8,28 +8,32 @@ import { Stack, } from '@chakra-ui/react' import { PencilIcon } from 'assets/icons' -import { Background } from 'bot-engine' -import { useTypebot } from 'contexts/TypebotContext' +import { Background } from 'models' +import { useTypebot } from 'contexts/TypebotContext/TypebotContext' import React from 'react' import { BackgroundSelector } from './BackgroundSelector' import { FontSelector } from './FontSelector' export const GeneralContent = () => { - const { typebot, updateTheme } = useTypebot() + const { typebot, updateTypebot } = useTypebot() const handleSelectFont = (font: string) => { if (!typebot) return - updateTheme({ - ...typebot.theme, - general: { ...typebot.theme.general, font }, + updateTypebot({ + theme: { + ...typebot.theme, + general: { ...typebot.theme.general, font }, + }, }) } const handleBackgroundChange = (background: Background) => { if (!typebot) return - updateTheme({ - ...typebot.theme, - general: { ...typebot.theme.general, background }, + updateTypebot({ + theme: { + ...typebot.theme, + general: { ...typebot.theme.general, background }, + }, }) } return ( diff --git a/apps/builder/components/theme/ThemeContent.tsx b/apps/builder/components/theme/ThemeContent.tsx index 50613fe879..f1fb0d14ac 100644 --- a/apps/builder/components/theme/ThemeContent.tsx +++ b/apps/builder/components/theme/ThemeContent.tsx @@ -1,6 +1,6 @@ import { Flex } from '@chakra-ui/react' import { TypebotViewer } from 'bot-engine' -import { useTypebot } from 'contexts/TypebotContext' +import { useTypebot } from 'contexts/TypebotContext/TypebotContext' import React, { useMemo } from 'react' import { parseTypebotToPublicTypebot } from 'services/publicTypebot' import { SideMenu } from './SideMenu' diff --git a/apps/builder/contexts/AnalyticsGraphProvider.tsx b/apps/builder/contexts/AnalyticsGraphProvider.tsx index 71d0db0863..723454a29c 100644 --- a/apps/builder/contexts/AnalyticsGraphProvider.tsx +++ b/apps/builder/contexts/AnalyticsGraphProvider.tsx @@ -1,4 +1,4 @@ -import { Block, PublicTypebot } from 'bot-engine' +import { PublicTypebot } from 'models' import { createContext, Dispatch, @@ -8,6 +8,7 @@ import { useState, } from 'react' import { Coordinates } from './GraphContext' +import produce from 'immer' type Position = Coordinates & { scale: number } @@ -35,31 +36,13 @@ export const AnalyticsGraphProvider = ({ const [graphPosition, setGraphPosition] = useState(graphPositionDefaultValue) - const updateBlocks = (blocks: Block[]) => { - if (!typebot) return - setTypebot({ - ...typebot, - blocks: [...blocks], - }) - } - const updateBlockPosition = (blockId: string, newPosition: Coordinates) => { if (!typebot) return - blockId === 'start-block' - ? setTypebot({ - ...typebot, - startBlock: { - ...typebot.startBlock, - graphCoordinates: newPosition, - }, - }) - : updateBlocks( - typebot.blocks.map((block) => - block.id === blockId - ? { ...block, graphCoordinates: newPosition } - : block - ) - ) + setTypebot( + produce(typebot, (nextTypebot) => { + nextTypebot.blocks.byId[blockId].graphCoordinates = newPosition + }) + ) } return ( diff --git a/apps/builder/contexts/DndContext.tsx b/apps/builder/contexts/DndContext.tsx index 8def57824b..7a324b6895 100644 --- a/apps/builder/contexts/DndContext.tsx +++ b/apps/builder/contexts/DndContext.tsx @@ -1,4 +1,4 @@ -import { Step, StepType } from 'bot-engine' +import { Step, StepType } from 'models' import { createContext, Dispatch, diff --git a/apps/builder/contexts/GraphContext.tsx b/apps/builder/contexts/GraphContext.tsx index 4d7412b23b..0f3137e2ae 100644 --- a/apps/builder/contexts/GraphContext.tsx +++ b/apps/builder/contexts/GraphContext.tsx @@ -1,4 +1,4 @@ -import { Block, Step, StepType, Target } from 'bot-engine' +import { Block, Step, Target } from 'models' import { createContext, Dispatch, @@ -41,26 +41,22 @@ export type Node = Omit & { })[] } -export type NewBlockPayload = { - x: number - y: number - type?: StepType - step?: Step -} - const graphPositionDefaultValue = { x: 400, y: 100, scale: 1 } +type ConnectingIdsProps = { + source: { blockId: string; stepId: string } + target?: Target +} | null + +type PreviewingIdsProps = { sourceId?: string; targetId?: string } + const graphContext = createContext<{ graphPosition: Position setGraphPosition: Dispatch> - connectingIds: { blockId: string; stepId: string; target?: Target } | null - setConnectingIds: Dispatch< - SetStateAction<{ blockId: string; stepId: string; target?: Target } | null> - > - previewingIds: { sourceId?: string; targetId?: string } - setPreviewingIds: Dispatch< - SetStateAction<{ sourceId?: string; targetId?: string }> - > + connectingIds: ConnectingIdsProps + setConnectingIds: Dispatch> + previewingIds: PreviewingIdsProps + setPreviewingIds: Dispatch> // eslint-disable-next-line @typescript-eslint/ban-ts-comment //@ts-ignore }>({ @@ -70,15 +66,8 @@ const graphContext = createContext<{ export const GraphProvider = ({ children }: { children: ReactNode }) => { const [graphPosition, setGraphPosition] = useState(graphPositionDefaultValue) - const [connectingIds, setConnectingIds] = useState<{ - blockId: string - stepId: string - target?: Target - } | null>(null) - const [previewingIds, setPreviewingIds] = useState<{ - sourceId?: string - targetId?: string - }>({}) + const [connectingIds, setConnectingIds] = useState(null) + const [previewingIds, setPreviewingIds] = useState({}) return ( void - updateStep: ( - ids: { stepId: string; blockId: string }, - updates: Partial - ) => void - addNewBlock: (props: NewBlockPayload) => void - updateBlockPosition: (blockId: string, newPositon: Coordinates) => void - removeBlock: (blockId: string) => void - addStepToBlock: ( - blockId: string, - step: StepType | Step, - index: number - ) => void - removeStepFromBlock: (blockId: string, stepId: string) => void - updateTarget: (connectingIds: { - blockId: string - stepId: string - target?: Target - }) => void - undo: () => void - updateTheme: (theme: Theme) => void - updateSettings: (settings: Settings) => void - updatePublicId: (publicId: string) => void - publishTypebot: () => void - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - //@ts-ignore -}>({}) - -export const TypebotContext = ({ - children, - typebotId, -}: { - children: ReactNode - typebotId?: string -}) => { - const router = useRouter() - const toast = useToast({ - position: 'top-right', - status: 'error', - }) - const [undoStack, setUndoStack] = useState([]) - const { typebot, publishedTypebot, isLoading, mutate } = useFetchedTypebot({ - typebotId, - onError: (error) => - toast({ - title: 'Error while fetching typebot', - description: error.message, - }), - }) - const [localTypebot, setLocalTypebot] = useState() - const [localPublishedTypebot, setLocalPublishedTypebot] = - useState() - const [isSavingLoading, setIsSavingLoading] = useState(false) - const [isPublishing, setIsPublishing] = useState(false) - - const hasUnsavedChanges = useMemo( - () => - isDefined(typebot) && - isDefined(localTypebot) && - !deepEqual(localTypebot, typebot), - [typebot, localTypebot] - ) - const isPublished = useMemo( - () => - isDefined(typebot) && - isDefined(publishedTypebot) && - checkIfPublished(typebot, publishedTypebot), - [typebot, publishedTypebot] - ) - - useEffect(() => { - if (!localTypebot || !typebot) return - if (!checkIfTypebotsAreEqual(localTypebot, typebot)) { - pushNewTypebotInUndoStack(localTypebot) - window.removeEventListener('beforeunload', preventUserFromRefreshing) - window.addEventListener('beforeunload', preventUserFromRefreshing) - } else { - window.removeEventListener('beforeunload', preventUserFromRefreshing) - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [localTypebot]) - - useEffect(() => { - if (isLoading) return - if (!typebot) { - toast({ status: 'info', description: "Couldn't find typebot" }) - router.replace('/typebots') - return - } - setLocalTypebot({ ...typebot }) - if (publishedTypebot) setLocalPublishedTypebot({ ...publishedTypebot }) - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isLoading]) - - const pushNewTypebotInUndoStack = (typebot: Typebot) => { - setUndoStack([...undoStack, typebot]) - } - - const undo = () => { - const lastTypebot = [...undoStack].pop() - setUndoStack(undoStack.slice(0, -1)) - setLocalTypebot(lastTypebot) - } - - const saveTypebot = async () => { - if (!localTypebot) return - setIsSavingLoading(true) - const { error } = await updateTypebot(localTypebot.id, localTypebot) - setIsSavingLoading(false) - if (error) return toast({ title: error.name, description: error.message }) - mutate({ typebot: localTypebot }) - window.removeEventListener('beforeunload', preventUserFromRefreshing) - } - - const updateBlocks = (blocks: Block[]) => { - if (!localTypebot) return - setLocalTypebot({ - ...localTypebot, - blocks: [...blocks], - }) - } - - const updateStep = ( - { blockId, stepId }: { blockId: string; stepId: string }, - updates: Partial> - ) => { - if (!localTypebot) return - setLocalTypebot({ - ...localTypebot, - blocks: localTypebot.blocks.map((block) => - block.id === blockId - ? { - ...block, - steps: block.steps.map((step) => - step.id === stepId ? { ...step, ...updates } : step - ), - } - : block - ), - }) - } - - const addNewBlock = ({ x, y, type, step }: NewBlockPayload) => { - if (!localTypebot) return - updateBlocks([ - ...localTypebot.blocks.filter((block) => block.steps.length > 0), - parseNewBlock({ - step, - type, - totalBlocks: localTypebot.blocks.length, - initialCoordinates: { - x, - y, - }, - }), - ]) - } - - const updateBlockPosition = (blockId: string, newPosition: Coordinates) => { - if (!localTypebot) return - blockId === 'start-block' - ? setLocalTypebot({ - ...localTypebot, - startBlock: { - ...localTypebot.startBlock, - graphCoordinates: newPosition, - }, - }) - : updateBlocks( - localTypebot.blocks.map((block) => - block.id === blockId - ? { ...block, graphCoordinates: newPosition } - : block - ) - ) - } - - const addStepToBlock = ( - blockId: string, - step: StepType | Step, - index: number - ) => { - if (!localTypebot) return - updateBlocks( - localTypebot.blocks - .map((block) => - block.id === blockId - ? { - ...block, - steps: insertItemInList( - block.steps, - index, - typeof step === 'string' - ? parseNewStep(step as StepType, block.id) - : { ...step, blockId: block.id } - ), - } - : block - ) - .filter((block) => block.steps.length > 0) - ) - } - - const removeStepFromBlock = (blockId: string, stepId: string) => { - if (!localTypebot) return - updateBlocks( - localTypebot.blocks.map((block) => - block.id === blockId - ? { - ...block, - steps: [...block.steps.filter((step) => step.id !== stepId)], - } - : block - ) - ) - } - - const updateTarget = ({ - blockId, - stepId, - target, - }: { - blockId: string - stepId: string - target?: Target - }) => { - if (!localTypebot) return - blockId === 'start-block' - ? setLocalTypebot({ - ...localTypebot, - startBlock: { - ...localTypebot.startBlock, - steps: [{ ...localTypebot.startBlock.steps[0], target }], - }, - }) - : updateBlocks( - localTypebot.blocks.map((block) => - block.id === blockId - ? { - ...block, - steps: [ - ...block.steps.map((step) => - step.id === stepId ? { ...step, target } : step - ), - ], - } - : block - ) - ) - } - - const removeBlock = (blockId: string) => { - if (!localTypebot) return - const blocks = [...localTypebot.blocks.filter((b) => b.id !== blockId)] - setLocalTypebot({ ...localTypebot, blocks }) - } - - const updateTheme = (theme: Theme) => { - if (!localTypebot) return - setLocalTypebot({ ...localTypebot, theme }) - } - - const updateSettings = (settings: Settings) => { - if (!localTypebot) return - setLocalTypebot({ ...localTypebot, settings }) - } - - const updatePublicId = (publicId: string) => { - if (!localTypebot) return - setLocalTypebot({ ...localTypebot, publicId }) - } - - const publishTypebot = async () => { - if (!localTypebot) return - if (!localPublishedTypebot) { - const newPublicId = parseDefaultPublicId( - localTypebot.name, - localTypebot.id - ) - updatePublicId(newPublicId) - localTypebot.publicId = newPublicId - } - if (hasUnsavedChanges || !localPublishedTypebot) await saveTypebot() - setIsPublishing(true) - if (localPublishedTypebot) { - const { error } = await updatePublishedTypebot( - localPublishedTypebot.id, - omit(parseTypebotToPublicTypebot(localTypebot), 'id') - ) - setIsPublishing(false) - if (error) return toast({ title: error.name, description: error.message }) - } else { - const { error } = await createPublishedTypebot( - omit(parseTypebotToPublicTypebot(localTypebot), 'id') - ) - setIsPublishing(false) - if (error) return toast({ title: error.name, description: error.message }) - } - mutate({ typebot: localTypebot }) - } - - return ( - - {children} - - ) -} - -export const useTypebot = () => useContext(typebotContext) - -export const useFetchedTypebot = ({ - typebotId, - onError, -}: { - typebotId?: string - onError: (error: Error) => void -}) => { - const { data, error, mutate } = useSWR< - { typebot: Typebot; publishedTypebot?: PublicTypebot }, - Error - >(typebotId ? `/api/typebots/${typebotId}` : null, fetcher) - if (error) onError(error) - return { - typebot: data?.typebot, - publishedTypebot: data?.publishedTypebot, - isLoading: !error && !data, - mutate, - } -} diff --git a/apps/builder/contexts/TypebotContext/TypebotContext.tsx b/apps/builder/contexts/TypebotContext/TypebotContext.tsx new file mode 100644 index 0000000000..195cc2c5ce --- /dev/null +++ b/apps/builder/contexts/TypebotContext/TypebotContext.tsx @@ -0,0 +1,232 @@ +import { useToast } from '@chakra-ui/react' +import { deepEqual } from 'fast-equals' +import { PublicTypebot, Settings, Theme, Typebot } from 'models' +import { useRouter } from 'next/router' +import { + createContext, + ReactNode, + useContext, + useEffect, + useMemo, + useState, +} from 'react' +import { + createPublishedTypebot, + parseTypebotToPublicTypebot, + updatePublishedTypebot, +} from 'services/publicTypebot' +import { + checkIfPublished, + checkIfTypebotsAreEqual, + parseDefaultPublicId, + updateTypebot, +} from 'services/typebots' +import { fetcher, omit, preventUserFromRefreshing } from 'services/utils' +import useSWR from 'swr' +import { isDefined } from 'utils' +import { BlocksActions, blocksActions } from './actions/blocks' +import { useImmer, Updater } from 'use-immer' +import { stepsAction, StepsActions } from './actions/steps' + +type UpdateTypebotPayload = Partial<{ + theme: Theme + settings: Settings + publicId: string +}> +const typebotContext = createContext< + { + typebot?: Typebot + publishedTypebot?: PublicTypebot + isPublished: boolean + isPublishing: boolean + hasUnsavedChanges: boolean + isSavingLoading: boolean + save: () => void + undo: () => void + updateTypebot: (updates: UpdateTypebotPayload) => void + publishTypebot: () => void + } & BlocksActions & + StepsActions + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + //@ts-ignore +>({}) + +export const TypebotContext = ({ + children, + typebotId, +}: { + children: ReactNode + typebotId?: string +}) => { + const router = useRouter() + const toast = useToast({ + position: 'top-right', + status: 'error', + }) + const [undoStack, setUndoStack] = useState([]) + const { typebot, publishedTypebot, isLoading, mutate } = useFetchedTypebot({ + typebotId, + onError: (error) => + toast({ + title: 'Error while fetching typebot', + description: error.message, + }), + }) + const [localTypebot, setLocalTypebot] = useImmer( + undefined + ) + const [localPublishedTypebot, setLocalPublishedTypebot] = + useState() + const [isSavingLoading, setIsSavingLoading] = useState(false) + const [isPublishing, setIsPublishing] = useState(false) + + const hasUnsavedChanges = useMemo( + () => + isDefined(typebot) && + isDefined(localTypebot) && + !deepEqual(localTypebot, typebot), + [typebot, localTypebot] + ) + const isPublished = useMemo( + () => + isDefined(typebot) && + isDefined(publishedTypebot) && + checkIfPublished(typebot, publishedTypebot), + [typebot, publishedTypebot] + ) + + useEffect(() => { + if (!localTypebot || !typebot) return + if (!checkIfTypebotsAreEqual(localTypebot, typebot)) { + pushNewTypebotInUndoStack(localTypebot) + window.removeEventListener('beforeunload', preventUserFromRefreshing) + window.addEventListener('beforeunload', preventUserFromRefreshing) + } else { + window.removeEventListener('beforeunload', preventUserFromRefreshing) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [localTypebot]) + + useEffect(() => { + if (isLoading) return + if (!typebot) { + toast({ status: 'info', description: "Couldn't find typebot" }) + router.replace('/typebots') + return + } + setLocalTypebot({ ...typebot }) + if (publishedTypebot) setLocalPublishedTypebot({ ...publishedTypebot }) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isLoading]) + + const pushNewTypebotInUndoStack = (typebot: Typebot) => { + setUndoStack([...undoStack, typebot]) + } + + const undo = () => { + const lastTypebot = [...undoStack].pop() + setUndoStack(undoStack.slice(0, -1)) + setLocalTypebot(lastTypebot) + } + + const saveTypebot = async (typebot?: Typebot) => { + if (!localTypebot) return + setIsSavingLoading(true) + const { error } = await updateTypebot( + typebot?.id ?? localTypebot.id, + typebot ?? localTypebot + ) + setIsSavingLoading(false) + if (error) return toast({ title: error.name, description: error.message }) + mutate({ typebot: typebot ?? localTypebot }) + window.removeEventListener('beforeunload', preventUserFromRefreshing) + } + + const updateLocalTypebot = ({ + publicId, + settings, + theme, + }: UpdateTypebotPayload) => { + setLocalTypebot((typebot) => { + if (!typebot) return + if (publicId) typebot.publicId = publicId + if (settings) typebot.settings = settings + if (theme) typebot.theme = theme + }) + } + + const publishTypebot = async () => { + if (!localTypebot) return + const newLocalTypebot = { ...localTypebot } + if (!localPublishedTypebot) { + const newPublicId = parseDefaultPublicId( + localTypebot.name, + localTypebot.id + ) + updateLocalTypebot({ publicId: newPublicId }) + newLocalTypebot.publicId = newPublicId + } + if (hasUnsavedChanges || !localPublishedTypebot) + await saveTypebot(newLocalTypebot) + setIsPublishing(true) + if (localPublishedTypebot) { + const { error } = await updatePublishedTypebot( + localPublishedTypebot.id, + omit(parseTypebotToPublicTypebot(newLocalTypebot), 'id') + ) + setIsPublishing(false) + if (error) return toast({ title: error.name, description: error.message }) + } else { + const { data, error } = await createPublishedTypebot( + omit(parseTypebotToPublicTypebot(newLocalTypebot), 'id') + ) + setLocalPublishedTypebot(data) + setIsPublishing(false) + if (error) return toast({ title: error.name, description: error.message }) + } + mutate({ typebot: localTypebot }) + } + + return ( + ), + ...stepsAction(setLocalTypebot as Updater), + }} + > + {children} + + ) +} + +export const useTypebot = () => useContext(typebotContext) + +export const useFetchedTypebot = ({ + typebotId, + onError, +}: { + typebotId?: string + onError: (error: Error) => void +}) => { + const { data, error, mutate } = useSWR< + { typebot: Typebot; publishedTypebot?: PublicTypebot }, + Error + >(typebotId ? `/api/typebots/${typebotId}` : null, fetcher) + if (error) onError(error) + return { + typebot: data?.typebot, + publishedTypebot: data?.publishedTypebot, + isLoading: !error && !data, + mutate, + } +} diff --git a/apps/builder/contexts/TypebotContext/actions/blocks.ts b/apps/builder/contexts/TypebotContext/actions/blocks.ts new file mode 100644 index 0000000000..2f73a7c68b --- /dev/null +++ b/apps/builder/contexts/TypebotContext/actions/blocks.ts @@ -0,0 +1,40 @@ +import { Coordinates } from 'contexts/GraphContext' +import { Block, Step, StepType, Typebot } from 'models' +import { parseNewBlock } from 'services/typebots' +import { Updater } from 'use-immer' +import { createStepDraft, deleteStepDraft } from './steps' + +export type BlocksActions = { + createBlock: (props: Coordinates & { step: StepType | Step }) => void + updateBlock: (blockId: string, updates: Partial>) => void + deleteBlock: (blockId: string) => void +} + +export const blocksActions = (setTypebot: Updater): BlocksActions => ({ + createBlock: ({ x, y, step }: Coordinates & { step: StepType | Step }) => { + setTypebot((typebot) => { + const newBlock = parseNewBlock({ + totalBlocks: typebot.blocks.allIds.length, + initialCoordinates: { x, y }, + }) + typebot.blocks.byId[newBlock.id] = newBlock + typebot.blocks.allIds.push(newBlock.id) + createStepDraft(typebot, step, newBlock.id) + }) + }, + updateBlock: (blockId: string, updates: Partial>) => + setTypebot((typebot) => { + typebot.blocks.byId[blockId] = { + ...typebot.blocks.byId[blockId], + ...updates, + } + }), + deleteBlock: (blockId: string) => + setTypebot((typebot) => { + const block = typebot.blocks.byId[blockId] + block.stepIds.forEach((stepId) => deleteStepDraft(typebot, stepId)) + delete typebot.blocks.byId[blockId] + const index = typebot.blocks.allIds.indexOf(blockId) + if (index !== -1) typebot.blocks.allIds.splice(index, 1) + }), +}) diff --git a/apps/builder/contexts/TypebotContext/actions/steps.ts b/apps/builder/contexts/TypebotContext/actions/steps.ts new file mode 100644 index 0000000000..90e394bbd2 --- /dev/null +++ b/apps/builder/contexts/TypebotContext/actions/steps.ts @@ -0,0 +1,51 @@ +import { Step, StepType, Typebot } from 'models' +import { parseNewStep } from 'services/typebots' +import { Updater } from 'use-immer' +import { WritableDraft } from 'immer/dist/types/types-external' + +export type StepsActions = { + createStep: (blockId: string, step: StepType | Step, index?: number) => void + updateStep: ( + stepId: string, + updates: Partial> + ) => void + deleteStep: (stepId: string) => void +} + +export const stepsAction = (setTypebot: Updater): StepsActions => ({ + createStep: (blockId: string, step: StepType | Step, index?: number) => { + setTypebot((typebot) => { + createStepDraft(typebot, step, blockId, index) + }) + }, + updateStep: (stepId: string, updates: Partial>) => + setTypebot((typebot) => { + typebot.steps.byId[stepId] = { ...typebot.steps.byId[stepId], ...updates } + }), + deleteStep: (stepId: string) => { + setTypebot((typebot) => { + deleteStepDraft(typebot, stepId) + }) + }, +}) + +export const deleteStepDraft = ( + typebot: WritableDraft, + stepId: string +) => { + delete typebot.steps.byId[stepId] + const index = typebot.steps.allIds.indexOf(stepId) + if (index !== -1) typebot.steps.allIds.splice(index, 1) +} + +export const createStepDraft = ( + typebot: WritableDraft, + step: StepType | Step, + blockId: string, + index?: number +) => { + const newStep = typeof step === 'string' ? parseNewStep(step, blockId) : step + typebot.steps.byId[newStep.id] = newStep + typebot.steps.allIds.push(newStep.id) + typebot.blocks.byId[blockId].stepIds.splice(index ?? 0, 0, newStep.id) +} diff --git a/apps/builder/contexts/TypebotContext/index.ts b/apps/builder/contexts/TypebotContext/index.ts new file mode 100644 index 0000000000..0a27ff3852 --- /dev/null +++ b/apps/builder/contexts/TypebotContext/index.ts @@ -0,0 +1 @@ +export { TypebotContext } from './TypebotContext' diff --git a/apps/builder/cypress/plugins/database.ts b/apps/builder/cypress/plugins/database.ts index 52e3a1f7ca..4fef0458a0 100644 --- a/apps/builder/cypress/plugins/database.ts +++ b/apps/builder/cypress/plugins/database.ts @@ -1,5 +1,6 @@ -import { parseNewTypebot, PublicTypebot, StepType, Typebot } from 'bot-engine' +import { PublicTypebot, StepType, Typebot } from 'models' import { Plan, PrismaClient } from 'db' +import { parseTestTypebot } from './utils' const prisma = new PrismaClient() @@ -34,51 +35,50 @@ const createFolders = () => }) const createTypebots = async () => { - const typebot2: Typebot = { - ...(parseNewTypebot({ + const typebot2 = { + ...parseTestTypebot({ + id: 'typebot2', name: 'Typebot #2', ownerId: 'test2', - folderId: null, - }) as Typebot), - id: 'typebot2', - startBlock: { - id: 'start-block', - steps: [ - { - id: 'start-step', - blockId: 'start-block', - type: StepType.START, - label: 'Start', - target: { blockId: 'block1' }, + blocks: { + byId: { + block1: { + id: 'block1', + title: 'Block #1', + stepIds: ['step1'], + graphCoordinates: { x: 200, y: 200 }, + }, }, - ], - graphCoordinates: { x: 0, y: 0 }, - title: 'Start', - }, - blocks: [ - { - title: 'Block #1', - id: 'block1', - steps: [{ id: 'step1', type: StepType.TEXT_INPUT, blockId: 'block1' }], - graphCoordinates: { x: 200, y: 200 }, + allIds: ['block1'], }, - ], + steps: { + byId: { + step1: { + id: 'step1', + type: StepType.TEXT_INPUT, + blockId: 'block1', + }, + }, + allIds: ['step1'], + }, + }), } await prisma.typebot.createMany({ data: [ { - ...parseNewTypebot({ + ...parseTestTypebot({ + id: 'typebot1', name: 'Typebot #1', ownerId: 'test2', - folderId: null, + blocks: { byId: {}, allIds: [] }, + steps: { byId: {}, allIds: [] }, }), - id: 'typebot1', }, typebot2, - ], + ] as any, }) return prisma.publicTypebot.createMany({ - data: [parseTypebotToPublicTypebot('publictypebot2', typebot2)], + data: [parseTypebotToPublicTypebot('publictypebot2', typebot2)] as any, }) } @@ -118,8 +118,8 @@ const parseTypebotToPublicTypebot = ( ): PublicTypebot => ({ id, blocks: typebot.blocks, + steps: typebot.steps, name: typebot.name, - startBlock: typebot.startBlock, typebotId: typebot.id, theme: typebot.theme, settings: typebot.settings, diff --git a/apps/builder/cypress/plugins/utils.ts b/apps/builder/cypress/plugins/utils.ts new file mode 100644 index 0000000000..303b9412ff --- /dev/null +++ b/apps/builder/cypress/plugins/utils.ts @@ -0,0 +1,75 @@ +import { + Block, + StepType, + Theme, + BackgroundType, + Settings, + Typebot, + Table, + Step, +} from 'models' + +export const parseTestTypebot = ({ + id, + ownerId, + name, + blocks, + steps, +}: { + id: string + ownerId: string + name: string + blocks: Table + steps: Table +}): Typebot => { + const theme: Theme = { + general: { + font: 'Open Sans', + background: { type: BackgroundType.NONE, content: '#ffffff' }, + }, + } + const settings: Settings = { + typingEmulation: { + enabled: true, + speed: 300, + maxDelay: 1.5, + }, + } + return { + id, + folderId: null, + name, + ownerId, + theme, + settings, + createdAt: new Date(), + blocks: { + byId: { + block0: { + id: 'block0', + title: 'Block #0', + stepIds: ['step0'], + graphCoordinates: { x: 0, y: 0 }, + }, + ...blocks.byId, + }, + allIds: ['block0', ...blocks.allIds], + }, + steps: { + byId: { + step0: { + id: 'step0', + type: StepType.START, + blockId: 'block0', + label: 'Start', + target: { blockId: 'block1' }, + }, + ...steps.byId, + }, + allIds: ['step0', ...steps.allIds], + }, + publicId: null, + publishedTypebotId: null, + updatedAt: new Date(), + } +} diff --git a/apps/builder/cypress/tests/results.ts b/apps/builder/cypress/tests/results.ts index 0a3781f177..f23c1d43ac 100644 --- a/apps/builder/cypress/tests/results.ts +++ b/apps/builder/cypress/tests/results.ts @@ -2,15 +2,10 @@ import path from 'path' import { parse } from 'papaparse' describe('ResultsPage', () => { - before(() => { - cy.intercept({ url: '/api/typebots/typebot2/results*', method: 'GET' }).as( - 'getResults' - ) + beforeEach(() => { cy.intercept({ url: '/api/typebots/typebot2/results*', method: 'GET' }).as( 'getResults' ) - }) - beforeEach(() => { cy.task('seed') cy.signOut() }) @@ -48,7 +43,7 @@ describe('ResultsPage', () => { cy.findByText('content0').should('exist') }) - it.only('should correctly export selection in CSV', () => { + it('should correctly export selection in CSV', () => { const downloadsFolder = Cypress.config('downloadsFolder') cy.signIn('test2@gmail.com') cy.visit('/typebots/typebot2/results') diff --git a/apps/builder/layouts/results/AnalyticsContent.tsx b/apps/builder/layouts/results/AnalyticsContent.tsx index d56e92dabc..6e6f61947b 100644 --- a/apps/builder/layouts/results/AnalyticsContent.tsx +++ b/apps/builder/layouts/results/AnalyticsContent.tsx @@ -1,9 +1,9 @@ import { Flex, useToast } from '@chakra-ui/react' -import { Stats } from 'bot-engine' import AnalyticsGraph from 'components/analytics/graph/AnalyticsGraph' import { StatsCards } from 'components/analytics/StatsCards' import { AnalyticsGraphProvider } from 'contexts/AnalyticsGraphProvider' -import { useTypebot } from 'contexts/TypebotContext' +import { useTypebot } from 'contexts/TypebotContext/TypebotContext' +import { Stats } from 'models' import React from 'react' import { useAnswersCount } from 'services/analytics' diff --git a/apps/builder/layouts/results/ResultsContent.tsx b/apps/builder/layouts/results/ResultsContent.tsx index 29042702ee..4e6972445c 100644 --- a/apps/builder/layouts/results/ResultsContent.tsx +++ b/apps/builder/layouts/results/ResultsContent.tsx @@ -1,6 +1,6 @@ import { Button, Flex, HStack, Tag, useToast, Text } from '@chakra-ui/react' import { NextChakraLink } from 'components/nextChakra/NextChakraLink' -import { useTypebot } from 'contexts/TypebotContext' +import { useTypebot } from 'contexts/TypebotContext/TypebotContext' import { useRouter } from 'next/router' import React, { useMemo } from 'react' import { useStats } from 'services/analytics' diff --git a/apps/builder/next.config.js b/apps/builder/next.config.js deleted file mode 100644 index f4620f0887..0000000000 --- a/apps/builder/next.config.js +++ /dev/null @@ -1,6 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-var-requires -const withTM = require('next-transpile-modules')(['utils']) - -module.exports = withTM({ - reactStrictMode: true, -}) diff --git a/apps/builder/package.json b/apps/builder/package.json index 0c86984a71..37737f92cf 100644 --- a/apps/builder/package.json +++ b/apps/builder/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@chakra-ui/css-reset": "^1.1.1", - "@chakra-ui/react": "^1.7.3", + "@chakra-ui/react": "^1.7.4", "@dnd-kit/core": "^4.0.3", "@dnd-kit/sortable": "^5.1.0", "@emotion/react": "^11.7.1", @@ -24,13 +24,14 @@ "@udecode/plate-link": "^9.0.0", "@udecode/plate-ui-link": "^9.0.0", "@udecode/plate-ui-toolbar": "^9.0.0", - "aws-sdk": "^2.1048.0", + "aws-sdk": "^2.1051.0", "bot-engine": "*", "db": "*", "fast-equals": "^2.0.4", "focus-visible": "^5.2.0", "framer-motion": "^4", "htmlparser2": "^7.2.0", + "immer": "^9.0.7", "kbar": "^0.1.0-beta.24", "micro": "^9.3.4", "micro-cors": "^0.1.1", @@ -45,7 +46,7 @@ "react-frame-component": "^5.2.1", "react-table": "^7.7.0", "short-uuid": "^4.2.0", - "slate": "^0.72.0", + "slate": "^0.72.3", "slate-history": "^0.66.0", "slate-hyperscript": "^0.67.0", "slate-react": "^0.72.1", @@ -54,7 +55,9 @@ "svg-round-corners": "^0.3.0", "swr": "^1.1.2", "use-debounce": "^7.0.1", - "utils": "*" + "use-immer": "^0.6.0", + "utils": "*", + "models": "*" }, "devDependencies": { "@testing-library/cypress": "^8.0.2", @@ -63,10 +66,10 @@ "@types/nprogress": "^0.2.0", "@types/papaparse": "^5.3.1", "@types/qs": "^6.9.7", - "@types/react": "^17.0.37", + "@types/react": "^17.0.38", "@types/react-table": "^7.7.9", "@types/testing-library__cypress": "^5.0.9", - "@typescript-eslint/eslint-plugin": "^5.8.0", + "@typescript-eslint/eslint-plugin": "^5.9.0", "cypress": "^9.2.0", "cypress-file-upload": "^5.0.8", "cypress-social-logins": "^1.13.0", diff --git a/apps/builder/pages/api/typebots.ts b/apps/builder/pages/api/typebots.ts index 2fae467f80..29597aa3f1 100644 --- a/apps/builder/pages/api/typebots.ts +++ b/apps/builder/pages/api/typebots.ts @@ -1,8 +1,8 @@ -import { parseNewTypebot } from 'bot-engine' -import { User } from 'db' +import { Prisma, User } from 'db' import prisma from 'libs/prisma' import { NextApiRequest, NextApiResponse } from 'next' import { getSession } from 'next-auth/react' +import { parseNewTypebot } from 'services/typebots' import { methodNotAllowed } from 'utils' const handler = async (req: NextApiRequest, res: NextApiResponse) => { @@ -26,7 +26,10 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => { if (req.method === 'POST') { const data = JSON.parse(req.body) const typebot = await prisma.typebot.create({ - data: parseNewTypebot({ ownerId: user.id, ...data }), + data: parseNewTypebot({ + ownerId: user.id, + ...data, + }) as Prisma.TypebotUncheckedCreateInput, }) return res.send(typebot) } diff --git a/apps/builder/pages/api/typebots/[typebotId]/results/answers/count.ts b/apps/builder/pages/api/typebots/[typebotId]/results/answers/count.ts index b2e0f3fed1..93784d3f46 100644 --- a/apps/builder/pages/api/typebots/[typebotId]/results/answers/count.ts +++ b/apps/builder/pages/api/typebots/[typebotId]/results/answers/count.ts @@ -1,4 +1,4 @@ -import { PublicTypebot } from 'bot-engine' +import { PublicTypebot } from 'models' import { User } from 'db' import prisma from 'libs/prisma' import { NextApiRequest, NextApiResponse } from 'next' @@ -24,14 +24,14 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => { const answersCounts: { blockId: string; totalAnswers: number }[] = await Promise.all( - (typebot.publishedTypebot as PublicTypebot).blocks.map( - async (block) => { - const totalAnswers = await prisma.answer.count({ - where: { blockId: block.id }, - }) - return { blockId: block.id, totalAnswers } - } - ) + ( + typebot.publishedTypebot as unknown as PublicTypebot + ).blocks.allIds.map(async (blockId) => { + const totalAnswers = await prisma.answer.count({ + where: { blockId }, + }) + return { blockId, totalAnswers } + }) ) return res.status(200).send({ answersCounts }) } diff --git a/apps/builder/pages/api/typebots/[typebotId]/results/stats.ts b/apps/builder/pages/api/typebots/[typebotId]/results/stats.ts index fc724cdff7..7b527b9f33 100644 --- a/apps/builder/pages/api/typebots/[typebotId]/results/stats.ts +++ b/apps/builder/pages/api/typebots/[typebotId]/results/stats.ts @@ -1,6 +1,6 @@ -import { Stats } from 'bot-engine' import { User } from 'db' import prisma from 'libs/prisma' +import { Stats } from 'models' import { NextApiRequest, NextApiResponse } from 'next' import { getSession } from 'next-auth/react' import { methodNotAllowed } from 'utils' diff --git a/apps/builder/pages/typebots/[id]/edit.tsx b/apps/builder/pages/typebots/[id]/edit.tsx index 3ffc16c714..560bc82b79 100644 --- a/apps/builder/pages/typebots/[id]/edit.tsx +++ b/apps/builder/pages/typebots/[id]/edit.tsx @@ -3,7 +3,7 @@ import { Board } from 'components/board/Board' import { Seo } from 'components/Seo' import { TypebotHeader } from 'components/shared/TypebotHeader' import { EditorContext } from 'contexts/EditorContext' -import { TypebotContext } from 'contexts/TypebotContext' +import { TypebotContext } from 'contexts/TypebotContext/TypebotContext' import { useRouter } from 'next/router' import { KBarProvider } from 'kbar' import React from 'react' diff --git a/apps/builder/pages/typebots/[id]/results.tsx b/apps/builder/pages/typebots/[id]/results.tsx index b6aa38d9b6..2e6d9a62dc 100644 --- a/apps/builder/pages/typebots/[id]/results.tsx +++ b/apps/builder/pages/typebots/[id]/results.tsx @@ -2,7 +2,7 @@ import { Flex } from '@chakra-ui/layout' import { ResultsContent } from 'layouts/results/ResultsContent' import { Seo } from 'components/Seo' import { TypebotHeader } from 'components/shared/TypebotHeader' -import { TypebotContext } from 'contexts/TypebotContext' +import { TypebotContext } from 'contexts/TypebotContext/TypebotContext' import { useRouter } from 'next/router' import React from 'react' import { UserContext } from 'contexts/UserContext' diff --git a/apps/builder/pages/typebots/[id]/results/analytics.tsx b/apps/builder/pages/typebots/[id]/results/analytics.tsx index f5119db0c9..4562eb135d 100644 --- a/apps/builder/pages/typebots/[id]/results/analytics.tsx +++ b/apps/builder/pages/typebots/[id]/results/analytics.tsx @@ -2,7 +2,7 @@ import { Flex } from '@chakra-ui/layout' import { ResultsContent } from 'layouts/results/ResultsContent' import { Seo } from 'components/Seo' import { TypebotHeader } from 'components/shared/TypebotHeader' -import { TypebotContext } from 'contexts/TypebotContext' +import { TypebotContext } from 'contexts/TypebotContext/TypebotContext' import { useRouter } from 'next/router' import React from 'react' import { UserContext } from 'contexts/UserContext' diff --git a/apps/builder/pages/typebots/[id]/settings.tsx b/apps/builder/pages/typebots/[id]/settings.tsx index 11823edbc4..67b3ff34e3 100644 --- a/apps/builder/pages/typebots/[id]/settings.tsx +++ b/apps/builder/pages/typebots/[id]/settings.tsx @@ -2,7 +2,7 @@ import { Flex } from '@chakra-ui/layout' import { Seo } from 'components/Seo' import { SettingsContent } from 'components/settings/SettingsContent' import { TypebotHeader } from 'components/shared/TypebotHeader' -import { TypebotContext } from 'contexts/TypebotContext' +import { TypebotContext } from 'contexts/TypebotContext/TypebotContext' import { UserContext } from 'contexts/UserContext' import { useRouter } from 'next/router' import React from 'react' diff --git a/apps/builder/pages/typebots/[id]/share.tsx b/apps/builder/pages/typebots/[id]/share.tsx index 790215fd87..abd23c9d3b 100644 --- a/apps/builder/pages/typebots/[id]/share.tsx +++ b/apps/builder/pages/typebots/[id]/share.tsx @@ -2,7 +2,7 @@ import { Flex } from '@chakra-ui/layout' import { Seo } from 'components/Seo' import { ShareContent } from 'components/share/ShareContent' import { TypebotHeader } from 'components/shared/TypebotHeader' -import { TypebotContext } from 'contexts/TypebotContext' +import { TypebotContext } from 'contexts/TypebotContext/TypebotContext' import { UserContext } from 'contexts/UserContext' import { useRouter } from 'next/router' import React from 'react' diff --git a/apps/builder/pages/typebots/[id]/theme.tsx b/apps/builder/pages/typebots/[id]/theme.tsx index 059191b1a2..7904237356 100644 --- a/apps/builder/pages/typebots/[id]/theme.tsx +++ b/apps/builder/pages/typebots/[id]/theme.tsx @@ -2,7 +2,7 @@ import { Flex } from '@chakra-ui/layout' import { Seo } from 'components/Seo' import { TypebotHeader } from 'components/shared/TypebotHeader' import { ThemeContent } from 'components/theme/ThemeContent' -import { TypebotContext } from 'contexts/TypebotContext' +import { TypebotContext } from 'contexts/TypebotContext/TypebotContext' import { UserContext } from 'contexts/UserContext' import { useRouter } from 'next/router' import React from 'react' diff --git a/apps/builder/services/analytics.ts b/apps/builder/services/analytics.ts index bc074b0948..1c7433bfcb 100644 --- a/apps/builder/services/analytics.ts +++ b/apps/builder/services/analytics.ts @@ -1,4 +1,4 @@ -import { Stats } from 'bot-engine' +import { Stats } from 'models' import useSWR from 'swr' import { fetcher } from './utils' diff --git a/apps/builder/services/graph.ts b/apps/builder/services/graph.ts index 08dd6b6056..b1a5ec218b 100644 --- a/apps/builder/services/graph.ts +++ b/apps/builder/services/graph.ts @@ -1,5 +1,5 @@ import { Coordinates } from '@dnd-kit/core/dist/types' -import { Block, StartBlock } from 'bot-engine' +import { Block } from 'models' import { AnchorsPositionProps } from 'components/board/graph/Edges/Edge' import { stubLength, @@ -143,7 +143,7 @@ const computeFiveSegments = ( } export const getAnchorsPosition = ( - sourceBlock: Block | StartBlock, + sourceBlock: Block, targetBlock: Block, sourceStepIndex: number, targetStepIndex?: number diff --git a/apps/builder/services/publicTypebot.tsx b/apps/builder/services/publicTypebot.tsx index 604c1967f5..8174089396 100644 --- a/apps/builder/services/publicTypebot.tsx +++ b/apps/builder/services/publicTypebot.tsx @@ -1,11 +1,4 @@ -import { - Block, - InputStep, - PublicTypebot, - Step, - StepType, - Typebot, -} from 'bot-engine' +import { InputStep, PublicTypebot, Step, StepType, Typebot } from 'models' import { sendRequest } from './utils' import shortId from 'short-uuid' import { HStack, Text } from '@chakra-ui/react' @@ -17,8 +10,8 @@ export const parseTypebotToPublicTypebot = ( ): PublicTypebot => ({ id: shortId.generate(), blocks: typebot.blocks, + steps: typebot.steps, name: typebot.name, - startBlock: typebot.startBlock, typebotId: typebot.id, theme: typebot.theme, settings: typebot.settings, @@ -28,7 +21,7 @@ export const parseTypebotToPublicTypebot = ( export const createPublishedTypebot = async ( typebot: Omit ) => - sendRequest({ + sendRequest({ url: `/api/publicTypebots`, method: 'POST', body: typebot, @@ -49,32 +42,47 @@ export const parseSubmissionsColumns = ( ): { Header: JSX.Element accessor: string -}[] => [ - { - Header: ( - - - Submitted at - - ), - accessor: 'createdAt', - }, - ...(typebot?.blocks ?? []).filter(blockContainsInput).map((block) => ({ - Header: ( - - step.target)?.type ?? StepType.TEXT_INPUT - } - /> - {block.title} - - ), - accessor: block.id, - })), -] +}[] => { + console.log(typebot) + if (!typebot) return [] + return [ + { + Header: ( + + + Submitted at + + ), + accessor: 'createdAt', + }, + ...typebot.blocks.allIds + .filter((blockId) => typebot && blockContainsInput(typebot, blockId)) + .map((blockId) => { + const block = typebot.blocks.byId[blockId] + const inputStepId = block.stepIds.find((stepId) => + stepIsInput(typebot.steps.byId[stepId]) + ) + const inputStep = typebot.steps.byId[inputStepId as string] + return { + Header: ( + + + {block.title} + + ), + accessor: blockId, + } + }), + ] +} -const blockContainsInput = (block: Block) => block.steps.some(stepIsInput) +const blockContainsInput = ( + typebot: PublicTypebot | Typebot, + blockId: string +) => + typebot.blocks.byId[blockId].stepIds.some((stepId) => + stepIsInput(typebot.steps.byId[stepId]) + ) const stepIsInput = (step: Step): step is InputStep => step.type === StepType.TEXT_INPUT diff --git a/apps/builder/services/results.ts b/apps/builder/services/results.ts index a99f203d1f..f7dc9276f5 100644 --- a/apps/builder/services/results.ts +++ b/apps/builder/services/results.ts @@ -1,4 +1,4 @@ -import { Result } from 'bot-engine' +import { Result } from 'models' import useSWRInfinite from 'swr/infinite' import { fetcher, sendRequest } from './utils' import { stringify } from 'qs' diff --git a/apps/builder/services/typebots.ts b/apps/builder/services/typebots.ts index ff7deed9f5..97d1e96384 100644 --- a/apps/builder/services/typebots.ts +++ b/apps/builder/services/typebots.ts @@ -5,9 +5,13 @@ import { TextStep, TextInputStep, PublicTypebot, -} from 'bot-engine' + BackgroundType, + Settings, + StartStep, + Theme, +} from 'models' import shortId from 'short-uuid' -import { Typebot } from 'bot-engine' +import { Typebot } from 'models' import useSWR from 'swr' import { fetcher, sendRequest, toKebabCase } from './utils' import { deepEqual } from 'fast-equals' @@ -85,13 +89,9 @@ export const patchTypebot = async (id: string, typebot: Partial) => }) export const parseNewBlock = ({ - type, totalBlocks, initialCoordinates, - step, }: { - step?: Step - type?: StepType totalBlocks: number initialCoordinates: { x: number; y: number } }): Block => { @@ -100,9 +100,7 @@ export const parseNewBlock = ({ id, title: `Block #${totalBlocks + 1}`, graphCoordinates: initialCoordinates, - steps: [ - step ? { ...step, blockId: id } : parseNewStep(type as StepType, id), - ], + stepIds: [], } } @@ -158,11 +156,58 @@ export const checkIfPublished = ( publicTypebot: PublicTypebot ) => deepEqual(typebot.blocks, publicTypebot.blocks) && - deepEqual(typebot.startBlock, publicTypebot.startBlock) && + deepEqual(typebot.steps, publicTypebot.steps) && typebot.name === publicTypebot.name && typebot.publicId === publicTypebot.publicId && deepEqual(typebot.settings, publicTypebot.settings) && deepEqual(typebot.theme, publicTypebot.theme) export const parseDefaultPublicId = (name: string, id: string) => - toKebabCase(`${name}-${id?.slice(0, 5)}`) + toKebabCase(name) + `-${id?.slice(-7)}` + +export const parseNewTypebot = ({ + ownerId, + folderId, + name, +}: { + ownerId: string + folderId: string | null + name: string +}): Partial => { + const startBlockId = shortId.generate() + const startStepId = shortId.generate() + const startStep: StartStep = { + blockId: startBlockId, + id: startStepId, + label: 'Start', + type: StepType.START, + } + const startBlock: Block = { + id: startBlockId, + title: 'Start', + graphCoordinates: { x: 0, y: 0 }, + stepIds: [startStepId], + } + const theme: Theme = { + general: { + font: 'Open Sans', + background: { type: BackgroundType.NONE, content: '#ffffff' }, + }, + } + const settings: Settings = { + typingEmulation: { + enabled: true, + speed: 300, + maxDelay: 1.5, + }, + } + return { + folderId, + name, + ownerId, + blocks: { byId: { [startBlockId]: startBlock }, allIds: [startBlockId] }, + steps: { byId: { [startStepId]: startStep }, allIds: [startStepId] }, + theme, + settings, + } +} diff --git a/apps/viewer/layouts/TypebotPage.tsx b/apps/viewer/layouts/TypebotPage.tsx index 12067049c7..e62a7f98ba 100644 --- a/apps/viewer/layouts/TypebotPage.tsx +++ b/apps/viewer/layouts/TypebotPage.tsx @@ -1,4 +1,5 @@ -import { Answer, PublicTypebot, TypebotViewer } from 'bot-engine' +import { TypebotViewer } from 'bot-engine' +import { Answer, PublicTypebot } from 'models' import React, { useEffect, useState } from 'react' import { upsertAnswer } from 'services/answer' import { SEO } from '../components/Seo' diff --git a/apps/viewer/next.config.js b/apps/viewer/next.config.js deleted file mode 100644 index f4620f0887..0000000000 --- a/apps/viewer/next.config.js +++ /dev/null @@ -1,6 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-var-requires -const withTM = require('next-transpile-modules')(['utils']) - -module.exports = withTM({ - reactStrictMode: true, -}) diff --git a/apps/viewer/package.json b/apps/viewer/package.json index 1a6de1fe58..cb95f9473d 100644 --- a/apps/viewer/package.json +++ b/apps/viewer/package.json @@ -11,6 +11,7 @@ "dependencies": { "bot-engine": "*", "db": "*", + "models": "*", "next": "^12.0.7", "react": "^17.0.2", "react-dom": "^17.0.2", @@ -19,7 +20,7 @@ "devDependencies": { "@types/node": "^17.0.4", "@types/react": "^17.0.38", - "@typescript-eslint/eslint-plugin": "^5.8.0", + "@typescript-eslint/eslint-plugin": "^5.9.0", "eslint": "<8.0.0", "eslint-config-next": "12.0.7", "eslint-config-prettier": "^8.3.0", diff --git a/apps/viewer/pages/[publicId].tsx b/apps/viewer/pages/[publicId].tsx index f8ddfc994f..24a5ff3b81 100644 --- a/apps/viewer/pages/[publicId].tsx +++ b/apps/viewer/pages/[publicId].tsx @@ -1,4 +1,4 @@ -import { PublicTypebot } from 'bot-engine' +import { PublicTypebot } from 'models' import { GetServerSideProps, GetServerSidePropsContext } from 'next' import { TypebotPage, TypebotPageProps } from '../layouts/TypebotPage' import prisma from '../libs/prisma' diff --git a/apps/viewer/pages/index.tsx b/apps/viewer/pages/index.tsx index 61e5bd4192..f643b1e3d5 100644 --- a/apps/viewer/pages/index.tsx +++ b/apps/viewer/pages/index.tsx @@ -1,4 +1,4 @@ -import { PublicTypebot } from 'bot-engine' +import { PublicTypebot } from 'models' import { GetServerSideProps, GetServerSidePropsContext } from 'next' import { TypebotPage, TypebotPageProps } from '../layouts/TypebotPage' import prisma from '../libs/prisma' diff --git a/apps/viewer/services/answer.ts b/apps/viewer/services/answer.ts index 07d8b08c3e..ca65254c68 100644 --- a/apps/viewer/services/answer.ts +++ b/apps/viewer/services/answer.ts @@ -1,4 +1,4 @@ -import { Answer } from 'bot-engine' +import { Answer } from 'models' import { sendRequest } from 'utils' export const upsertAnswer = async (answer: Answer & { resultId: string }) => { diff --git a/packages/bot-engine/package.json b/packages/bot-engine/package.json index cb6ecc68c1..91a31128c1 100644 --- a/packages/bot-engine/package.json +++ b/packages/bot-engine/package.json @@ -8,26 +8,28 @@ "dependencies": { "db": "*", "fast-equals": "^2.0.4", + "models": "*", "react-frame-component": "^5.2.1", "react-scroll": "^1.8.4", - "react-transition-group": "^4.4.2" + "react-transition-group": "^4.4.2", + "utils": "*" }, "devDependencies": { "@rollup/plugin-commonjs": "^21.0.1", - "@rollup/plugin-node-resolve": "^13.1.1", + "@rollup/plugin-node-resolve": "^13.1.3", "@rollup/plugin-typescript": "^8.3.0", "@types/react": "^17.0.38", "@types/react-scroll": "^1.8.3", "@types/react-transition-group": "^4.4.4", - "autoprefixer": "^10.4.0", + "autoprefixer": "^10.4.1", "npm-run-all": "^4.1.5", "postcss": "^8.4.5", - "rollup": "^2.62.0", + "rollup": "^2.63.0", "rollup-plugin-dts": "^4.1.0", "rollup-plugin-peer-deps-external": "^2.2.4", "rollup-plugin-postcss": "^4.0.2", "rollup-plugin-terser": "^7.0.2", - "tailwindcss": "^3.0.8", + "tailwindcss": "^3.0.11", "typescript": "^4.5.4" }, "peerDependencies": { diff --git a/packages/bot-engine/src/components/ChatBlock/ChatBlock.tsx b/packages/bot-engine/src/components/ChatBlock/ChatBlock.tsx index 87a64b62f9..5709754eb0 100644 --- a/packages/bot-engine/src/components/ChatBlock/ChatBlock.tsx +++ b/packages/bot-engine/src/components/ChatBlock/ChatBlock.tsx @@ -1,21 +1,21 @@ import React, { useEffect, useState } from 'react' -import { Block, Step } from '../../models' import { animateScroll as scroll } from 'react-scroll' import { TransitionGroup, CSSTransition } from 'react-transition-group' import { ChatStep } from './ChatStep' import { AvatarSideContainer } from './AvatarSideContainer' import { HostAvatarsContext } from '../../contexts/HostAvatarsContext' +import { Step, Table } from 'models' type ChatBlockProps = { - block: Block + steps: Table onBlockEnd: (nextBlockId?: string) => void } -export const ChatBlock = ({ block, onBlockEnd }: ChatBlockProps) => { +export const ChatBlock = ({ steps, onBlockEnd }: ChatBlockProps) => { const [displayedSteps, setDisplayedSteps] = useState([]) useEffect(() => { - setDisplayedSteps([block.steps[0]]) + setDisplayedSteps([steps.byId[steps.allIds[0]]]) }, []) useEffect(() => { @@ -33,10 +33,10 @@ export const ChatBlock = ({ block, onBlockEnd }: ChatBlockProps) => { const currentStep = [...displayedSteps].pop() if ( currentStep?.target?.blockId || - displayedSteps.length === block.steps.length + displayedSteps.length === steps.allIds.length ) return onBlockEnd(currentStep?.target?.blockId) - const nextStep = block.steps[displayedSteps.length] + const nextStep = steps.byId[displayedSteps.length] if (nextStep) setDisplayedSteps([...displayedSteps, nextStep]) } diff --git a/packages/bot-engine/src/components/ChatBlock/ChatStep/ChatStep.tsx b/packages/bot-engine/src/components/ChatBlock/ChatStep/ChatStep.tsx index 5623bbfa39..f6d6d3cea9 100644 --- a/packages/bot-engine/src/components/ChatBlock/ChatStep/ChatStep.tsx +++ b/packages/bot-engine/src/components/ChatBlock/ChatStep/ChatStep.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from 'react' import { useAnswers } from '../../../contexts/AnswersContext' import { useHostAvatars } from '../../../contexts/HostAvatarsContext' -import { Step } from '../../../models' +import { Step } from 'models' import { isTextInputStep, isTextStep } from '../../../services/utils' import { GuestBubble } from './bubbles/GuestBubble' import { HostMessageBubble } from './bubbles/HostMessageBubble' diff --git a/packages/bot-engine/src/components/ChatBlock/ChatStep/bubbles/HostMessageBubble.tsx b/packages/bot-engine/src/components/ChatBlock/ChatStep/bubbles/HostMessageBubble.tsx index 32235de994..cc2720010f 100644 --- a/packages/bot-engine/src/components/ChatBlock/ChatStep/bubbles/HostMessageBubble.tsx +++ b/packages/bot-engine/src/components/ChatBlock/ChatStep/bubbles/HostMessageBubble.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useRef, useState } from 'react' import { useHostAvatars } from '../../../../contexts/HostAvatarsContext' import { useTypebot } from '../../../../contexts/TypebotContext' -import { StepType, TextStep } from '../../../../models' +import { StepType, TextStep } from 'models' import { computeTypingTimeout } from '../../../../services/chat' import { TypingContent } from './TypingContent' diff --git a/packages/bot-engine/src/components/ConversationContainer.tsx b/packages/bot-engine/src/components/ConversationContainer.tsx index 577aee94fb..c9f944caa3 100644 --- a/packages/bot-engine/src/components/ConversationContainer.tsx +++ b/packages/bot-engine/src/components/ConversationContainer.tsx @@ -1,12 +1,12 @@ import React, { useEffect, useRef, useState } from 'react' -import { Answer, PublicTypebot } from '..' -import { Block } from '..' import { ChatBlock } from './ChatBlock/ChatBlock' import { useFrame } from 'react-frame-component' import { setCssVariablesValue } from '../services/theme' import { useAnswers } from '../contexts/AnswersContext' import { deepEqual } from 'fast-equals' +import { Answer, Block, PublicTypebot } from 'models' +import { filterTable } from 'utils' type Props = { typebot: PublicTypebot @@ -28,14 +28,17 @@ export const ConversationContainer = ({ const displayNextBlock = (blockId?: string) => { if (!blockId) return onCompleted() - const nextBlock = typebot.blocks.find((b) => b.id === blockId) + const nextBlock = typebot.blocks.byId[blockId] if (!nextBlock) return onCompleted() onNewBlockVisible(blockId) setDisplayedBlocks([...displayedBlocks, nextBlock]) } useEffect(() => { - const firstBlockId = typebot.startBlock.steps[0].target?.blockId + const blocks = typebot.blocks + const firstBlockId = + typebot.steps.byId[blocks.byId[blocks.allIds[0]].stepIds[0]].target + ?.blockId if (firstBlockId) displayNextBlock(firstBlockId) }, []) @@ -58,7 +61,7 @@ export const ConversationContainer = ({ {displayedBlocks.map((block, idx) => ( ))} diff --git a/packages/bot-engine/src/components/TypebotViewer.tsx b/packages/bot-engine/src/components/TypebotViewer.tsx index 392f49700b..7982589aa6 100644 --- a/packages/bot-engine/src/components/TypebotViewer.tsx +++ b/packages/bot-engine/src/components/TypebotViewer.tsx @@ -1,11 +1,11 @@ import React, { useMemo } from 'react' -import { Answer, BackgroundType, PublicTypebot } from '../models' import { TypebotContext } from '../contexts/TypebotContext' import Frame from 'react-frame-component' //@ts-ignore import style from '../assets/style.css' import { ConversationContainer } from './ConversationContainer' import { AnswersContext } from '../contexts/AnswersContext' +import { Answer, BackgroundType, PublicTypebot } from 'models' export type TypebotViewerProps = { typebot: PublicTypebot diff --git a/packages/bot-engine/src/contexts/AnswersContext.tsx b/packages/bot-engine/src/contexts/AnswersContext.tsx index 90d3fc646c..0ca48e1b8c 100644 --- a/packages/bot-engine/src/contexts/AnswersContext.tsx +++ b/packages/bot-engine/src/contexts/AnswersContext.tsx @@ -1,4 +1,4 @@ -import { Answer } from '../models' +import { Answer } from 'models' import React, { createContext, ReactNode, useContext, useState } from 'react' const answersContext = createContext<{ diff --git a/packages/bot-engine/src/contexts/TypebotContext.tsx b/packages/bot-engine/src/contexts/TypebotContext.tsx index f18573d53a..55f3ee1146 100644 --- a/packages/bot-engine/src/contexts/TypebotContext.tsx +++ b/packages/bot-engine/src/contexts/TypebotContext.tsx @@ -1,5 +1,5 @@ +import { PublicTypebot } from 'models' import React, { createContext, ReactNode, useContext } from 'react' -import { PublicTypebot } from '../models/publicTypebot' const typebotContext = createContext<{ typebot: PublicTypebot diff --git a/packages/bot-engine/src/index.ts b/packages/bot-engine/src/index.ts index df1033f5c1..482a6ab8cc 100644 --- a/packages/bot-engine/src/index.ts +++ b/packages/bot-engine/src/index.ts @@ -1,3 +1 @@ export * from './components/TypebotViewer' -export * from './models' -export { parseNewTypebot } from './services/utils' diff --git a/packages/bot-engine/src/models/publicTypebot.ts b/packages/bot-engine/src/models/publicTypebot.ts deleted file mode 100644 index d0f4802b42..0000000000 --- a/packages/bot-engine/src/models/publicTypebot.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { PublicTypebot as PublicTypebotFromPrisma } from 'db' -import { Block, Settings, StartBlock, Theme } from '.' - -export type PublicTypebot = Omit< - PublicTypebotFromPrisma, - 'blocks' | 'startBlock' | 'theme' | 'settings' -> & { - blocks: Block[] - startBlock: StartBlock - theme: Theme - settings: Settings -} diff --git a/packages/bot-engine/src/models/typebot.ts b/packages/bot-engine/src/models/typebot.ts deleted file mode 100644 index a2969c857a..0000000000 --- a/packages/bot-engine/src/models/typebot.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { Typebot as TypebotFromPrisma } from 'db' - -export type Typebot = Omit< - TypebotFromPrisma, - 'blocks' | 'startBlock' | 'theme' | 'settings' -> & { - blocks: Block[] - startBlock: StartBlock - theme: Theme - settings: Settings -} - -export type StartBlock = { - id: `start-block` - graphCoordinates: { - x: number - y: number - } - title: string - steps: [StartStep] -} - -export type StartStep = { - id: 'start-step' - blockId: 'start-block' - target?: Target - type: StepType.START - label: string -} - -export type Block = { - id: string - title: string - steps: Step[] - graphCoordinates: { - x: number - y: number - } -} - -export enum StepType { - START = 'start', - TEXT = 'text', - TEXT_INPUT = 'text input', -} - -export type Target = { blockId: string; stepId?: string } - -export type Step = BubbleStep | InputStep -export type BubbleStep = TextStep -export type InputStep = TextInputStep -export type StepBase = { id: string; blockId: string; target?: Target } -export type TextStep = StepBase & { - type: StepType.TEXT - content: { html: string; richText: unknown[]; plainText: string } -} -export type TextInputStep = StepBase & { - type: StepType.TEXT_INPUT -} - -export type Theme = { - general: { - font: string - background: Background - } -} - -export enum BackgroundType { - COLOR = 'Color', - IMAGE = 'Image', - NONE = 'None', -} - -export type Background = { - type: BackgroundType - content: string -} - -export type Settings = { - typingEmulation: TypingEmulationSettings -} - -export type TypingEmulationSettings = { - enabled: boolean - speed: number - maxDelay: number -} diff --git a/packages/bot-engine/src/services/chat.ts b/packages/bot-engine/src/services/chat.ts index 7b13bbdc5c..50d5d2e07a 100644 --- a/packages/bot-engine/src/services/chat.ts +++ b/packages/bot-engine/src/services/chat.ts @@ -1,4 +1,4 @@ -import { TypingEmulationSettings } from '../models' +import { TypingEmulationSettings } from 'models' export const computeTypingTimeout = ( bubbleContent: string, diff --git a/packages/bot-engine/src/services/theme.ts b/packages/bot-engine/src/services/theme.ts index dd96660ca6..5a74aa45a1 100644 --- a/packages/bot-engine/src/services/theme.ts +++ b/packages/bot-engine/src/services/theme.ts @@ -1,4 +1,4 @@ -import { BackgroundType, Theme } from '../models' +import { BackgroundType, Theme } from 'models' const cssVariableNames = { container: { diff --git a/packages/bot-engine/src/services/utils.ts b/packages/bot-engine/src/services/utils.ts index 808531301b..7e6c41bf84 100644 --- a/packages/bot-engine/src/services/utils.ts +++ b/packages/bot-engine/src/services/utils.ts @@ -1,55 +1,7 @@ -import { Prisma } from 'db' -import { - Step, - TextStep, - StepType, - TextInputStep, - BackgroundType, - Settings, - StartBlock, - Theme, -} from '../models' +import { Step, TextStep, StepType, TextInputStep } from 'models' export const isTextStep = (step: Step): step is TextStep => step.type === StepType.TEXT export const isTextInputStep = (step: Step): step is TextInputStep => step.type === StepType.TEXT_INPUT - -export const parseNewTypebot = ({ - ownerId, - folderId, - name, -}: { - ownerId: string - folderId: string | null - name: string -}): Prisma.TypebotUncheckedCreateInput => { - const startBlock: StartBlock = { - id: 'start-block', - title: 'Start', - graphCoordinates: { x: 0, y: 0 }, - steps: [ - { - id: 'start-step', - blockId: 'start-block', - label: 'Form starts here', - type: StepType.START, - }, - ], - } - const theme: Theme = { - general: { - font: 'Open Sans', - background: { type: BackgroundType.NONE, content: '#ffffff' }, - }, - } - const settings: Settings = { - typingEmulation: { - enabled: true, - speed: 300, - maxDelay: 1.5, - }, - } - return { folderId, name, ownerId, startBlock, theme, settings } -} diff --git a/packages/db/prisma/migrations/20220106083902_normalize_data/migration.sql b/packages/db/prisma/migrations/20220106083902_normalize_data/migration.sql new file mode 100644 index 0000000000..b5eea41fa2 --- /dev/null +++ b/packages/db/prisma/migrations/20220106083902_normalize_data/migration.sql @@ -0,0 +1,22 @@ +/* + Warnings: + + - You are about to drop the column `startBlock` on the `PublicTypebot` table. All the data in the column will be lost. + - You are about to drop the column `startBlock` on the `Typebot` table. All the data in the column will be lost. + - Added the required column `steps` to the `PublicTypebot` table without a default value. This is not possible if the table is not empty. + - Changed the type of `blocks` on the `PublicTypebot` table. No cast exists, the column would be dropped and recreated, which cannot be done if there is data, since the column is required. + - Added the required column `steps` to the `Typebot` table without a default value. This is not possible if the table is not empty. + - Changed the type of `blocks` on the `Typebot` table. No cast exists, the column would be dropped and recreated, which cannot be done if there is data, since the column is required. + +*/ +-- AlterTable +ALTER TABLE "PublicTypebot" DROP COLUMN "startBlock", +ADD COLUMN "steps" JSONB NOT NULL, +DROP COLUMN "blocks", +ADD COLUMN "blocks" JSONB NOT NULL; + +-- AlterTable +ALTER TABLE "Typebot" DROP COLUMN "startBlock", +ADD COLUMN "steps" JSONB NOT NULL, +DROP COLUMN "blocks", +ADD COLUMN "blocks" JSONB NOT NULL; diff --git a/packages/db/prisma/schema.prisma b/packages/db/prisma/schema.prisma index ed8bb6bf94..c089dd1826 100644 --- a/packages/db/prisma/schema.prisma +++ b/packages/db/prisma/schema.prisma @@ -90,23 +90,23 @@ model Typebot { results Result[] folderId String? folder DashboardFolder? @relation(fields: [folderId], references: [id]) - blocks Json[] - startBlock Json + blocks Json + steps Json theme Json settings Json publicId String? @unique } model PublicTypebot { - id String @id @default(cuid()) - typebotId String @unique - typebot Typebot @relation(fields: [typebotId], references: [id], onDelete: Cascade) - name String - blocks Json[] - startBlock Json - theme Json - settings Json - publicId String? @unique + id String @id @default(cuid()) + typebotId String @unique + typebot Typebot @relation(fields: [typebotId], references: [id], onDelete: Cascade) + name String + blocks Json + steps Json + theme Json + settings Json + publicId String? @unique } model Result { diff --git a/packages/models/.gitignore b/packages/models/.gitignore new file mode 100644 index 0000000000..5db31a8773 --- /dev/null +++ b/packages/models/.gitignore @@ -0,0 +1,7 @@ +node_modules +# Keep environment variables out of version control +.env + +dist +types +yarn-error.log \ No newline at end of file diff --git a/packages/models/package.json b/packages/models/package.json new file mode 100644 index 0000000000..13d7ec96da --- /dev/null +++ b/packages/models/package.json @@ -0,0 +1,19 @@ +{ + "name": "models", + "version": "1.0.0", + "main": "dist/index.js", + "types": "types/index.d.ts", + "license": "AGPL-3.0-or-later", + "private": true, + "devDependencies": { + "typescript": "^4.5.4" + }, + "dependencies": { + "next": "^12.0.7", + "db": "*" + }, + "scripts": { + "build": "tsc", + "dev": "tsc --watch" + } +} diff --git a/packages/bot-engine/src/models/answer.ts b/packages/models/src/answer.ts similarity index 100% rename from packages/bot-engine/src/models/answer.ts rename to packages/models/src/answer.ts diff --git a/packages/bot-engine/src/models/index.ts b/packages/models/src/index.ts similarity index 81% rename from packages/bot-engine/src/models/index.ts rename to packages/models/src/index.ts index 6cb8add09e..6c1465593d 100644 --- a/packages/bot-engine/src/models/index.ts +++ b/packages/models/src/index.ts @@ -2,3 +2,4 @@ export * from './typebot' export * from './publicTypebot' export * from './result' export * from './answer' +export * from './utils' diff --git a/packages/models/src/publicTypebot.ts b/packages/models/src/publicTypebot.ts new file mode 100644 index 0000000000..bde0279c70 --- /dev/null +++ b/packages/models/src/publicTypebot.ts @@ -0,0 +1,13 @@ +import { PublicTypebot as PublicTypebotFromPrisma } from 'db' +import { Block, Settings, Step, Theme } from './typebot' +import { Table } from './utils' + +export type PublicTypebot = Omit< + PublicTypebotFromPrisma, + 'blocks' | 'startBlock' | 'theme' | 'settings' | 'steps' +> & { + blocks: Table + steps: Table + theme: Theme + settings: Settings +} diff --git a/packages/bot-engine/src/models/result.ts b/packages/models/src/result.ts similarity index 100% rename from packages/bot-engine/src/models/result.ts rename to packages/models/src/result.ts diff --git a/packages/models/src/typebot/index.ts b/packages/models/src/typebot/index.ts new file mode 100644 index 0000000000..4a09896f2c --- /dev/null +++ b/packages/models/src/typebot/index.ts @@ -0,0 +1,4 @@ +export * from './typebot' +export * from './steps' +export * from './theme' +export * from './settings' diff --git a/packages/models/src/typebot/settings.ts b/packages/models/src/typebot/settings.ts new file mode 100644 index 0000000000..20cb2bce96 --- /dev/null +++ b/packages/models/src/typebot/settings.ts @@ -0,0 +1,9 @@ +export type Settings = { + typingEmulation: TypingEmulationSettings +} + +export type TypingEmulationSettings = { + enabled: boolean + speed: number + maxDelay: number +} diff --git a/packages/models/src/typebot/steps.ts b/packages/models/src/typebot/steps.ts new file mode 100644 index 0000000000..49c35f834b --- /dev/null +++ b/packages/models/src/typebot/steps.ts @@ -0,0 +1,29 @@ +export type Step = StartStep | BubbleStep | InputStep + +export type BubbleStep = TextStep + +export type InputStep = TextInputStep + +export enum StepType { + START = 'start', + TEXT = 'text', + TEXT_INPUT = 'text input', +} + +export type StepBase = { id: string; blockId: string; target?: Target } + +export type StartStep = StepBase & { + type: StepType.START + label: string +} + +export type TextStep = StepBase & { + type: StepType.TEXT + content: { html: string; richText: unknown[]; plainText: string } +} + +export type TextInputStep = StepBase & { + type: StepType.TEXT_INPUT +} + +export type Target = { blockId: string; stepId?: string } diff --git a/packages/models/src/typebot/theme.ts b/packages/models/src/typebot/theme.ts new file mode 100644 index 0000000000..7debf84d7f --- /dev/null +++ b/packages/models/src/typebot/theme.ts @@ -0,0 +1,17 @@ +export type Theme = { + general: { + font: string + background: Background + } +} + +export enum BackgroundType { + COLOR = 'Color', + IMAGE = 'Image', + NONE = 'None', +} + +export type Background = { + type: BackgroundType + content: string +} diff --git a/packages/models/src/typebot/typebot.ts b/packages/models/src/typebot/typebot.ts new file mode 100644 index 0000000000..b6ab30bc75 --- /dev/null +++ b/packages/models/src/typebot/typebot.ts @@ -0,0 +1,25 @@ +import { Typebot as TypebotFromPrisma } from 'db' +import { Table } from '../utils' +import { Settings } from './settings' +import { Step } from './steps' +import { Theme } from './theme' + +export type Typebot = Omit< + TypebotFromPrisma, + 'blocks' | 'theme' | 'settings' | 'steps' +> & { + blocks: Table + steps: Table + theme: Theme + settings: Settings +} + +export type Block = { + id: string + title: string + graphCoordinates: { + x: number + y: number + } + stepIds: string[] +} diff --git a/packages/models/src/utils.ts b/packages/models/src/utils.ts new file mode 100644 index 0000000000..bb3260d2b4 --- /dev/null +++ b/packages/models/src/utils.ts @@ -0,0 +1 @@ +export type Table = { byId: { [key: string]: T }; allIds: string[] } diff --git a/packages/models/tsconfig.json b/packages/models/tsconfig.json new file mode 100644 index 0000000000..431ac3ad44 --- /dev/null +++ b/packages/models/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "es2016", + "module": "commonjs", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "declaration": true, + "declarationDir": "./types", + "outDir": "./dist" + } +} diff --git a/packages/utils/.gitignore b/packages/utils/.gitignore new file mode 100644 index 0000000000..a895b79c1d --- /dev/null +++ b/packages/utils/.gitignore @@ -0,0 +1,6 @@ +node_modules +# Keep environment variables out of version control +.env + +dist +yarn-error.log \ No newline at end of file diff --git a/packages/utils/package.json b/packages/utils/package.json index c5f40cc33b..18ecc0e2fe 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,13 +1,26 @@ { "name": "utils", "version": "1.0.0", - "main": "index.ts", "license": "AGPL-3.0-or-later", "private": true, + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/index.d.ts", "devDependencies": { + "@rollup/plugin-commonjs": "^21.0.1", + "@rollup/plugin-node-resolve": "^13.1.3", + "@rollup/plugin-typescript": "^8.3.0", + "rollup": "^2.63.0", + "rollup-plugin-dts": "^4.1.0", + "rollup-plugin-peer-deps-external": "^2.2.4", "typescript": "^4.5.4" }, "dependencies": { + "models": "*", "next": "^12.0.7" + }, + "scripts": { + "build": "yarn rollup -c", + "dev": "yarn rollup -c --watch" } } diff --git a/packages/utils/rollup.config.js b/packages/utils/rollup.config.js new file mode 100644 index 0000000000..96c951fd36 --- /dev/null +++ b/packages/utils/rollup.config.js @@ -0,0 +1,38 @@ +import resolve from '@rollup/plugin-node-resolve' +import commonjs from '@rollup/plugin-commonjs' +import typescript from '@rollup/plugin-typescript' +import dts from 'rollup-plugin-dts' +import peerDepsExternal from 'rollup-plugin-peer-deps-external' + +const packageJson = require('./package.json') + +export default [ + { + input: 'src/index.ts', + output: [ + { + file: packageJson.main, + format: 'cjs', + sourcemap: true, + inlineDynamicImports: true, + }, + { + file: packageJson.module, + format: 'esm', + sourcemap: true, + inlineDynamicImports: true, + }, + ], + plugins: [ + peerDepsExternal(), + resolve(), + commonjs(), + typescript({ tsconfig: './tsconfig.json' }), + ], + }, + { + input: 'dist/esm/types/index.d.ts', + output: [{ file: 'dist/index.d.ts', format: 'esm' }], + plugins: [dts()], + }, +] diff --git a/packages/utils/apiUtils.ts b/packages/utils/src/apiUtils.ts similarity index 100% rename from packages/utils/apiUtils.ts rename to packages/utils/src/apiUtils.ts diff --git a/packages/utils/index.ts b/packages/utils/src/index.ts similarity index 100% rename from packages/utils/index.ts rename to packages/utils/src/index.ts diff --git a/packages/utils/utils.ts b/packages/utils/src/utils.ts similarity index 76% rename from packages/utils/utils.ts rename to packages/utils/src/utils.ts index 91565d808b..1f1571895d 100644 --- a/packages/utils/utils.ts +++ b/packages/utils/src/utils.ts @@ -1,3 +1,5 @@ +import { Table } from 'models' + export const sendRequest = async ({ url, method, @@ -25,3 +27,8 @@ export const sendRequest = async ({ export const isDefined = (value: T | undefined | null): value is T => { return value !== undefined && value !== null } + +export const filterTable = (ids: string[], table: Table): Table => ({ + byId: ids.reduce((acc, id) => ({ ...acc, [id]: table.byId[id] }), {}), + allIds: ids, +}) diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json index 3ffa57bad5..ce02a5c63d 100644 --- a/packages/utils/tsconfig.json +++ b/packages/utils/tsconfig.json @@ -1,10 +1,17 @@ { "compilerOptions": { - "target": "es2016", - "module": "commonjs", + "target": "es5", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, - "skipLibCheck": true + "skipLibCheck": true, + "module": "ESNext", + "declaration": true, + "declarationDir": "types", + "sourceMap": true, + "outDir": "dist", + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "emitDeclarationOnly": true } } diff --git a/yarn.lock b/yarn.lock index 93292f4021..a3772d61c4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,96 +9,96 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" - integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== dependencies: - "@babel/highlight" "^7.16.0" + "@babel/highlight" "^7.16.7" -"@babel/generator@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.5.tgz#26e1192eb8f78e0a3acaf3eede3c6fc96d22bedf" - integrity sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA== +"@babel/generator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.7.tgz#b42bf46a3079fa65e1544135f32e7958f048adbb" + integrity sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg== dependencies: - "@babel/types" "^7.16.0" + "@babel/types" "^7.16.7" jsesc "^2.5.1" source-map "^0.5.0" "@babel/helper-annotate-as-pure@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz#9a1f0ebcda53d9a2d00108c4ceace6a5d5f1f08d" - integrity sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== dependencies: - "@babel/types" "^7.16.0" + "@babel/types" "^7.16.7" -"@babel/helper-environment-visitor@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.5.tgz#f6a7f38b3c6d8b07c88faea083c46c09ef5451b8" - integrity sha512-ODQyc5AnxmZWm/R2W7fzhamOk1ey8gSguo5SGvF0zcB3uUzRpTRmM/jmLSm9bDMyPlvbyJ+PwPEK0BWIoZ9wjg== +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== dependencies: - "@babel/types" "^7.16.0" + "@babel/types" "^7.16.7" -"@babel/helper-function-name@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" - integrity sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog== +"@babel/helper-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" + integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== dependencies: - "@babel/helper-get-function-arity" "^7.16.0" - "@babel/template" "^7.16.0" - "@babel/types" "^7.16.0" + "@babel/helper-get-function-arity" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/helper-get-function-arity@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa" - integrity sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ== +"@babel/helper-get-function-arity@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== dependencies: - "@babel/types" "^7.16.0" + "@babel/types" "^7.16.7" -"@babel/helper-hoist-variables@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a" - integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg== +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== dependencies: - "@babel/types" "^7.16.0" + "@babel/types" "^7.16.7" "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" - integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== dependencies: - "@babel/types" "^7.16.0" + "@babel/types" "^7.16.7" -"@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz#afe37a45f39fce44a3d50a7958129ea5b1a5c074" - integrity sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ== +"@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== -"@babel/helper-split-export-declaration@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" - integrity sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw== +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== dependencies: - "@babel/types" "^7.16.0" + "@babel/types" "^7.16.7" -"@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": - version "7.15.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" - integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== +"@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== -"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" - integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== +"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.7.tgz#81a01d7d675046f0d96f82450d9d9578bdfd6b0b" + integrity sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw== dependencies: - "@babel/helper-validator-identifier" "^7.15.7" + "@babel/helper-validator-identifier" "^7.16.7" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.16.0", "@babel/parser@^7.16.5": - version "7.16.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.6.tgz#8f194828193e8fa79166f34a4b4e52f3e769a314" - integrity sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ== +"@babel/parser@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.7.tgz#d372dda9c89fcec340a82630a9f533f2fe15877e" + integrity sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA== "@babel/plugin-syntax-jsx@7.14.5": version "7.14.5" @@ -108,16 +108,16 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-jsx@^7.12.13": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.5.tgz#bf255d252f78bc8b77a17cadc37d1aa5b8ed4394" - integrity sha512-42OGssv9NPk4QHKVgIHlzeLgPOW5rGgfV5jzG90AhcXXIv6hu/eqj63w4VgvRxdvZY3AlYeDgPiSJ3BqAd1Y6Q== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" + integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== dependencies: - "@babel/helper-plugin-utils" "^7.16.5" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/runtime-corejs3@^7.10.2": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.16.5.tgz#9057d879720c136193f0440bc400088212a74894" - integrity sha512-F1pMwvTiUNSAM8mc45kccMQxj31x3y3P+tA/X8hKNWp3/hUsxdGxZ3D3H8JIkxtfA8qGkaBTKvcmvStaYseAFw== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.16.7.tgz#a762745fe8b4d61a26444a9151e6586d36044dde" + integrity sha512-MiYR1yk8+TW/CpOD0CyX7ve9ffWTKqLk/L6pk8TPl0R8pNi+1pFY8fH9yET55KlvukQ4PAWfXsGr2YHVjcI4Pw== dependencies: core-js-pure "^3.19.0" regenerator-runtime "^0.13.4" @@ -130,34 +130,34 @@ regenerator-runtime "^0.13.4" "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.14.6", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.7": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.5.tgz#7f3e34bf8bdbbadf03fbb7b1ea0d929569c9487a" - integrity sha512-TXWihFIS3Pyv5hzR7j6ihmeLkZfrXGxAr5UfSl8CHf+6q/wpiYDkUau0czckpYG8QmnCIuPpdLtuA9VmuGGyMA== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" + integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6" - integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A== +"@babel/template@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/parser" "^7.16.0" - "@babel/types" "^7.16.0" + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" "@babel/traverse@^7.4.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.5.tgz#d7d400a8229c714a59b87624fc67b0f1fbd4b2b3" - integrity sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/generator" "^7.16.5" - "@babel/helper-environment-visitor" "^7.16.5" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-hoist-variables" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - "@babel/parser" "^7.16.5" - "@babel/types" "^7.16.0" + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.7.tgz#dac01236a72c2560073658dd1a285fe4e0865d76" + integrity sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" debug "^4.1.0" globals "^11.1.0" @@ -169,21 +169,21 @@ "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" -"@babel/types@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" - integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== +"@babel/types@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.7.tgz#4ed19d51f840ed4bd5645be6ce40775fecf03159" + integrity sha512-E8HuV7FO9qLpx6OtoGfUQ2cjIYnbFwvZWYBS+87EwtdMvmUPJSwykpovFB+8insbpF0uJcpr8KMUi64XZntZcg== dependencies: - "@babel/helper-validator-identifier" "^7.15.7" + "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" -"@chakra-ui/accordion@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@chakra-ui/accordion/-/accordion-1.4.2.tgz#e851d5e0f748646e20efde909b5f70a93679283b" - integrity sha512-BAGMvcm2sFE5Ft7jwC9nF03/Yv7qztuhzwKBBy4iL0p1nCPh6kV54RBXUcoj3VWe+yrmNiAVYKRTdqQBTJFwOw== +"@chakra-ui/accordion@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@chakra-ui/accordion/-/accordion-1.4.3.tgz#86837416c674719d6df134110424a93ac71d9eea" + integrity sha512-UKpi7xd+hcT/OIDRBRT4vkvVmpym5K9tf3tPyPdwpJcCfCd0D8dvmgZWBM4vCCRPCNfuoyxba5z97witzLCf+g== dependencies: "@chakra-ui/descendant" "2.1.1" - "@chakra-ui/hooks" "1.7.1" + "@chakra-ui/hooks" "1.7.2" "@chakra-ui/icon" "2.0.0" "@chakra-ui/react-utils" "1.2.1" "@chakra-ui/transition" "1.4.2" @@ -205,12 +205,12 @@ dependencies: "@chakra-ui/theme-tools" "^1.3.1" -"@chakra-ui/avatar@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@chakra-ui/avatar/-/avatar-1.3.1.tgz#fbb9d45b14caa956c4d16cca85e7219d821f0f66" - integrity sha512-WI0/kcpTJViOH093V0bz8EB+e/rc+gjF+T5DkOuh1YWFxRRG5v+4Yd3PdEJtQgzWtBVhlbGWmE7WvBizyKwFCA== +"@chakra-ui/avatar@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/avatar/-/avatar-1.3.2.tgz#575d524117ab1a77dc6a4963868a7ba02822a745" + integrity sha512-Z4CQI2haksy0YIV1gKa967P94WZUVzlMN+Wgs8PJJoxxmeY6tVruuvp5+Zb5D5kSAmQBvGWxlgJjClKXzeCQ7A== dependencies: - "@chakra-ui/image" "1.1.1" + "@chakra-ui/image" "1.1.2" "@chakra-ui/react-utils" "1.2.1" "@chakra-ui/utils" "1.9.1" @@ -222,22 +222,22 @@ "@chakra-ui/react-utils" "1.2.1" "@chakra-ui/utils" "1.9.1" -"@chakra-ui/button@1.5.1": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@chakra-ui/button/-/button-1.5.1.tgz#0f0b3e7a10b3c8aea4a2da114386d1a767916aaa" - integrity sha512-BvP29quEhP6OTgDiRsugD6adgkeOTEQpoDsZUVEmHnNVrbFfdsICEKKQTtDJ2iPf+hmpFrtnpN50vCLdAANKcw== +"@chakra-ui/button@1.5.2": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/button/-/button-1.5.2.tgz#ea70d837d50aa85970fc36060ea4d7aa9d166281" + integrity sha512-1LyZ7o4g+ZF0Qfwr77Fa3qHtCGhghoIPG2lcUWhhPk+8ygHNF0ZOngfsiDD7aoEj0uXsvlgZ/hdiqv0PmMTRzg== dependencies: - "@chakra-ui/hooks" "1.7.1" + "@chakra-ui/hooks" "1.7.2" "@chakra-ui/react-utils" "1.2.1" "@chakra-ui/spinner" "1.2.1" "@chakra-ui/utils" "1.9.1" -"@chakra-ui/checkbox@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@chakra-ui/checkbox/-/checkbox-1.6.1.tgz#e84d828f2d8b2e1a84ae51982a29eb4c7e7e0eff" - integrity sha512-Z5ZMeUYIRjRbi/knhYhSQshZH7OnROA7ezl9a9oVSKRF7iLMNMibQSlQLXmqUWaTKSgrS37cpKAzfgEuemyiUQ== +"@chakra-ui/checkbox@1.6.2": + version "1.6.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/checkbox/-/checkbox-1.6.2.tgz#a6fc34d42caf7bc2ccc83af9deafd00e7c01e53e" + integrity sha512-eu4MeKWqwFc3zakjMnUi1pGXQ17HzeWbvQHwEZCYgIDk+S9DXopQr8o38zaHzs/MHmlelCzM96IBgTWZXWR/eg== dependencies: - "@chakra-ui/hooks" "1.7.1" + "@chakra-ui/hooks" "1.7.2" "@chakra-ui/react-utils" "1.2.1" "@chakra-ui/utils" "1.9.1" "@chakra-ui/visually-hidden" "1.1.1" @@ -258,12 +258,12 @@ "@chakra-ui/icon" "2.0.0" "@chakra-ui/utils" "1.9.1" -"@chakra-ui/color-mode@1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@chakra-ui/color-mode/-/color-mode-1.3.2.tgz#e87f9c17ae891c426fa8c9dbdd3c2ba80669fa48" - integrity sha512-/rWcbrzbaWCyyUnT07Qjz0xf/ltHS31CHOKtVCWr2uTgfn2gOQpdxsKRbjrLYPOYZGTMdINUHNiAsqQjLoAoTQ== +"@chakra-ui/color-mode@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@chakra-ui/color-mode/-/color-mode-1.3.3.tgz#91f03c4c5ddfd1f238ce566af1f2b371f3f551a1" + integrity sha512-vEMG9PRtVllAxbJE76bM4fRdo+hRZsPX/9cO+gR1YegYQNeobbV9Ive/MKNYQzdlbQ855Ytn6cPGr2hzy9MdRg== dependencies: - "@chakra-ui/hooks" "1.7.1" + "@chakra-ui/hooks" "1.7.2" "@chakra-ui/react-env" "1.1.1" "@chakra-ui/utils" "1.9.1" @@ -274,12 +274,12 @@ dependencies: "@chakra-ui/utils" "1.9.1" -"@chakra-ui/counter@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@chakra-ui/counter/-/counter-1.2.1.tgz#36d4683472751b9ce866d6d86f3856d032194468" - integrity sha512-Gm4njMzEsDyAzdQtExn40TvmupzkPBrT5DiCu0DlxYqpLqCfqV49HgJHEG5oW3WV+WaC9mzg7VV+idKYh/d+Gg== +"@chakra-ui/counter@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/counter/-/counter-1.2.2.tgz#4be45cccd46981e6c613eb1c28132213382e3284" + integrity sha512-EljrsJYHpR5tZ1UczzlZ7gwKZs3ijF2tKCAAmsTpRerPbwGFvrmhfFfLexgbc0vxmeuZYUVeuiClLXQT4lvd5w== dependencies: - "@chakra-ui/hooks" "1.7.1" + "@chakra-ui/hooks" "1.7.2" "@chakra-ui/utils" "1.9.1" "@chakra-ui/css-reset@1.1.1", "@chakra-ui/css-reset@^1.1.1": @@ -294,12 +294,12 @@ dependencies: "@chakra-ui/react-utils" "^1.2.1" -"@chakra-ui/editable@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@chakra-ui/editable/-/editable-1.3.1.tgz#24e9be0a9275d47feb3fb8a885e3e417e9120d0c" - integrity sha512-MwyTtsnHNqmKmHv9SH3KIHWa06D4gBwcuTawTiSnYBUJL6My8ry/Wdca1to9So2tD6hcjz3TPTzOJOlyv0eiZg== +"@chakra-ui/editable@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/editable/-/editable-1.3.2.tgz#dd768b000b8a14954df618c8d633ecc553bd8de8" + integrity sha512-WY0dq+hQOIyMAamFj2fECNb1AtOwxoddAbZ6k4/epiKNkaRA5ENzgPdV6Gw3t02fDXv95D0J4V4XcpNgfCz6TA== dependencies: - "@chakra-ui/hooks" "1.7.1" + "@chakra-ui/hooks" "1.7.2" "@chakra-ui/react-utils" "1.2.1" "@chakra-ui/utils" "1.9.1" @@ -311,20 +311,20 @@ "@chakra-ui/utils" "1.9.1" react-focus-lock "2.5.2" -"@chakra-ui/form-control@1.5.2": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@chakra-ui/form-control/-/form-control-1.5.2.tgz#4ce34f03165cfafacecabdce3be82011b74308a7" - integrity sha512-uWv0/f+JEM0ZE5Hnj3TzCnJ09EB+A+DSs9QgyECOuxx9Ju6gnns2uaRki2BfxksQL9ZZomPCkMtXazY9Wa81ag== +"@chakra-ui/form-control@1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@chakra-ui/form-control/-/form-control-1.5.3.tgz#cbc8037470f8ef33d5ca839362e231edf9e1af56" + integrity sha512-+UkOJJYUSGVATeNK/2b+KJx3qRGAtqpD1sR2mqd9DhgmJ/JUGV8q4LVcXIcVs/7BYNqP9B0JQUBIDlHNuTwlJA== dependencies: - "@chakra-ui/hooks" "1.7.1" + "@chakra-ui/hooks" "1.7.2" "@chakra-ui/icon" "2.0.0" "@chakra-ui/react-utils" "1.2.1" "@chakra-ui/utils" "1.9.1" -"@chakra-ui/hooks@1.7.1": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@chakra-ui/hooks/-/hooks-1.7.1.tgz#0242b678f40ef00e4834a8a856c8881dcda0072d" - integrity sha512-hgN19X6GUKQYAHczmFY+GAT8vl9h+X+nGWrIAnmvZ6BgUXxDajnTNhZeWhj0ZkR+7A7dCE6Y/3X44GafUgChMw== +"@chakra-ui/hooks@1.7.2": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/hooks/-/hooks-1.7.2.tgz#64341c06b141cdc4c08ccab0308b46b20c11a99b" + integrity sha512-XJnya9ugAPYUedtQULKaLYBezE9cZMOkDm0MQl7FEuJKZ9ocHD6Pwpwf9Z03R91XQmcNL8gZ1NS0GT9v/xNl3Q== dependencies: "@chakra-ui/react-utils" "1.2.1" "@chakra-ui/utils" "1.9.1" @@ -338,27 +338,27 @@ dependencies: "@chakra-ui/utils" "1.9.1" -"@chakra-ui/image@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@chakra-ui/image/-/image-1.1.1.tgz#39ecb77155e9e1fbbc68e825eb46405808805a8c" - integrity sha512-bz1pn08XlXcO3r1KnpdjQgN3R2soiTx10sG2d5Pw9BdGdySf7Y73wiLh+Tan1xJHp6p2KH1hz4f7uKXXDn7Qmw== +"@chakra-ui/image@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/image/-/image-1.1.2.tgz#257eb0d6a3759301066e7b1d68cc3e3b0c36c204" + integrity sha512-bW4PMONYpWRLJ10di7W5BhYUOcCohNLhiTygOmVRMHWfUk9vmxhORlNu0EaSXUKGXiQ35cTVu4Ysv3L/1xYPRQ== dependencies: - "@chakra-ui/hooks" "1.7.1" + "@chakra-ui/hooks" "1.7.2" "@chakra-ui/utils" "1.9.1" -"@chakra-ui/input@1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@chakra-ui/input/-/input-1.3.2.tgz#59d49ab5c8645c51cd591d46ca23d5cb95e03392" - integrity sha512-VMxmQgFiQ2UnBlkgLX/336G0IfYfw8YWF2ZoEFj5WL9kDSrrL1FXSBgjFGxrper74G4W20tESBCfU1S891y6cg== +"@chakra-ui/input@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@chakra-ui/input/-/input-1.3.3.tgz#671bb983c22b066301e972de1c24cc63a05c7350" + integrity sha512-Fsivp608cKdc2tSQvPXczHtyfU6YHLju+EuAs5pjqKC8ZTwPawBRkCvlTGPPd7VwyTHkp08X5qARCxEgjRFbzw== dependencies: - "@chakra-ui/form-control" "1.5.2" + "@chakra-ui/form-control" "1.5.3" "@chakra-ui/react-utils" "1.2.1" "@chakra-ui/utils" "1.9.1" -"@chakra-ui/layout@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@chakra-ui/layout/-/layout-1.6.0.tgz#fa45d72420f01f4f6082f5a5a0c202bf7b09a059" - integrity sha512-WUfQ104y1wNueU33/hPlZsMzYJGjO0dXMpVkQf5ZNhNX3IGDO+5+MO2x2xloP+j45yNPi3p8ti/HBnm3dXI+3Q== +"@chakra-ui/layout@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@chakra-ui/layout/-/layout-1.7.0.tgz#1e69f6708cc8f9628b708145daff1167c5445131" + integrity sha512-ZjRqLGs16T4PcWH445SkELVuxxfecjjUeprtFnNw13QzwydP46L8+GB3ycp6wyJDa6DMo77TxQQnK5jUUwY6Mw== dependencies: "@chakra-ui/icon" "2.0.0" "@chakra-ui/react-utils" "1.2.1" @@ -371,71 +371,71 @@ dependencies: "@chakra-ui/utils" "1.9.1" -"@chakra-ui/media-query@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@chakra-ui/media-query/-/media-query-1.2.2.tgz#46db9059de1367a3aa85c1fb973a78f95fca6cc5" - integrity sha512-xSmDVleE1drWiGH/MX3RqyVm29x/8Vf6G0UGaI2kCpbNmon+Q1zHW/yDHvptIuctLrPHYO8LOBxuUjfnIXwC2g== +"@chakra-ui/media-query@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@chakra-ui/media-query/-/media-query-1.2.3.tgz#aa633e4e14bc6a5c407dc18756712bf2133c8679" + integrity sha512-DbStv1VUSBwFj/MNemxRUtoibSoR9ZRcW31UUjtkiIH58cSB5lyEPv9rdD/1HRXpJfSaWQ439Tbuf03gOC4SVQ== dependencies: "@chakra-ui/react-env" "1.1.1" "@chakra-ui/utils" "1.9.1" -"@chakra-ui/menu@1.8.2": - version "1.8.2" - resolved "https://registry.yarnpkg.com/@chakra-ui/menu/-/menu-1.8.2.tgz#849f51beef6220667eb47c831ddf2c65919ded0e" - integrity sha512-u2GfkwTqbWa8L/7i/kOFbU3JANiT2HStR+gsYKuiuOPiuBcUb8OlgfJfP70OtVKegNKmVEMjvzXtld3wCCo/1g== +"@chakra-ui/menu@1.8.3": + version "1.8.3" + resolved "https://registry.yarnpkg.com/@chakra-ui/menu/-/menu-1.8.3.tgz#0248fb9cb4583fc1e52aa02a8bf47136074375c7" + integrity sha512-TehcqHLKlMdkeXTtCYXzWNa6nbAk1cpjGz6OPl2ua0eisoOKgPolpkreCfYrWV9NNk0BmzZn+Su+z60jbhqggA== dependencies: "@chakra-ui/clickable" "1.2.1" "@chakra-ui/descendant" "2.1.1" - "@chakra-ui/hooks" "1.7.1" + "@chakra-ui/hooks" "1.7.2" "@chakra-ui/popper" "2.4.1" "@chakra-ui/react-utils" "1.2.1" "@chakra-ui/transition" "1.4.2" "@chakra-ui/utils" "1.9.1" -"@chakra-ui/modal@1.10.2": - version "1.10.2" - resolved "https://registry.yarnpkg.com/@chakra-ui/modal/-/modal-1.10.2.tgz#578c30812c63863bef25f4b5c279cacbb34528ec" - integrity sha512-ZlmYetPHwHW4CAM09j4/+Ui54dXR1nzU6mOwhWe4/IzLvEyoEU6fHJeKyGxVUpYTG/7wltG/wKFRJpYa77tiBg== +"@chakra-ui/modal@1.10.3": + version "1.10.3" + resolved "https://registry.yarnpkg.com/@chakra-ui/modal/-/modal-1.10.3.tgz#59f56cf699b526f3b13ed1342f61858469cbac65" + integrity sha512-b0kVv4kNFWVbJPprEgFqqBH8EeneLAueSV+0t9Z1MpvIF0EUB6qe2JQZ0X8eDOtNYX4Tp7Y7LRCQ/M/HMm9WRw== dependencies: "@chakra-ui/close-button" "1.2.2" "@chakra-ui/focus-lock" "1.2.1" - "@chakra-ui/hooks" "1.7.1" - "@chakra-ui/portal" "1.3.1" + "@chakra-ui/hooks" "1.7.2" + "@chakra-ui/portal" "1.3.2" "@chakra-ui/react-utils" "1.2.1" "@chakra-ui/transition" "1.4.2" "@chakra-ui/utils" "1.9.1" aria-hidden "^1.1.1" react-remove-scroll "2.4.1" -"@chakra-ui/number-input@1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@chakra-ui/number-input/-/number-input-1.3.2.tgz#580035e56a13c30b04034ab02cb9c1132a1cf09c" - integrity sha512-7x7AoqwPXU1odyDcqIwjBwf0MJUwYMM2fa+6YZ52F941GKlvkDiiJOhK6xfhhBzkLUQD6DN8zgAmmGhaZ6UQXw== +"@chakra-ui/number-input@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@chakra-ui/number-input/-/number-input-1.3.3.tgz#caf176d2206b965658907bd72bd692077e4ce5dd" + integrity sha512-nptvORoG+PvvuURkzh0juSYxj3L9HnWIeNncC/7oXgm2AFGxIcqUk8pUJaUNM2mlbLjJZS19/MWlfzgsYJmJrQ== dependencies: - "@chakra-ui/counter" "1.2.1" - "@chakra-ui/form-control" "1.5.2" - "@chakra-ui/hooks" "1.7.1" + "@chakra-ui/counter" "1.2.2" + "@chakra-ui/form-control" "1.5.3" + "@chakra-ui/hooks" "1.7.2" "@chakra-ui/icon" "2.0.0" "@chakra-ui/react-utils" "1.2.1" "@chakra-ui/utils" "1.9.1" -"@chakra-ui/pin-input@1.7.1": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@chakra-ui/pin-input/-/pin-input-1.7.1.tgz#38c3bcf3d32f1404a431ae11030ff7ce5d964190" - integrity sha512-eFFc5sofiyion+NxELWfCzD23XHIBDrJcfKKbNxt8jdXg9Ek4mFpmvnxBVrK0DIz6cVYgKY8c364OmxNUf4IyA== +"@chakra-ui/pin-input@1.7.2": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/pin-input/-/pin-input-1.7.2.tgz#9acdd962c3cf1199d63de7524dd65fc7aad31c81" + integrity sha512-2dGNdU+Xlu0u1OxuelJBKQu7dDKaD5kN9moZMoKpjpXB8Kibh7GM3OO/Z25aMM/E9Kly21qXgHju0Tj/ovBJuw== dependencies: "@chakra-ui/descendant" "2.1.1" - "@chakra-ui/hooks" "1.7.1" + "@chakra-ui/hooks" "1.7.2" "@chakra-ui/react-utils" "1.2.1" "@chakra-ui/utils" "1.9.1" -"@chakra-ui/popover@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@chakra-ui/popover/-/popover-1.11.0.tgz#3ad9faf26019c750a5f8c619ee80dd97bcc4ee3e" - integrity sha512-cCHXAfhIRir+M0ehlYIjDw3mHpiCxDTJ9WV0H1zHQV8nDYVIlZw3nEntaq8oJrv0wpIzq2WCW5ss+bBR7nLZ1A== +"@chakra-ui/popover@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@chakra-ui/popover/-/popover-1.11.1.tgz#6342bf8c2d3de24ae62a09ae4765d5b8ca765be3" + integrity sha512-WV1R2L1V6mbpe6/aInr4yFe6rAu7+pT8Od6Hki5KsIv+4QvoEMYsvJ0VOhaURLLD+NaKXFCsfpc9immluia+AA== dependencies: "@chakra-ui/close-button" "1.2.2" - "@chakra-ui/hooks" "1.7.1" + "@chakra-ui/hooks" "1.7.2" "@chakra-ui/popper" "2.4.1" "@chakra-ui/react-utils" "1.2.1" "@chakra-ui/utils" "1.9.1" @@ -448,12 +448,12 @@ "@chakra-ui/react-utils" "1.2.1" "@popperjs/core" "^2.9.3" -"@chakra-ui/portal@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@chakra-ui/portal/-/portal-1.3.1.tgz#944d86bd9e77a70a5549e84a03d31c7bbd3ec62c" - integrity sha512-6UOGZCfujgdijcPs/JTEY5IB5WtKvUbfrSQYsG5CDa+guIwvnoP5qZ+rH6BR6DSSM8Wr/1n+WrtanhfFZShHKA== +"@chakra-ui/portal@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/portal/-/portal-1.3.2.tgz#ec76ffb15dfdf6e5a0ea26bc534bfacc39207331" + integrity sha512-dWUCwEZNpPnbR21+eBbEGuvvOcz5AuS+TZ4V0sUdUEI8B3dPUEylJsveZpYjOCS/YAh4xoxbo6I6haRgrfguvw== dependencies: - "@chakra-ui/hooks" "1.7.1" + "@chakra-ui/hooks" "1.7.2" "@chakra-ui/react-utils" "1.2.1" "@chakra-ui/utils" "1.9.1" @@ -465,25 +465,25 @@ "@chakra-ui/theme-tools" "1.3.1" "@chakra-ui/utils" "1.9.1" -"@chakra-ui/provider@1.7.3": - version "1.7.3" - resolved "https://registry.yarnpkg.com/@chakra-ui/provider/-/provider-1.7.3.tgz#625c0b7c1265515399bb501bc929d8851bba2958" - integrity sha512-D1SrQ7do4yzAv9/OTF3yj/BkLm7kFo5DdeuOCyvXGpVJumnvbtjltRmC7rFQH4R+y9qXPvfQP4LKMNBqSxPNng== +"@chakra-ui/provider@1.7.4": + version "1.7.4" + resolved "https://registry.yarnpkg.com/@chakra-ui/provider/-/provider-1.7.4.tgz#c106e6efad2e38585eb978fc92d23f7c379130af" + integrity sha512-W+mut8fVk6MZx2Sgz4SSIrVVCUAFXE8/AZK3G71qFb9j/7m30zdWCsSzY9yd0XMjJF2cJvEXjEPAVYWz9BEoBA== dependencies: "@chakra-ui/css-reset" "1.1.1" - "@chakra-ui/hooks" "1.7.1" - "@chakra-ui/portal" "1.3.1" + "@chakra-ui/hooks" "1.7.2" + "@chakra-ui/portal" "1.3.2" "@chakra-ui/react-env" "1.1.1" - "@chakra-ui/system" "1.8.3" + "@chakra-ui/system" "1.9.0" "@chakra-ui/utils" "1.9.1" -"@chakra-ui/radio@1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@chakra-ui/radio/-/radio-1.4.3.tgz#d87788fe688d0d58252e9efeb926d0417a70e158" - integrity sha512-TQdyfdUD3BLklOP67n82JN8ksQv1BYjvaYsK0m6WCa0LDJr9aCC+XtUPgVq/1L2t4HqHdiGOrGBooF4vvy/+BA== +"@chakra-ui/radio@1.4.4": + version "1.4.4" + resolved "https://registry.yarnpkg.com/@chakra-ui/radio/-/radio-1.4.4.tgz#53c3629795941b142d1781a6edfaf8436ff5dc85" + integrity sha512-Tz8bl+yhD2pKHUFyNZtP056eawqOUkSA7n2qEebnoH7Zp65B9zwYHkpvL+2nhL5swBwpnGrUpuK3WOqGz4dvXA== dependencies: - "@chakra-ui/form-control" "1.5.2" - "@chakra-ui/hooks" "1.7.1" + "@chakra-ui/form-control" "1.5.3" + "@chakra-ui/hooks" "1.7.2" "@chakra-ui/react-utils" "1.2.1" "@chakra-ui/utils" "1.9.1" "@chakra-ui/visually-hidden" "1.1.1" @@ -502,83 +502,83 @@ dependencies: "@chakra-ui/utils" "^1.9.1" -"@chakra-ui/react@^1.7.3": - version "1.7.3" - resolved "https://registry.yarnpkg.com/@chakra-ui/react/-/react-1.7.3.tgz#358a3ff9847b78a798384db5c64cc222c9a48ae8" - integrity sha512-6mrfDUOa9MoQ44Xvi7xgdDq48jTTTjW9BupCGf2R3DI+z6RbUKIHzbcoDJZt2HGY6j9EarMVNRoQJzvzGUKpoQ== +"@chakra-ui/react@^1.7.4": + version "1.7.4" + resolved "https://registry.yarnpkg.com/@chakra-ui/react/-/react-1.7.4.tgz#dfeb9e2f34df3645448ee542e02390fdf5b58876" + integrity sha512-wBxfQRcIz6YGXQh3S2E6sXCVcqrVuUygMeMdkCMMfZQTI2VFLkvn6SDYzLHcm1PtMygZnF1mU30GOcmArpVotA== dependencies: - "@chakra-ui/accordion" "1.4.2" + "@chakra-ui/accordion" "1.4.3" "@chakra-ui/alert" "1.3.2" - "@chakra-ui/avatar" "1.3.1" + "@chakra-ui/avatar" "1.3.2" "@chakra-ui/breadcrumb" "1.3.1" - "@chakra-ui/button" "1.5.1" - "@chakra-ui/checkbox" "1.6.1" + "@chakra-ui/button" "1.5.2" + "@chakra-ui/checkbox" "1.6.2" "@chakra-ui/close-button" "1.2.2" "@chakra-ui/control-box" "1.1.1" - "@chakra-ui/counter" "1.2.1" + "@chakra-ui/counter" "1.2.2" "@chakra-ui/css-reset" "1.1.1" - "@chakra-ui/editable" "1.3.1" - "@chakra-ui/form-control" "1.5.2" - "@chakra-ui/hooks" "1.7.1" + "@chakra-ui/editable" "1.3.2" + "@chakra-ui/form-control" "1.5.3" + "@chakra-ui/hooks" "1.7.2" "@chakra-ui/icon" "2.0.0" - "@chakra-ui/image" "1.1.1" - "@chakra-ui/input" "1.3.2" - "@chakra-ui/layout" "1.6.0" + "@chakra-ui/image" "1.1.2" + "@chakra-ui/input" "1.3.3" + "@chakra-ui/layout" "1.7.0" "@chakra-ui/live-region" "1.1.1" - "@chakra-ui/media-query" "1.2.2" - "@chakra-ui/menu" "1.8.2" - "@chakra-ui/modal" "1.10.2" - "@chakra-ui/number-input" "1.3.2" - "@chakra-ui/pin-input" "1.7.1" - "@chakra-ui/popover" "1.11.0" + "@chakra-ui/media-query" "1.2.3" + "@chakra-ui/menu" "1.8.3" + "@chakra-ui/modal" "1.10.3" + "@chakra-ui/number-input" "1.3.3" + "@chakra-ui/pin-input" "1.7.2" + "@chakra-ui/popover" "1.11.1" "@chakra-ui/popper" "2.4.1" - "@chakra-ui/portal" "1.3.1" + "@chakra-ui/portal" "1.3.2" "@chakra-ui/progress" "1.2.1" - "@chakra-ui/provider" "1.7.3" - "@chakra-ui/radio" "1.4.3" + "@chakra-ui/provider" "1.7.4" + "@chakra-ui/radio" "1.4.4" "@chakra-ui/react-env" "1.1.1" - "@chakra-ui/select" "1.2.2" - "@chakra-ui/skeleton" "1.2.3" - "@chakra-ui/slider" "1.5.2" + "@chakra-ui/select" "1.2.3" + "@chakra-ui/skeleton" "1.2.4" + "@chakra-ui/slider" "1.5.3" "@chakra-ui/spinner" "1.2.1" "@chakra-ui/stat" "1.2.2" - "@chakra-ui/switch" "1.3.1" - "@chakra-ui/system" "1.8.3" + "@chakra-ui/switch" "1.3.2" + "@chakra-ui/system" "1.9.0" "@chakra-ui/table" "1.3.1" - "@chakra-ui/tabs" "1.6.1" + "@chakra-ui/tabs" "1.6.2" "@chakra-ui/tag" "1.2.2" - "@chakra-ui/textarea" "1.2.2" - "@chakra-ui/theme" "1.12.2" - "@chakra-ui/toast" "1.5.0" - "@chakra-ui/tooltip" "1.4.2" + "@chakra-ui/textarea" "1.2.3" + "@chakra-ui/theme" "1.12.3" + "@chakra-ui/toast" "1.5.1" + "@chakra-ui/tooltip" "1.4.3" "@chakra-ui/transition" "1.4.2" "@chakra-ui/utils" "1.9.1" "@chakra-ui/visually-hidden" "1.1.1" -"@chakra-ui/select@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@chakra-ui/select/-/select-1.2.2.tgz#1c2956c21a012e7c9ea294db42d3cab0d05bed24" - integrity sha512-EchJW3St1DtSWHe//DHwKjGsQYL2zbKcNCLnJWQKGMPZsQhAD2wsm4xjowFrV8AkY7jbVM/U2v68puN7YTC3hg== +"@chakra-ui/select@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@chakra-ui/select/-/select-1.2.3.tgz#ba08c50bec1399404473cfd3f5415eb415e21fc6" + integrity sha512-LGT8z06InjfMTQyWgQUqinucvObkO0bOR87c4swWlAESkS6w+g8PsH9UJ87NT5W+hzCybvqSfRjMHYwC9qUnrg== dependencies: - "@chakra-ui/form-control" "1.5.2" + "@chakra-ui/form-control" "1.5.3" "@chakra-ui/utils" "1.9.1" -"@chakra-ui/skeleton@1.2.3": - version "1.2.3" - resolved "https://registry.yarnpkg.com/@chakra-ui/skeleton/-/skeleton-1.2.3.tgz#f7be28e3af214473fb6cdec45d0715a049f82575" - integrity sha512-u5ASkzPiBjfvKxKuBienUfmyYDTHziSWQ8Ny6k83LbwLv9IcmBNGsSkmsp7hesgi9cMHGBQ3hY2GTqG9ljndIg== +"@chakra-ui/skeleton@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@chakra-ui/skeleton/-/skeleton-1.2.4.tgz#2d7b3eceff6c6f8f00fba8cc6e2c20cc46e62a34" + integrity sha512-j5cAwXfyb7sybk+QjSz5TlQkQVeekdRZBF4xEm4TXGGZiMSTsd9/7BOBtxopakn/YKDP1owZ4oSGZGYGNmTS8w== dependencies: - "@chakra-ui/hooks" "1.7.1" - "@chakra-ui/media-query" "1.2.2" - "@chakra-ui/system" "1.8.3" + "@chakra-ui/hooks" "1.7.2" + "@chakra-ui/media-query" "1.2.3" + "@chakra-ui/system" "1.9.0" "@chakra-ui/utils" "1.9.1" -"@chakra-ui/slider@1.5.2": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@chakra-ui/slider/-/slider-1.5.2.tgz#173218b55befe0f7200fe7f332234b3824d19b08" - integrity sha512-zP07TMew61GkJe47Nu7zEg/SUEwPHpN4alW6VUM6Y8UaVpQaDx7InarbWTc/bXdTP03SfE+hQ6WD9Oy7noe4hQ== +"@chakra-ui/slider@1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@chakra-ui/slider/-/slider-1.5.3.tgz#7288e830ce24a700ec883847748263a8084c12b8" + integrity sha512-i14b8MYlantiACI4jyjxU5PdX3Nwmz65TdINd7LywrKZu0ahE4GRXCcIGyM48vlXWfdkFhKLqLuF7+EYwLYtHA== dependencies: - "@chakra-ui/hooks" "1.7.1" + "@chakra-ui/hooks" "1.7.2" "@chakra-ui/react-utils" "1.2.1" "@chakra-ui/utils" "1.9.1" @@ -599,30 +599,30 @@ "@chakra-ui/utils" "1.9.1" "@chakra-ui/visually-hidden" "1.1.1" -"@chakra-ui/styled-system@1.15.0": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@chakra-ui/styled-system/-/styled-system-1.15.0.tgz#fe117ace12b452379e4df69f4779395ead55917f" - integrity sha512-LnsKeiYkUuJ+NMTwueiX0Mj8CW9XAMJrJxpQm/X3GY5L5PO7Hv6wW725Ovqdy4mhG3IK7S8444FthpsDv/luHw== +"@chakra-ui/styled-system@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@chakra-ui/styled-system/-/styled-system-1.16.0.tgz#afe974e9c44b98e2606e83dae7560e619dffc6fd" + integrity sha512-5vGU4eCixFMXp9u9PT+5724ptzBLP5AcFks88h19TpIevcElCkvAXw2G2CDJ0jJZM59l61nJGHIjn246f3iJUA== dependencies: "@chakra-ui/utils" "1.9.1" csstype "^3.0.9" -"@chakra-ui/switch@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@chakra-ui/switch/-/switch-1.3.1.tgz#e8f411f0645f79b828b5f865684028032ad7647d" - integrity sha512-92hXJ2/ozj7B3cJNT259mFNoad7Ck892uHTuEQ/GIdXb25doE6F1wCp0TreOnGiEgU5YSaxpdrcZjA0QODP//w== +"@chakra-ui/switch@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/switch/-/switch-1.3.2.tgz#8455249589cc321ea348bcf5af6ebd84e44de348" + integrity sha512-aqhAq93DW97qD/KTBiWe2ip64vxSkN/qimMRFdG4xqtS2DxGeicQiv7Eis3NgAq2xIMM9XOoeXutU4kGkha1+w== dependencies: - "@chakra-ui/checkbox" "1.6.1" + "@chakra-ui/checkbox" "1.6.2" "@chakra-ui/utils" "1.9.1" -"@chakra-ui/system@1.8.3": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@chakra-ui/system/-/system-1.8.3.tgz#bad447f4fda427fc28e234470d9fcc5a9b524d62" - integrity sha512-6MaevsT7A2ifgOGQQCQsfvzPVd0kEXqFrX1Oxd842bawaqthmbFdo2bBTdaia/+Ivq/8Xot2uAQSbU+3NuRiUA== +"@chakra-ui/system@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@chakra-ui/system/-/system-1.9.0.tgz#22f530fd0cb16c20e50abe2bb7c1392d2995382a" + integrity sha512-CnLmx3nVZo87puSKxDNNQUwJyWYCnx4ZUFXdDFNdKroQyZUpSYLVv1OniXbkjwEt1YdZMsWm93lZQb/0VRcKvg== dependencies: - "@chakra-ui/color-mode" "1.3.2" + "@chakra-ui/color-mode" "1.3.3" "@chakra-ui/react-utils" "1.2.1" - "@chakra-ui/styled-system" "1.15.0" + "@chakra-ui/styled-system" "1.16.0" "@chakra-ui/utils" "1.9.1" react-fast-compare "3.2.0" @@ -633,14 +633,14 @@ dependencies: "@chakra-ui/utils" "1.9.1" -"@chakra-ui/tabs@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@chakra-ui/tabs/-/tabs-1.6.1.tgz#362350b10f2fc34b5bbbca960075eddd022e3ff6" - integrity sha512-p7HdHcleJWNwteWYVPt2KF52YbS5pIIfs/IpgtnYZRsJbqvRVxSwgg5Wsn+vuxFXBKW0cA2rDGbyzsZ+ChtEXQ== +"@chakra-ui/tabs@1.6.2": + version "1.6.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/tabs/-/tabs-1.6.2.tgz#d17f43c81d8e718b378f6e891151e150c9d344e7" + integrity sha512-J0OY4sEhZW0jxlj4MkotLiD0/snMk7IsqvDxUB17MxuFRs5ytUssHzCqO7fexH7fSfd54ITNoUIns6Ir2ueCsA== dependencies: "@chakra-ui/clickable" "1.2.1" "@chakra-ui/descendant" "2.1.1" - "@chakra-ui/hooks" "1.7.1" + "@chakra-ui/hooks" "1.7.2" "@chakra-ui/react-utils" "1.2.1" "@chakra-ui/utils" "1.9.1" @@ -652,12 +652,12 @@ "@chakra-ui/icon" "2.0.0" "@chakra-ui/utils" "1.9.1" -"@chakra-ui/textarea@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@chakra-ui/textarea/-/textarea-1.2.2.tgz#3e62612e4b1bc0724ba084b0b08b247ac2bbdbab" - integrity sha512-DoLdKxHk0DyrQDnj1la9wjl2AW3/SK62nfWDYLAm0ouFsw1VKPw9nU+Yyj0dPruQTzI19nLaYF26i97rtnT27g== +"@chakra-ui/textarea@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@chakra-ui/textarea/-/textarea-1.2.3.tgz#e6da85fdde0ad7fc68944662564e12e982262349" + integrity sha512-yLObhuSnIX11GyjsiEIC2gFTDtUoGSpHUqHRD8nF9BmuePHqFzG3jdkBrFMd09u0Ee6kr6o0tia6g9Wt29TyQQ== dependencies: - "@chakra-ui/form-control" "1.5.2" + "@chakra-ui/form-control" "1.5.3" "@chakra-ui/utils" "1.9.1" "@chakra-ui/theme-tools@1.3.1", "@chakra-ui/theme-tools@^1.3.1": @@ -668,36 +668,36 @@ "@chakra-ui/utils" "1.9.1" "@ctrl/tinycolor" "^3.4.0" -"@chakra-ui/theme@1.12.2": - version "1.12.2" - resolved "https://registry.yarnpkg.com/@chakra-ui/theme/-/theme-1.12.2.tgz#191e168d83e7a66bc3e65be802ad4e4e2a9bbeb5" - integrity sha512-LVjSf16yYHD40ILrsDEd3idVQRvJSY7JY8lvTGWo2p6v+JQESWF+zXlYi9Le+TXRpZuFvJuuQ1SEvoqVwdcJ8Q== +"@chakra-ui/theme@1.12.3": + version "1.12.3" + resolved "https://registry.yarnpkg.com/@chakra-ui/theme/-/theme-1.12.3.tgz#842fcb4dba01179c05c7365eb33486da10ef2b6d" + integrity sha512-aqMGSfQLYOrcWBKaD5GuVYrpI5Zoq4Gt3D9P+drB/CDTRgBLWuJI1rbKOSSSJUK4RNZ0WbakPwz6wXiVS3vVdQ== dependencies: "@chakra-ui/anatomy" "1.2.1" "@chakra-ui/theme-tools" "1.3.1" "@chakra-ui/utils" "1.9.1" -"@chakra-ui/toast@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@chakra-ui/toast/-/toast-1.5.0.tgz#c6456c0a4f24669e16946de318ad568e24a5d497" - integrity sha512-rTsFx/Qos5oVPN6aZMbT/wTxwZlFNSXQqrTpJYaRcRFQGzxIDDxmGkKYfPnyJjRP9i6EqynJhXEIyhMA0xO0dw== +"@chakra-ui/toast@1.5.1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@chakra-ui/toast/-/toast-1.5.1.tgz#47058ee5fcc0ded1ab31bcdc86a5344256dbfdb2" + integrity sha512-cynOM/mGqf/dPulYOQMcpQnbf8pQWV2SEz1ymW1Nni1hh6zCqW6+pI+YeMxeadJLAwohnRumwzLsRiSL4l+YRQ== dependencies: "@chakra-ui/alert" "1.3.2" "@chakra-ui/close-button" "1.2.2" - "@chakra-ui/hooks" "1.7.1" - "@chakra-ui/theme" "1.12.2" + "@chakra-ui/hooks" "1.7.2" + "@chakra-ui/theme" "1.12.3" "@chakra-ui/transition" "1.4.2" "@chakra-ui/utils" "1.9.1" "@reach/alert" "0.13.2" -"@chakra-ui/tooltip@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@chakra-ui/tooltip/-/tooltip-1.4.2.tgz#fce61c7ad4c3e6e5833487ddf75f03c774913fb9" - integrity sha512-+wyYXG8qenKkFy2YSFfOBf3rlWADnu6S9EUxP+3Rmm78unOWXDuTJWzqy2QlXs2BwoQoifaz1LVwzmMb7WLVgQ== +"@chakra-ui/tooltip@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@chakra-ui/tooltip/-/tooltip-1.4.3.tgz#0fa58d711799b438425f094ae4f04abfa8096649" + integrity sha512-d+JsT65LPYFoGEfmqvqa3xDzW1enBdAHns3GYoHnie92pLseMKQYJsITO5SmwNGnEiOHbJ8pkB/hggo+xHKkpg== dependencies: - "@chakra-ui/hooks" "1.7.1" + "@chakra-ui/hooks" "1.7.2" "@chakra-ui/popper" "2.4.1" - "@chakra-ui/portal" "1.3.1" + "@chakra-ui/portal" "1.3.2" "@chakra-ui/react-utils" "1.2.1" "@chakra-ui/utils" "1.9.1" "@chakra-ui/visually-hidden" "1.1.1" @@ -984,17 +984,6 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@jest/types@^27.4.2": - version "27.4.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.4.2.tgz#96536ebd34da6392c2b7c7737d693885b5dd44a5" - integrity sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^16.0.0" - chalk "^4.0.0" - "@napi-rs/triples@1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@napi-rs/triples/-/triples-1.0.3.tgz#76d6d0c3f4d16013c61e45dfca5ff1e6c31ae53c" @@ -1169,9 +1158,9 @@ integrity sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ== "@popperjs/core@^2.9.0", "@popperjs/core@^2.9.3": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.0.tgz#6734f8ebc106a0860dff7f92bf90df193f0935d7" - integrity sha512-zrsUxjLOKAzdewIDRWy9nsV1GQsKBCWaGwsZQlCgr6/q+vjyZhFgqedLfFBuI9anTPEUT4APq9Mu0SZBTzIcGQ== + version "2.11.2" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.2.tgz#830beaec4b4091a9e9398ac50f865ddea52186b9" + integrity sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA== "@prisma/client@^3.7.0": version "3.7.0" @@ -1252,10 +1241,10 @@ magic-string "^0.25.7" resolve "^1.17.0" -"@rollup/plugin-node-resolve@^13.1.1": - version "13.1.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.1.1.tgz#d38ba06e7b181ab4df64c75409b43d9bdc95ae34" - integrity sha512-6QKtRevXLrmEig9UiMYt2fSvee9TyltGRfw+qSs6xjUnxwjOzTOqy+/Lpxsgjb8mJn1EQNbCDAvt89O4uzL5kw== +"@rollup/plugin-node-resolve@^13.1.3": + version "13.1.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.1.3.tgz#2ed277fb3ad98745424c1d2ba152484508a92d79" + integrity sha512-BdxNk+LtmElRo5d06MGY4zoepyrXX1tkzX2hrnPEZ53k78GuOMWLqmJDGIIOPwVRIFZrLQOo+Yr6KtCuLIA0AQ== dependencies: "@rollup/pluginutils" "^3.1.0" "@types/resolve" "1.17.1" @@ -1453,19 +1442,19 @@ integrity sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw== "@types/node@*", "@types/node@>=8.1.0", "@types/node@^17.0.4": - version "17.0.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.5.tgz#57ca67ec4e57ad9e4ef5a6bab48a15387a1c83e0" - integrity sha512-w3mrvNXLeDYV1GKTZorGJQivK6XLCoGwpnyJFbJVK/aTBQUxOCaa/GlFAAN3OTDFcb7h5tiFG+YXCO2By+riZw== + version "17.0.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.8.tgz#50d680c8a8a78fe30abe6906453b21ad8ab0ad7b" + integrity sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg== "@types/node@^14.14.31": - version "14.18.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.3.tgz#b3682cfd9d5542b025df13233d073cb4347f63f3" - integrity sha512-GtTH2crF4MtOIrrAa+jgTV9JX/PfoUCYr6MiZw7O/dkZu5b6gm5dc1nAL0jwGo4ortSBBtGyeVaxdC8X6V+pLg== + version "14.18.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.5.tgz#0dd636fe7b2c6055cbed0d4ca3b7fb540f130a96" + integrity sha512-LMy+vDDcQR48EZdEx5wRX1q/sEl6NdGuHXPnfeL8ixkwCOSZ2qnIyIZmcCbdX0MeRqHhAcHmX+haCbrS8Run+A== "@types/node@^16.11.9": - version "16.11.17" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.17.tgz#ae146499772e33fc6382e1880bc567e41a528586" - integrity sha512-C1vTZME8cFo8uxY2ui41xcynEotVkczIVI5AjLmy5pkpBv/FtG+jhtOlfcPysI8VRVwoOMv6NJm44LGnoMSWkw== + version "16.11.19" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.19.tgz#1afa165146997b8286b6eabcb1c2d50729055169" + integrity sha512-BPAcfDPoHlRQNKktbsbnpACGdypPFBuX4xQlsWDE7B8XXcfII+SpOLay3/qZmCLb39kV5S1RTYwXdkx2lwLYng== "@types/nprogress@^0.2.0": version "0.2.0" @@ -1515,7 +1504,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^17.0.37", "@types/react@^17.0.38": +"@types/react@*", "@types/react@^17.0.38": version "17.0.38" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.38.tgz#f24249fefd89357d5fa71f739a686b8d7c7202bd" integrity sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ== @@ -1587,13 +1576,6 @@ dependencies: "@types/yargs-parser" "*" -"@types/yargs@^16.0.0": - version "16.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" - integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== - dependencies: - "@types/yargs-parser" "*" - "@types/yauzl@^2.9.1": version "2.9.2" resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.2.tgz#c48e5d56aff1444409e39fa164b0b4d4552a7b7a" @@ -1601,13 +1583,14 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^5.8.0": - version "5.8.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.8.1.tgz#97dfaa39f38e99f86801fdf34f9f1bed66704258" - integrity sha512-wTZ5oEKrKj/8/366qTM366zqhIKAp6NCMweoRONtfuC07OAU9nVI2GZZdqQ1qD30WAAtcPdkH+npDwtRFdp4Rw== +"@typescript-eslint/eslint-plugin@^5.9.0": + version "5.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz#382182d5cb062f52aac54434cfc47c28898c8006" + integrity sha512-qT4lr2jysDQBQOPsCCvpPUZHjbABoTJW8V9ZzIYKHMfppJtpdtzszDYsldwhFxlhvrp7aCHeXD1Lb9M1zhwWwQ== dependencies: - "@typescript-eslint/experimental-utils" "5.8.1" - "@typescript-eslint/scope-manager" "5.8.1" + "@typescript-eslint/experimental-utils" "5.9.0" + "@typescript-eslint/scope-manager" "5.9.0" + "@typescript-eslint/type-utils" "5.9.0" debug "^4.3.2" functional-red-black-tree "^1.0.1" ignore "^5.1.8" @@ -1615,60 +1598,69 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/experimental-utils@5.8.1": - version "5.8.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.8.1.tgz#01861eb2f0749f07d02db342b794145a66ed346f" - integrity sha512-fbodVnjIDU4JpeXWRDsG5IfIjYBxEvs8EBO8W1+YVdtrc2B9ppfof5sZhVEDOtgTfFHnYQJDI8+qdqLYO4ceww== +"@typescript-eslint/experimental-utils@5.9.0": + version "5.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.0.tgz#652762d37d6565ef07af285021b8347b6c79a827" + integrity sha512-ZnLVjBrf26dn7ElyaSKa6uDhqwvAi4jBBmHK1VxuFGPRAxhdi18ubQYSGA7SRiFiES3q9JiBOBHEBStOFkwD2g== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.8.1" - "@typescript-eslint/types" "5.8.1" - "@typescript-eslint/typescript-estree" "5.8.1" + "@typescript-eslint/scope-manager" "5.9.0" + "@typescript-eslint/types" "5.9.0" + "@typescript-eslint/typescript-estree" "5.9.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" "@typescript-eslint/parser@^5.0.0": - version "5.8.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.8.1.tgz#380f5f1e596b540059998aa3fc80d78f0f9b0d0a" - integrity sha512-K1giKHAjHuyB421SoXMXFHHVI4NdNY603uKw92++D3qyxSeYvC10CBJ/GE5Thpo4WTUvu1mmJI2/FFkz38F2Gw== + version "5.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.9.0.tgz#fdbb08767a4caa6ca6ccfed5f9ffe9387f0c7d97" + integrity sha512-/6pOPz8yAxEt4PLzgbFRDpZmHnXCeZgPDrh/1DaVKOjvn/UPMlWhbx/gA96xRi2JxY1kBl2AmwVbyROUqys5xQ== dependencies: - "@typescript-eslint/scope-manager" "5.8.1" - "@typescript-eslint/types" "5.8.1" - "@typescript-eslint/typescript-estree" "5.8.1" + "@typescript-eslint/scope-manager" "5.9.0" + "@typescript-eslint/types" "5.9.0" + "@typescript-eslint/typescript-estree" "5.9.0" debug "^4.3.2" -"@typescript-eslint/scope-manager@5.8.1": - version "5.8.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.8.1.tgz#7fc0604f7ade8833e4d42cebaa1e2debf8b932e4" - integrity sha512-DGxJkNyYruFH3NIZc3PwrzwOQAg7vvgsHsHCILOLvUpupgkwDZdNq/cXU3BjF4LNrCsVg0qxEyWasys5AiJ85Q== +"@typescript-eslint/scope-manager@5.9.0": + version "5.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.9.0.tgz#02dfef920290c1dcd7b1999455a3eaae7a1a3117" + integrity sha512-DKtdIL49Qxk2a8icF6whRk7uThuVz4A6TCXfjdJSwOsf+9ree7vgQWcx0KOyCdk0i9ETX666p4aMhrRhxhUkyg== dependencies: - "@typescript-eslint/types" "5.8.1" - "@typescript-eslint/visitor-keys" "5.8.1" + "@typescript-eslint/types" "5.9.0" + "@typescript-eslint/visitor-keys" "5.9.0" -"@typescript-eslint/types@5.8.1": - version "5.8.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.8.1.tgz#04c6b49ebc8c99238238a6b8b43f2fc613983b5a" - integrity sha512-L/FlWCCgnjKOLefdok90/pqInkomLnAcF9UAzNr+DSqMC3IffzumHTQTrINXhP1gVp9zlHiYYjvozVZDPleLcA== +"@typescript-eslint/type-utils@5.9.0": + version "5.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.9.0.tgz#fd5963ead04bc9b7af9c3a8e534d8d39f1ce5f93" + integrity sha512-uVCb9dJXpBrK1071ri5aEW7ZHdDHAiqEjYznF3HSSvAJXyrkxGOw2Ejibz/q6BXdT8lea8CMI0CzKNFTNI6TEQ== + dependencies: + "@typescript-eslint/experimental-utils" "5.9.0" + debug "^4.3.2" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.9.0": + version "5.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.9.0.tgz#e5619803e39d24a03b3369506df196355736e1a3" + integrity sha512-mWp6/b56Umo1rwyGCk8fPIzb9Migo8YOniBGPAQDNC6C52SeyNGN4gsVwQTAR+RS2L5xyajON4hOLwAGwPtUwg== -"@typescript-eslint/typescript-estree@5.8.1": - version "5.8.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.8.1.tgz#a592855be688e7b729a1e9411d7d74ec992ed6ef" - integrity sha512-26lQ8l8tTbG7ri7xEcCFT9ijU5Fk+sx/KRRyyzCv7MQ+rZZlqiDPtMKWLC8P7o+dtCnby4c+OlxuX1tp8WfafQ== +"@typescript-eslint/typescript-estree@5.9.0": + version "5.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.0.tgz#0e5c6f03f982931abbfbc3c1b9df5fbf92a3490f" + integrity sha512-kxo3xL2mB7XmiVZcECbaDwYCt3qFXz99tBSuVJR4L/sR7CJ+UNAPrYILILktGj1ppfZ/jNt/cWYbziJUlHl1Pw== dependencies: - "@typescript-eslint/types" "5.8.1" - "@typescript-eslint/visitor-keys" "5.8.1" + "@typescript-eslint/types" "5.9.0" + "@typescript-eslint/visitor-keys" "5.9.0" debug "^4.3.2" globby "^11.0.4" is-glob "^4.0.3" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/visitor-keys@5.8.1": - version "5.8.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.8.1.tgz#58a2c566265d5511224bc316149890451c1bbab0" - integrity sha512-SWgiWIwocK6NralrJarPZlWdr0hZnj5GXHIgfdm8hNkyKvpeQuFyLP6YjSIe9kf3YBIfU6OHSZLYkQ+smZwtNg== +"@typescript-eslint/visitor-keys@5.9.0": + version "5.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.0.tgz#7585677732365e9d27f1878150fab3922784a1a6" + integrity sha512-6zq0mb7LV0ThExKlecvpfepiB+XEtFv/bzx7/jKSgyXTFD7qjmSu1FoiS0x3OZaiS+UIXpH2vd9O89f02RCtgw== dependencies: - "@typescript-eslint/types" "5.8.1" + "@typescript-eslint/types" "5.9.0" eslint-visitor-keys "^3.0.0" "@udecode/plate-autoformat@^9.0.0": @@ -2053,27 +2045,27 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -autoprefixer@^10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.0.tgz#c3577eb32a1079a440ec253e404eaf1eb21388c8" - integrity sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA== +autoprefixer@^10.4.1: + version "10.4.1" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.1.tgz#1735959d6462420569bc42408016acbc56861c12" + integrity sha512-B3ZEG7wtzXDRCEFsan7HmR2AeNsxdJB0+sEC0Hc5/c2NbhJqPwuZm+tn233GBVw82L+6CtD6IPSfVruwKjfV3A== dependencies: - browserslist "^4.17.5" - caniuse-lite "^1.0.30001272" - fraction.js "^4.1.1" + browserslist "^4.19.1" + caniuse-lite "^1.0.30001294" + fraction.js "^4.1.2" normalize-range "^0.1.2" picocolors "^1.0.0" - postcss-value-parser "^4.1.0" + postcss-value-parser "^4.2.0" available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== -aws-sdk@^2.1048.0: - version "2.1048.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1048.0.tgz#02f2f35e0f51dd4510462e05c7a48fd4649d33f8" - integrity sha512-mVwWo+Udiuc/yEZ/DgJQGqOEtfiQjgUdtshx/t6ISe3+jW3TF9hUACwADwx2Sr/fuJyyJ3QD5JYLt5Cw35wQpA== +aws-sdk@^2.1051.0: + version "2.1051.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1051.0.tgz#ce7fc1fd08a984b0710268c5eff707ce32d8fe86" + integrity sha512-SqXimyuyANw2fozbyxR8qNZPN9c/tsVkxq812nMVTApym+7t+h/LcWW1rfPm/EzgTEnrPV9v3a25L/8mXvN5Vg== dependencies: buffer "4.9.2" events "1.1.1" @@ -2273,7 +2265,7 @@ browserslist@4.16.6: escalade "^3.1.1" node-releases "^1.1.71" -browserslist@^4.0.0, browserslist@^4.16.0, browserslist@^4.16.6, browserslist@^4.17.5: +browserslist@^4.0.0, browserslist@^4.16.0, browserslist@^4.16.6, browserslist@^4.19.1: version "4.19.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== @@ -2374,10 +2366,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001202, caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001228, caniuse-lite@^1.0.30001272, caniuse-lite@^1.0.30001286: - version "1.0.30001292" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001292.tgz#4a55f61c06abc9595965cfd77897dc7bc1cdc456" - integrity sha512-jnT4Tq0Q4ma+6nncYQVe7d73kmDmE9C3OGTx3MvW7lBM/eY1S1DZTMBON7dqV481RhNiS5OxD7k9JQvmDOTirw== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001202, caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001228, caniuse-lite@^1.0.30001286, caniuse-lite@^1.0.30001294: + version "1.0.30001296" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001296.tgz#d99f0f3bee66544800b93d261c4be55a35f1cec8" + integrity sha512-WfrtPEoNSoeATDlf4y3QvkwiELl9GyPLISV5GejTbbQRtQx4LhsXmc9IQ6XCL2d7UxCyEzToEZNMeqR79OUw8Q== caseless@~0.12.0: version "0.12.0" @@ -2642,9 +2634,9 @@ copy-to-clipboard@3.3.1, copy-to-clipboard@^3.3.1: toggle-selection "^1.0.6" core-js-pure@^3.19.0: - version "3.20.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.20.1.tgz#f7a2c62f98de83e4da8fca7b78846d3a2f542145" - integrity sha512-yeNNr3L9cEBwNy6vhhIJ0nko7fE7uFO6PgawcacGt2VWep4WqQx0RiqlkgSP7kqUMC1IKdfO9qPeWXcUheHLVQ== + version "3.20.2" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.20.2.tgz#5d263565f0e34ceeeccdc4422fae3e84ca6b8c0f" + integrity sha512-CmWHvSKn2vNL6p6StNp1EmMIfVY/pqn3JLAjfZQ8WZGPOlGoO92EkX9/Mk81i6GxvoPXjUqEQnpM3rJ5QxxIOg== core-util-is@1.0.2: version "1.0.2" @@ -3190,9 +3182,9 @@ ecc-jsbn@~0.1.1: safer-buffer "^2.1.0" electron-to-chromium@^1.3.723, electron-to-chromium@^1.4.17: - version "1.4.28" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.28.tgz#fef0e92e281df6d568f482d8d53c34ca5374de48" - integrity sha512-Gzbf0wUtKfyPaqf0Plz+Ctinf9eQIzxEqBHwSvbGfeOm9GMNdLxyu1dNiCUfM+x6r4BE0xUJNh3Nmg9gfAtTmg== + version "1.4.36" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.36.tgz#446c6184dbe5baeb5eae9a875490831e4bc5319a" + integrity sha512-MbLlbF39vKrXWlFEFpCgDHwdlz4O3LmHM5W4tiLRHjSmEUXjJjz8sZkMgWgvYxlZw3N1iDTmCEtOkkESb5TMCg== elliptic@^6.5.3: version "6.5.4" @@ -3369,14 +3361,13 @@ eslint-import-resolver-typescript@^2.4.0: resolve "^1.20.0" tsconfig-paths "^3.9.0" -eslint-module-utils@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz#b435001c9f8dd4ab7f6d0efcae4b9696d4c24b7c" - integrity sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ== +eslint-module-utils@^2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz#1d0aa455dcf41052339b63cada8ab5fd57577129" + integrity sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg== dependencies: debug "^3.2.7" find-up "^2.1.0" - pkg-dir "^2.0.0" eslint-plugin-cypress@^2.12.1: version "2.12.1" @@ -3386,23 +3377,23 @@ eslint-plugin-cypress@^2.12.1: globals "^11.12.0" eslint-plugin-import@^2.25.2: - version "2.25.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.3.tgz#a554b5f66e08fb4f6dc99221866e57cfff824766" - integrity sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg== + version "2.25.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz#322f3f916a4e9e991ac7af32032c25ce313209f1" + integrity sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA== dependencies: array-includes "^3.1.4" array.prototype.flat "^1.2.5" debug "^2.6.9" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.1" + eslint-module-utils "^2.7.2" has "^1.0.3" is-core-module "^2.8.0" is-glob "^4.0.3" minimatch "^3.0.4" object.values "^1.1.5" resolve "^1.20.0" - tsconfig-paths "^3.11.0" + tsconfig-paths "^3.12.0" eslint-plugin-jsx-a11y@^6.5.1: version "6.5.1" @@ -3840,7 +3831,7 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -fraction.js@^4.1.1: +fraction.js@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.2.tgz#13e420a92422b6cf244dff8690ed89401029fbe8" integrity sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA== @@ -4027,9 +4018,9 @@ globby@^11.0.4: slash "^3.0.0" graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: - version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== has-bigints@^1.0.1: version "1.0.1" @@ -4237,7 +4228,7 @@ immer@9.0.6: resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.6.tgz#7a96bf2674d06c8143e327cbf73539388ddf1a73" integrity sha512-G95ivKpy+EvVAnAab4fVa4YGYn24J1SpEktnJX7JJ45Bd7xqME/SCplFzYFmTbrkwZbQ4xJK1xMTUYBkN6pWsQ== -immer@^9.0.6: +immer@^9.0.6, immer@^9.0.7: version "9.0.7" resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.7.tgz#b6156bd7db55db7abc73fd2fdadf4e579a701075" integrity sha512-KGllzpbamZDvOIxnmJ0jI840g7Oikx58lBPWV0hUh7dtAyZpFqqrBZdKka5GlTwMTZ1Tjc/bKKW4VSFAt6BqMA== @@ -4711,7 +4702,7 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -lilconfig@^2.0.3: +lilconfig@^2.0.3, lilconfig@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== @@ -4722,16 +4713,16 @@ lines-and-columns@^1.1.6: integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== listr2@^3.8.3: - version "3.13.5" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.13.5.tgz#105a813f2eb2329c4aae27373a281d610ee4985f" - integrity sha512-3n8heFQDSk+NcwBn3CgxEibZGaRzx+pC64n3YjpMD1qguV4nWus3Al+Oo3KooqFKTQEJ1v7MmnbnyyNspgx3NA== + version "3.14.0" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== dependencies: cli-truncate "^2.1.0" colorette "^2.0.16" log-update "^4.0.0" p-map "^4.0.0" rfdc "^1.3.0" - rxjs "^7.4.0" + rxjs "^7.5.1" through "^2.3.8" wrap-ansi "^7.0.0" @@ -5510,7 +5501,7 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6: +path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== @@ -5554,9 +5545,9 @@ picocolors@^1.0.0: integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pidtree@^0.3.0: version "0.3.1" @@ -5578,13 +5569,6 @@ pify@^5.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" - pkg-dir@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" @@ -5608,9 +5592,9 @@ popmotion@9.3.6: tslib "^2.1.0" postcss-calc@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.0.0.tgz#a05b87aacd132740a5db09462a3612453e5df90a" - integrity sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g== + version "8.1.0" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.1.0.tgz#646a67bc47ef98d5b1ae3c2f944830d04a5fd6a7" + integrity sha512-XaJ+DArhRtRAzI+IqjRNTM0i4NFKkMK5StepwynfrF27UfO6/oMaELSVDE4f9ndLHyaO4aDKUwfQKVmje/BzCg== dependencies: postcss-selector-parser "^6.0.2" postcss-value-parser "^4.0.2" @@ -5652,21 +5636,19 @@ postcss-discard-overridden@^5.0.1: resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz#454b41f707300b98109a75005ca4ab0ff2743ac6" integrity sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q== -postcss-js@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-3.0.3.tgz#2f0bd370a2e8599d45439f6970403b5873abda33" - integrity sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw== +postcss-js@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.0.tgz#31db79889531b80dc7bc9b0ad283e418dce0ac00" + integrity sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ== dependencies: camelcase-css "^2.0.1" - postcss "^8.1.6" postcss-load-config@^3.0.0, postcss-load-config@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.0.tgz#d39c47091c4aec37f50272373a6a648ef5e97829" - integrity sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g== + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.1.tgz#2f53a17f2f543d9e63864460af42efdac0d41f87" + integrity sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg== dependencies: - import-cwd "^3.0.0" - lilconfig "^2.0.3" + lilconfig "^2.0.4" yaml "^1.10.2" postcss-merge-longhand@^5.0.4: @@ -5898,7 +5880,7 @@ postcss@8.2.15: nanoid "^3.1.23" source-map "^0.6.1" -postcss@^8.1.6, postcss@^8.4.5: +postcss@^8.4.5: version "8.4.5" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== @@ -5952,11 +5934,10 @@ pretty-format@^26.6.2: react-is "^17.0.1" pretty-format@^27.0.2: - version "27.4.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.4.2.tgz#e4ce92ad66c3888423d332b40477c87d1dac1fb8" - integrity sha512-p0wNtJ9oLuvgOQDEIZ9zQjZffK7KtyR6Si0jnXULIDwrlNF8Cuir3AZP0hHv0jmKuNN/edOnbMjnzd4uTcmWiw== + version "27.4.6" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.4.6.tgz#1b784d2f53c68db31797b2348fa39b49e31846b7" + integrity sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g== dependencies: - "@jest/types" "^27.4.2" ansi-regex "^5.0.1" ansi-styles "^5.0.0" react-is "^17.0.1" @@ -5994,9 +5975,9 @@ promise.series@^0.2.0: integrity sha1-LMfr6Vn8OmYZwEq029yeRS2GS70= prop-types@^15.6.2, prop-types@^15.7.2: - version "15.8.0" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.0.tgz#d237e624c45a9846e469f5f31117f970017ff588" - integrity sha512-fDGekdaHh65eI3lMi5OnErU6a8Ighg2KjcjQxO7m8VHyWjcPyj5kiOgV1LQDOOOgVy3+5FgjXvdSSX7B8/5/4g== + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" object-assign "^4.1.1" @@ -6255,9 +6236,9 @@ react-universal-interface@^0.6.2: integrity sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw== react-use@^17.1.1: - version "17.3.1" - resolved "https://registry.yarnpkg.com/react-use/-/react-use-17.3.1.tgz#12b248555775519aa2b900b22f1928d029bf99d1" - integrity sha512-hs7+tS4rRm1QLHPfanLCqXIi632tP4V7Sai1ENUP2WTufU6am++tU9uSw9YrNCFqbABiEv0ndKU1XCUcfu2tXA== + version "17.3.2" + resolved "https://registry.yarnpkg.com/react-use/-/react-use-17.3.2.tgz#448abf515f47c41c32455024db28167cb6e53be8" + integrity sha512-bj7OD0/1wL03KyWmzFXAFe425zziuTf7q8olwCYBfOeFHY1qfO1FAMjROQLsLZYwG4Rx63xAfb7XAbBrJsZmEw== dependencies: "@types/js-cookie" "^2.2.6" "@xobotyi/scrollbar-width" "^1.9.5" @@ -6390,12 +6371,13 @@ resolve-from@^5.0.0: integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve@^1.10.0, resolve@^1.12.0, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + version "1.21.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.21.0.tgz#b51adc97f3472e6a5cf4444d34bc9d6b9037591f" + integrity sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA== dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" + is-core-module "^2.8.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" resolve@^2.0.0-next.3: version "2.0.0-next.3" @@ -6495,10 +6477,10 @@ rollup-pluginutils@^2.8.2: dependencies: estree-walker "^0.6.1" -rollup@^2.62.0: - version "2.62.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.62.0.tgz#9e640b419fc5b9e0241844f6d55258bd79986ecc" - integrity sha512-cJEQq2gwB0GWMD3rYImefQTSjrPYaC6s4J9pYqnstVLJ1CHa/aZNVkD4Epuvg4iLeMA4KRiq7UM7awKK6j7jcw== +rollup@^2.63.0: + version "2.63.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.63.0.tgz#fe2f7fec2133f3fab9e022b9ac245628d817c6bb" + integrity sha512-nps0idjmD+NXl6OREfyYXMn/dar3WGcyKn+KBzPdaLecub3x/LrId0wUcthcr8oZUAcZAR8NKcfGGFlNgGL1kQ== optionalDependencies: fsevents "~2.3.2" @@ -6516,7 +6498,7 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^7.4.0: +rxjs@^7.5.1: version "7.5.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.1.tgz#af73df343cbcab37628197f43ea0c8256f54b157" integrity sha512-KExVEeZWxMZnZhUZtsJcFwz8IvPvgu4G2Z2QyqjZQzUGr32KDYuSxrEYO4w3tFFNbfLozcrKUTvTPi+E9ywJkQ== @@ -6714,7 +6696,7 @@ slate-react@^0.72.1: scroll-into-view-if-needed "^2.2.20" tiny-invariant "1.0.6" -slate@^0.72.0: +slate@^0.72.3: version "0.72.3" resolved "https://registry.yarnpkg.com/slate/-/slate-0.72.3.tgz#c74eb85133b975b2d44d219462c127cdb992e76b" integrity sha512-ALsYQHKTN4rC+iHnOJzV+aC4AHdhoPkBWrfEK3W/LbXOzPrR+wL80a66OZiYg9Xb0QeGzlLSGdOOFQd2ix9Wmg== @@ -7095,6 +7077,11 @@ supports-color@^8.0.0, supports-color@^8.1.1: dependencies: has-flag "^4.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + svg-round-corners@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/svg-round-corners/-/svg-round-corners-0.3.0.tgz#f5eea0526fdb7d2d8d763382e1953d4e09f27165" @@ -7121,9 +7108,9 @@ swr@^1.1.2: integrity sha512-UsM0eo5T+kRPyWFZtWRx2XR5qzohs/LS4lDC0GCyLpCYFmsfTk28UCVDbOE9+KtoXY4FnwHYiF+ZYEU3hnJ1lQ== table@^6.0.9: - version "6.7.5" - resolved "https://registry.yarnpkg.com/table/-/table-6.7.5.tgz#f04478c351ef3d8c7904f0e8be90a1b62417d238" - integrity sha512-LFNeryOqiQHqCVKzhkymKwt6ozeRhlm8IL1mE8rNUurkir4heF6PzMyRgaTa4tlyPTGGgXuvVOF/OLWiH09Lqw== + version "6.8.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" + integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== dependencies: ajv "^8.0.1" lodash.truncate "^4.4.2" @@ -7131,10 +7118,10 @@ table@^6.0.9: string-width "^4.2.3" strip-ansi "^6.0.1" -tailwindcss@^3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.0.8.tgz#6c751c3d2ee8e1fa18b108303b73f44a5e868992" - integrity sha512-Yww1eRYO1AxITJmW/KduZPxNvYdHuedeKwPju9Oakp7MdiixRi5xkpLhirsc81QCxHL0eoce6qKmxXwYGt4Cjw== +tailwindcss@^3.0.11: + version "3.0.11" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.0.11.tgz#c4e96cada1f693cba66269eef80c74d22331c767" + integrity sha512-JyMsQ2kPqpOvG8ow535XpauXj3wz3nQqcy2tVlXj4FQ0eNlsdzvlAqpRA3q5rPLboWirNG6r2DqKczwjW2uc8Q== dependencies: arg "^5.0.1" chalk "^4.1.2" @@ -7149,14 +7136,13 @@ tailwindcss@^3.0.8: is-glob "^4.0.3" normalize-path "^3.0.0" object-hash "^2.2.0" - postcss-js "^3.0.3" + postcss-js "^4.0.0" postcss-load-config "^3.1.0" postcss-nested "5.0.6" postcss-selector-parser "^6.0.7" postcss-value-parser "^4.2.0" quick-lru "^5.1.1" resolve "^1.20.0" - tmp "^0.2.1" tapable@^2.2.0: version "2.2.1" @@ -7231,7 +7217,7 @@ tippy.js@^6.3.1: dependencies: "@popperjs/core" "^2.9.0" -tmp@^0.2.1, tmp@~0.2.1: +tmp@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== @@ -7298,7 +7284,7 @@ ts-node@^10.4.0: make-error "^1.1.1" yn "3.1.1" -tsconfig-paths@^3.11.0, tsconfig-paths@^3.9.0: +tsconfig-paths@^3.12.0, tsconfig-paths@^3.9.0: version "3.12.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz#19769aca6ee8f6a1a341e38c8fa45dd9fb18899b" integrity sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg== @@ -7517,6 +7503,11 @@ use-deep-compare@1.1.0: dependencies: dequal "1.0.0" +use-immer@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/use-immer/-/use-immer-0.6.0.tgz#ca6aa5ade93018e2c65cf128d19ada54fc23f70d" + integrity sha512-dFGRfvWCqPDTOt/S431ETYTg6+uxbpb7A1pptufwXVzGJY3RlXr38+3wyLNpc6SbbmAKjWl6+EP6uW74fkEsXQ== + use-sidecar@^1.0.1, use-sidecar@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.0.5.tgz#ffff2a17c1df42e348624b699ba6e5c220527f2b"