2
0

(embedBubble) Enable variable embed height

This commit is contained in:
Baptiste Arnaud
2023-02-19 09:53:57 +01:00
parent d22cc45a97
commit 621cd58244
14 changed files with 226 additions and 198 deletions

View File

@@ -1,3 +1,4 @@
import { VariablesButton } from '@/features/variables'
import { import {
NumberInputProps, NumberInputProps,
NumberInput, NumberInput,
@@ -5,49 +6,80 @@ import {
NumberInputStepper, NumberInputStepper,
NumberIncrementStepper, NumberIncrementStepper,
NumberDecrementStepper, NumberDecrementStepper,
HStack,
FormControl,
FormLabel,
} from '@chakra-ui/react' } from '@chakra-ui/react'
import { Variable, VariableString } from 'models'
import { useEffect, useState } from 'react' import { useEffect, useState } from 'react'
import { useDebouncedCallback } from 'use-debounce' import { useDebouncedCallback } from 'use-debounce'
import { env } from 'utils' import { env } from 'utils'
import { MoreInfoTooltip } from '../MoreInfoTooltip'
type Props = { type Value<HasVariable> = HasVariable extends undefined | true
value?: number ? number | VariableString
: number
type Props<HasVariable extends boolean> = {
defaultValue?: Value<HasVariable>
debounceTimeout?: number debounceTimeout?: number
withVariableButton?: boolean withVariableButton?: HasVariable
onValueChange: (value?: number) => void label?: string
} & NumberInputProps moreInfoTooltip?: string
isRequired?: boolean
onValueChange: (value?: Value<HasVariable>) => void
} & Omit<NumberInputProps, 'defaultValue' | 'value' | 'onChange' | 'isRequired'>
export const SmartNumberInput = ({ export const SmartNumberInput = <HasVariable extends boolean>({
value, defaultValue,
onValueChange, onValueChange,
withVariableButton,
debounceTimeout = 1000, debounceTimeout = 1000,
label,
moreInfoTooltip,
isRequired,
...props ...props
}: Props) => { }: Props<HasVariable>) => {
const [currentValue, setCurrentValue] = useState(value?.toString() ?? '') const [value, setValue] = useState(defaultValue?.toString() ?? '')
const debounced = useDebouncedCallback(
const onValueChangeDebounced = useDebouncedCallback(
onValueChange, onValueChange,
env('E2E_TEST') === 'true' ? 0 : debounceTimeout env('E2E_TEST') === 'true' ? 0 : debounceTimeout
) )
useEffect( useEffect(
() => () => { () => () => {
debounced.flush() onValueChangeDebounced.flush()
}, },
// eslint-disable-next-line react-hooks/exhaustive-deps [onValueChangeDebounced]
[]
) )
const handleValueChange = (value: string) => { const handleValueChange = (value: string) => {
setCurrentValue(value) setValue(value)
if (value.endsWith('.') || value.endsWith(',')) return if (value.endsWith('.') || value.endsWith(',')) return
if (value === '') return debounced(undefined) if (value === '') return onValueChangeDebounced(undefined)
if (
value.startsWith('{{') &&
value.endsWith('}}') &&
value.length > 4 &&
(withVariableButton ?? true)
) {
onValueChangeDebounced(value as Value<HasVariable>)
return
}
const newValue = parseFloat(value) const newValue = parseFloat(value)
if (isNaN(newValue)) return if (isNaN(newValue)) return
debounced(newValue) onValueChangeDebounced(newValue)
} }
return ( const handleVariableSelected = (variable?: Variable) => {
<NumberInput onChange={handleValueChange} value={currentValue} {...props}> if (!variable) return
const newValue = `{{${variable.name}}}`
handleValueChange(newValue)
}
const Input = (
<NumberInput onChange={handleValueChange} value={value} {...props}>
<NumberInputField placeholder={props.placeholder} /> <NumberInputField placeholder={props.placeholder} />
<NumberInputStepper> <NumberInputStepper>
<NumberIncrementStepper /> <NumberIncrementStepper />
@@ -55,4 +87,29 @@ export const SmartNumberInput = ({
</NumberInputStepper> </NumberInputStepper>
</NumberInput> </NumberInput>
) )
return (
<FormControl
as={HStack}
isRequired={isRequired}
justifyContent="space-between"
>
{label && (
<FormLabel mb="0" flexShrink={0}>
{label}{' '}
{moreInfoTooltip && (
<MoreInfoTooltip>{moreInfoTooltip}</MoreInfoTooltip>
)}
</FormLabel>
)}
{withVariableButton ?? true ? (
<HStack spacing={0}>
{Input}
<VariablesButton onSelectVariable={handleVariableSelected} />
</HStack>
) : (
Input
)}
</FormControl>
)
} }

View File

@@ -16,7 +16,7 @@ export const EmbedUploadContent = ({ content, onSubmit }: Props) => {
onSubmit({ ...content, url: iframeUrl }) onSubmit({ ...content, url: iframeUrl })
} }
const handleHeightChange = (height?: number) => const handleHeightChange = (height?: EmbedBubbleContent['height']) =>
height && onSubmit({ ...content, height }) height && onSubmit({ ...content, height })
return ( return (
@@ -32,12 +32,13 @@ export const EmbedUploadContent = ({ content, onSubmit }: Props) => {
</Text> </Text>
</Stack> </Stack>
<HStack justify="space-between"> <HStack>
<Text>Height: </Text>
<SmartNumberInput <SmartNumberInput
value={content?.height} label="Height:"
defaultValue={content?.height}
onValueChange={handleHeightChange} onValueChange={handleHeightChange}
/> />
<Text>px</Text>
</HStack> </HStack>
</Stack> </Stack>
) )

View File

@@ -1,4 +1,4 @@
import { FormLabel, Stack } from '@chakra-ui/react' import { FormLabel, HStack, Stack, Text } from '@chakra-ui/react'
import { CodeEditor } from '@/components/CodeEditor' import { CodeEditor } from '@/components/CodeEditor'
import { FileInputOptions, Variable } from 'models' import { FileInputOptions, Variable } from 'models'
import React from 'react' import React from 'react'
@@ -48,16 +48,16 @@ export const FileInputSettings = ({ options, onOptionsChange }: Props) => {
initialValue={options.isMultipleAllowed} initialValue={options.isMultipleAllowed}
onCheckChange={handleMultipleFilesChange} onCheckChange={handleMultipleFilesChange}
/> />
<Stack> <HStack>
<FormLabel mb="0" htmlFor="limit">
Size limit (MB):
</FormLabel>
<SmartNumberInput <SmartNumberInput
id="limit" label={'Size limit:'}
value={options.sizeLimit ?? 10} defaultValue={options.sizeLimit ?? 10}
onValueChange={handleSizeLimitChange} onValueChange={handleSizeLimitChange}
withVariableButton={false}
/> />
</Stack> <Text>MB</Text>
</HStack>
<Stack> <Stack>
<FormLabel mb="0">Placeholder:</FormLabel> <FormLabel mb="0">Placeholder:</FormLabel>
<CodeEditor <CodeEditor

View File

@@ -1,7 +1,7 @@
import { Input, SmartNumberInput } from '@/components/inputs' import { Input, SmartNumberInput } from '@/components/inputs'
import { VariableSearchInput } from '@/components/VariableSearchInput' import { VariableSearchInput } from '@/components/VariableSearchInput'
import { removeUndefinedFields } from '@/utils/helpers' import { removeUndefinedFields } from '@/utils/helpers'
import { FormLabel, HStack, Stack } from '@chakra-ui/react' import { FormLabel, Stack } from '@chakra-ui/react'
import { NumberInputOptions, Variable } from 'models' import { NumberInputOptions, Variable } from 'models'
import React from 'react' import React from 'react'
@@ -50,36 +50,24 @@ export const NumberInputSettingsBody = ({
onChange={handleButtonLabelChange} onChange={handleButtonLabelChange}
/> />
</Stack> </Stack>
<HStack justifyContent="space-between"> <SmartNumberInput
<FormLabel mb="0" htmlFor="min"> label="Min:"
Min: defaultValue={options.min}
</FormLabel> onValueChange={handleMinChange}
<SmartNumberInput withVariableButton={false}
id="min" />
value={options.min} <SmartNumberInput
onValueChange={handleMinChange} label="Max:"
/> defaultValue={options.max}
</HStack> onValueChange={handleMaxChange}
<HStack justifyContent="space-between"> withVariableButton={false}
<FormLabel mb="0" htmlFor="max"> />
Max: <SmartNumberInput
</FormLabel> label="Step:"
<SmartNumberInput defaultValue={options.step}
id="max" onValueChange={handleBlockChange}
value={options.max} withVariableButton={false}
onValueChange={handleMaxChange} />
/>
</HStack>
<HStack justifyContent="space-between">
<FormLabel mb="0" htmlFor="step">
Step:
</FormLabel>
<SmartNumberInput
id="step"
value={options.step}
onValueChange={handleBlockChange}
/>
</HStack>
<Stack> <Stack>
<FormLabel mb="0" htmlFor="variable"> <FormLabel mb="0" htmlFor="variable">
Save answer in a variable: Save answer in a variable:

View File

@@ -1,6 +1,6 @@
import { Input, SmartNumberInput } from '@/components/inputs' import { Input, SmartNumberInput } from '@/components/inputs'
import { SwitchWithLabel } from '@/components/SwitchWithLabel' import { SwitchWithLabel } from '@/components/SwitchWithLabel'
import { FormControl, FormLabel, HStack, Stack } from '@chakra-ui/react' import { Stack } from '@chakra-ui/react'
import { isDefined } from '@udecode/plate-common' import { isDefined } from '@udecode/plate-common'
import { SmtpCredentialsData } from 'models' import { SmtpCredentialsData } from 'models'
import React from 'react' import React from 'react'
@@ -73,14 +73,14 @@ export const SmtpConfigForm = ({ config, onConfigChange }: Props) => {
onCheckChange={handleTlsCheck} onCheckChange={handleTlsCheck}
moreInfoContent="If enabled, the connection will use TLS when connecting to server. If disabled then TLS is used if server supports the STARTTLS extension. In most cases enable it if you are connecting to port 465. For port 587 or 25 keep it disabled." moreInfoContent="If enabled, the connection will use TLS when connecting to server. If disabled then TLS is used if server supports the STARTTLS extension. In most cases enable it if you are connecting to port 465. For port 587 or 25 keep it disabled."
/> />
<FormControl as={HStack} justifyContent="space-between" isRequired> <SmartNumberInput
<FormLabel mb="0">Port number:</FormLabel> isRequired
<SmartNumberInput label="Port number:"
placeholder="25" placeholder="25"
value={config.port} defaultValue={config.port}
onValueChange={handlePortNumberChange} onValueChange={handlePortNumberChange}
/> withVariableButton={false}
</FormControl> />
</Stack> </Stack>
) )
} }

View File

@@ -53,7 +53,7 @@ test('should be configurable', async ({ page }) => {
await page.waitForTimeout(1000) await page.waitForTimeout(1000)
await page.click('input[value="My link typebot 2"]', { clickCount: 3 }) await page.click('input[value="My link typebot 2"]', { clickCount: 3 })
await page.press('input[value="My link typebot 2"]', 'Backspace') await page.press('input[value="My link typebot 2"]', 'Backspace')
await page.click('button >> text=My link typebot 1') await page.click('button >> text=Current typebot')
await page.click('input[placeholder="Select a block"]', { await page.click('input[placeholder="Select a block"]', {
clickCount: 3, clickCount: 3,
}) })

View File

@@ -36,32 +36,24 @@ export const TypingEmulationForm = ({ typingEmulation, onUpdate }: Props) => {
</Flex> </Flex>
{typingEmulation.enabled && ( {typingEmulation.enabled && (
<Stack pl={10}> <Stack pl={10}>
<Flex justify="space-between" align="center"> <SmartNumberInput
<FormLabel htmlFor="speed" mb="0"> label="Words per minutes:"
Words per minutes: data-testid="speed"
</FormLabel> defaultValue={typingEmulation.speed}
<SmartNumberInput onValueChange={handleSpeedChange}
id="speed" withVariableButton={false}
data-testid="speed" maxW="100px"
value={typingEmulation.speed} step={30}
onValueChange={handleSpeedChange} />
maxW="100px" <SmartNumberInput
step={30} label="Max delay (in seconds):"
/> data-testid="max-delay"
</Flex> defaultValue={typingEmulation.maxDelay}
<Flex justify="space-between" align="center"> onValueChange={handleMaxDelayChange}
<FormLabel htmlFor="max-delay" mb="0"> withVariableButton={false}
Max delay (in seconds): maxW="100px"
</FormLabel> step={0.1}
<SmartNumberInput />
id="max-delay"
data-testid="max-delay"
value={typingEmulation.maxDelay}
onValueChange={handleMaxDelayChange}
maxW="100px"
step={0.1}
/>
</Flex>
</Stack> </Stack>
)} )}
</Stack> </Stack>

View File

@@ -1,5 +1,7 @@
import { deepParseVariable } from '@/features/variables' import { deepParseVariable } from '@/features/variables'
import { import {
BubbleBlock,
BubbleBlockType,
ChatReply, ChatReply,
Group, Group,
InputBlock, InputBlock,
@@ -38,7 +40,7 @@ export const executeGroup =
if (isBubbleBlock(block)) { if (isBubbleBlock(block)) {
messages.push( messages.push(
deepParseVariable(newSessionState.typebot.variables)(block) parseBubbleBlock(newSessionState.typebot.variables)(block)
) )
lastBubbleBlockId = block.id lastBubbleBlockId = block.id
continue continue
@@ -126,3 +128,25 @@ const getPrefilledInputValue =
)?.value ?? undefined )?.value ?? undefined
) )
} }
const parseBubbleBlock =
(variables: SessionState['typebot']['variables']) =>
(block: BubbleBlock): ChatReply['messages'][0] => {
switch (block.type) {
case BubbleBlockType.EMBED: {
const message = deepParseVariable(variables)(block)
return {
...message,
content: {
...message.content,
height:
typeof message.content.height === 'string'
? parseFloat(message.content.height)
: message.content.height,
},
}
}
default:
return deepParseVariable(variables)(block)
}
}

View File

@@ -26,12 +26,12 @@
"cross-env": "7.0.3", "cross-env": "7.0.3",
"cz-emoji": "1.3.2-canary.2", "cz-emoji": "1.3.2-canary.2",
"husky": "^8.0.3", "husky": "^8.0.3",
"turbo": "1.7.4" "turbo": "1.8.1"
}, },
"config": { "config": {
"commitizen": { "commitizen": {
"path": "node_modules/cz-emoji" "path": "node_modules/cz-emoji"
} }
}, },
"packageManager": "pnpm@7.25.1" "packageManager": "pnpm@7.27.1"
} }

View File

@@ -36,6 +36,12 @@ export const EmbedBubble = ({ block, onTransitionEnd }: Props) => {
} }
}, [isLoading, isTyping, onTypingEnd]) }, [isLoading, isTyping, onTypingEnd])
const height = block.content.height
? typeof block.content.height === 'string'
? parseVariables(typebot.variables)(block.content.height) + 'px'
: block.content.height
: '2rem'
return ( return (
<div className="flex flex-col w-full" ref={messageContainer}> <div className="flex flex-col w-full" ref={messageContainer}>
<div className="flex mb-2 w-full lg:w-11/12 items-center"> <div className="flex mb-2 w-full lg:w-11/12 items-center">
@@ -61,7 +67,7 @@ export const EmbedBubble = ({ block, onTransitionEnd }: Props) => {
(isTyping ? 'opacity-0' : 'opacity-100') (isTyping ? 'opacity-0' : 'opacity-100')
} }
style={{ style={{
height: isTyping ? '2rem' : block.content.height, height: isTyping ? '2rem' : height,
borderRadius: '15px', borderRadius: '15px',
}} }}
/> />

View File

@@ -1,10 +1,11 @@
import { z } from 'zod' import { z } from 'zod'
import { variableStringSchema } from '../../utils'
import { blockBaseSchema } from '../baseSchemas' import { blockBaseSchema } from '../baseSchemas'
import { BubbleBlockType } from './enums' import { BubbleBlockType } from './enums'
export const embedBubbleContentSchema = z.object({ export const embedBubbleContentSchema = z.object({
url: z.string().optional(), url: z.string().optional(),
height: z.number(), height: z.number().or(variableStringSchema),
}) })
export const embedBubbleBlockSchema = blockBaseSchema.and( export const embedBubbleBlockSchema = blockBaseSchema.and(

View File

@@ -84,7 +84,11 @@ const audioMessageSchema = z.object({
const embedMessageSchema = z.object({ const embedMessageSchema = z.object({
type: z.enum([BubbleBlockType.EMBED]), type: z.enum([BubbleBlockType.EMBED]),
content: embedBubbleContentSchema, content: embedBubbleContentSchema
.omit({
height: true,
})
.and(z.object({ height: z.number().optional() })),
}) })
const chatMessageSchema = z const chatMessageSchema = z

View File

@@ -7,3 +7,9 @@ export const schemaForType =
<S extends z.ZodType<T, any, any>>(arg: S) => { <S extends z.ZodType<T, any, any>>(arg: S) => {
return arg return arg
} }
export const variableStringSchema = z.custom<`{{${string}}}`>((val) =>
/^{{.+}}$/g.test(val as string)
)
export type VariableString = z.infer<typeof variableStringSchema>

139
pnpm-lock.yaml generated
View File

@@ -7,12 +7,12 @@ importers:
cross-env: 7.0.3 cross-env: 7.0.3
cz-emoji: 1.3.2-canary.2 cz-emoji: 1.3.2-canary.2
husky: ^8.0.3 husky: ^8.0.3
turbo: 1.7.4 turbo: 1.8.1
devDependencies: devDependencies:
cross-env: 7.0.3 cross-env: 7.0.3
cz-emoji: 1.3.2-canary.2 cz-emoji: 1.3.2-canary.2
husky: 8.0.3 husky: 8.0.3
turbo: 1.7.4 turbo: 1.8.1
apps/builder: apps/builder:
specifiers: specifiers:
@@ -570,12 +570,12 @@ importers:
eslint-plugin-react: 7.32.1 eslint-plugin-react: 7.32.1
dependencies: dependencies:
eslint: 8.32.0 eslint: 8.32.0
eslint-config-next: 13.1.6_et5x32uxl7z5ldub3ye5rhlyqm eslint-config-next: 13.1.6_7uibuqfxkfaozanbtbziikiqje
eslint-config-prettier: 8.6.0_eslint@8.32.0 eslint-config-prettier: 8.6.0_eslint@8.32.0
eslint-plugin-react: 7.32.1_eslint@8.32.0 eslint-plugin-react: 7.32.1_eslint@8.32.0
devDependencies: devDependencies:
'@typescript-eslint/eslint-plugin': 5.50.0_insdzuwemx2bpvgu2m32dsrzvm '@typescript-eslint/eslint-plugin': 5.50.0_skqhap4rvjneq2n5v2vocxqt74
'@typescript-eslint/parser': 5.50.0_et5x32uxl7z5ldub3ye5rhlyqm '@typescript-eslint/parser': 5.50.0_7uibuqfxkfaozanbtbziikiqje
packages/js: packages/js:
specifiers: specifiers:
@@ -7183,7 +7183,7 @@ packages:
dependencies: dependencies:
'@types/yargs-parser': 21.0.0 '@types/yargs-parser': 21.0.0
/@typescript-eslint/eslint-plugin/5.50.0_insdzuwemx2bpvgu2m32dsrzvm: /@typescript-eslint/eslint-plugin/5.50.0_skqhap4rvjneq2n5v2vocxqt74:
resolution: {integrity: sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==} resolution: {integrity: sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
@@ -7194,10 +7194,10 @@ packages:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/parser': 5.50.0_et5x32uxl7z5ldub3ye5rhlyqm '@typescript-eslint/parser': 5.50.0_7uibuqfxkfaozanbtbziikiqje
'@typescript-eslint/scope-manager': 5.50.0 '@typescript-eslint/scope-manager': 5.50.0
'@typescript-eslint/type-utils': 5.50.0_et5x32uxl7z5ldub3ye5rhlyqm '@typescript-eslint/type-utils': 5.50.0_7uibuqfxkfaozanbtbziikiqje
'@typescript-eslint/utils': 5.50.0_et5x32uxl7z5ldub3ye5rhlyqm '@typescript-eslint/utils': 5.50.0_7uibuqfxkfaozanbtbziikiqje
debug: 4.3.4 debug: 4.3.4
eslint: 8.32.0 eslint: 8.32.0
grapheme-splitter: 1.0.4 grapheme-splitter: 1.0.4
@@ -7205,13 +7205,13 @@ packages:
natural-compare-lite: 1.4.0 natural-compare-lite: 1.4.0
regexpp: 3.2.0 regexpp: 3.2.0
semver: 7.3.8 semver: 7.3.8
tsutils: 3.21.0_typescript@4.9.5 tsutils: 3.21.0_typescript@4.9.4
typescript: 4.9.5 typescript: 4.9.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/parser/5.50.0_et5x32uxl7z5ldub3ye5rhlyqm: /@typescript-eslint/parser/5.50.0_7uibuqfxkfaozanbtbziikiqje:
resolution: {integrity: sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==} resolution: {integrity: sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
@@ -7223,10 +7223,10 @@ packages:
dependencies: dependencies:
'@typescript-eslint/scope-manager': 5.50.0 '@typescript-eslint/scope-manager': 5.50.0
'@typescript-eslint/types': 5.50.0 '@typescript-eslint/types': 5.50.0
'@typescript-eslint/typescript-estree': 5.50.0_typescript@4.9.5 '@typescript-eslint/typescript-estree': 5.50.0_typescript@4.9.4
debug: 4.3.4 debug: 4.3.4
eslint: 8.32.0 eslint: 8.32.0
typescript: 4.9.5 typescript: 4.9.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -7237,7 +7237,7 @@ packages:
'@typescript-eslint/types': 5.50.0 '@typescript-eslint/types': 5.50.0
'@typescript-eslint/visitor-keys': 5.50.0 '@typescript-eslint/visitor-keys': 5.50.0
/@typescript-eslint/type-utils/5.50.0_et5x32uxl7z5ldub3ye5rhlyqm: /@typescript-eslint/type-utils/5.50.0_7uibuqfxkfaozanbtbziikiqje:
resolution: {integrity: sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==} resolution: {integrity: sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
@@ -7247,12 +7247,12 @@ packages:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 5.50.0_typescript@4.9.5 '@typescript-eslint/typescript-estree': 5.50.0_typescript@4.9.4
'@typescript-eslint/utils': 5.50.0_et5x32uxl7z5ldub3ye5rhlyqm '@typescript-eslint/utils': 5.50.0_7uibuqfxkfaozanbtbziikiqje
debug: 4.3.4 debug: 4.3.4
eslint: 8.32.0 eslint: 8.32.0
tsutils: 3.21.0_typescript@4.9.5 tsutils: 3.21.0_typescript@4.9.4
typescript: 4.9.5 typescript: 4.9.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
dev: true dev: true
@@ -7280,27 +7280,6 @@ packages:
typescript: 4.9.4 typescript: 4.9.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
dev: true
/@typescript-eslint/typescript-estree/5.50.0_typescript@4.9.5:
resolution: {integrity: sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
dependencies:
'@typescript-eslint/types': 5.50.0
'@typescript-eslint/visitor-keys': 5.50.0
debug: 4.3.4
globby: 11.1.0
is-glob: 4.0.3
semver: 7.3.8
tsutils: 3.21.0_typescript@4.9.5
typescript: 4.9.5
transitivePeerDependencies:
- supports-color
/@typescript-eslint/utils/5.50.0_7uibuqfxkfaozanbtbziikiqje: /@typescript-eslint/utils/5.50.0_7uibuqfxkfaozanbtbziikiqje:
resolution: {integrity: sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==} resolution: {integrity: sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==}
@@ -7322,26 +7301,6 @@ packages:
- typescript - typescript
dev: true dev: true
/@typescript-eslint/utils/5.50.0_et5x32uxl7z5ldub3ye5rhlyqm:
resolution: {integrity: sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies:
'@types/json-schema': 7.0.11
'@types/semver': 7.3.13
'@typescript-eslint/scope-manager': 5.50.0
'@typescript-eslint/types': 5.50.0
'@typescript-eslint/typescript-estree': 5.50.0_typescript@4.9.5
eslint: 8.32.0
eslint-scope: 5.1.1
eslint-utils: 3.0.0_eslint@8.32.0
semver: 7.3.8
transitivePeerDependencies:
- supports-color
- typescript
dev: true
/@typescript-eslint/visitor-keys/5.50.0: /@typescript-eslint/visitor-keys/5.50.0:
resolution: {integrity: sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==} resolution: {integrity: sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -10983,7 +10942,7 @@ packages:
source-map: 0.6.1 source-map: 0.6.1
dev: true dev: true
/eslint-config-next/13.1.6_et5x32uxl7z5ldub3ye5rhlyqm: /eslint-config-next/13.1.6_7uibuqfxkfaozanbtbziikiqje:
resolution: {integrity: sha512-0cg7h5wztg/SoLAlxljZ0ZPUQ7i6QKqRiP4M2+MgTZtxWwNKb2JSwNc18nJ6/kXBI6xYvPraTbQSIhAuVw6czw==} resolution: {integrity: sha512-0cg7h5wztg/SoLAlxljZ0ZPUQ7i6QKqRiP4M2+MgTZtxWwNKb2JSwNc18nJ6/kXBI6xYvPraTbQSIhAuVw6czw==}
peerDependencies: peerDependencies:
eslint: ^7.23.0 || ^8.0.0 eslint: ^7.23.0 || ^8.0.0
@@ -10994,7 +10953,7 @@ packages:
dependencies: dependencies:
'@next/eslint-plugin-next': 13.1.6 '@next/eslint-plugin-next': 13.1.6
'@rushstack/eslint-patch': 1.2.0 '@rushstack/eslint-patch': 1.2.0
'@typescript-eslint/parser': 5.50.0_et5x32uxl7z5ldub3ye5rhlyqm '@typescript-eslint/parser': 5.50.0_7uibuqfxkfaozanbtbziikiqje
eslint: 8.32.0 eslint: 8.32.0
eslint-import-resolver-node: 0.3.7 eslint-import-resolver-node: 0.3.7
eslint-import-resolver-typescript: 3.5.3_ps7hf4l2dvbuxvtusmrfhmzsba eslint-import-resolver-typescript: 3.5.3_ps7hf4l2dvbuxvtusmrfhmzsba
@@ -11002,7 +10961,7 @@ packages:
eslint-plugin-jsx-a11y: 6.7.1_eslint@8.32.0 eslint-plugin-jsx-a11y: 6.7.1_eslint@8.32.0
eslint-plugin-react: 7.32.1_eslint@8.32.0 eslint-plugin-react: 7.32.1_eslint@8.32.0
eslint-plugin-react-hooks: 4.6.0_eslint@8.32.0 eslint-plugin-react-hooks: 4.6.0_eslint@8.32.0
typescript: 4.9.5 typescript: 4.9.4
transitivePeerDependencies: transitivePeerDependencies:
- eslint-import-resolver-webpack - eslint-import-resolver-webpack
- supports-color - supports-color
@@ -11068,7 +11027,7 @@ packages:
eslint-import-resolver-webpack: eslint-import-resolver-webpack:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/parser': 5.50.0_et5x32uxl7z5ldub3ye5rhlyqm '@typescript-eslint/parser': 5.50.0_7uibuqfxkfaozanbtbziikiqje
debug: 3.2.7 debug: 3.2.7
eslint: 8.32.0 eslint: 8.32.0
eslint-import-resolver-node: 0.3.7 eslint-import-resolver-node: 0.3.7
@@ -11086,7 +11045,7 @@ packages:
'@typescript-eslint/parser': '@typescript-eslint/parser':
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/parser': 5.50.0_et5x32uxl7z5ldub3ye5rhlyqm '@typescript-eslint/parser': 5.50.0_7uibuqfxkfaozanbtbziikiqje
array-includes: 3.1.6 array-includes: 3.1.6
array.prototype.flat: 1.3.1 array.prototype.flat: 1.3.1
array.prototype.flatmap: 1.3.1 array.prototype.flatmap: 1.3.1
@@ -19268,16 +19227,6 @@ packages:
dependencies: dependencies:
tslib: 1.14.1 tslib: 1.14.1
typescript: 4.9.4 typescript: 4.9.4
dev: true
/tsutils/3.21.0_typescript@4.9.5:
resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
engines: {node: '>= 6'}
peerDependencies:
typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
dependencies:
tslib: 1.14.1
typescript: 4.9.5
/tsx/3.12.2: /tsx/3.12.2:
resolution: {integrity: sha512-ykAEkoBg30RXxeOMVeZwar+JH632dZn9EUJVyJwhfag62k6UO/dIyJEV58YuLF6e5BTdV/qmbQrpkWqjq9cUnQ==} resolution: {integrity: sha512-ykAEkoBg30RXxeOMVeZwar+JH632dZn9EUJVyJwhfag62k6UO/dIyJEV58YuLF6e5BTdV/qmbQrpkWqjq9cUnQ==}
@@ -19290,65 +19239,65 @@ packages:
fsevents: 2.3.2 fsevents: 2.3.2
dev: true dev: true
/turbo-darwin-64/1.7.4: /turbo-darwin-64/1.8.1:
resolution: {integrity: sha512-ZyYrQlUl8K/mYN1e6R7bEhPPYjMakz0DYMaexkyD7TAijQtWmTSd4a+I7VknOYNEssnUZ/v41GU3gPV1JAzxxQ==} resolution: {integrity: sha512-H7pxGF/vsYG7kbY+vB8h+3r8VXn2L6hhYQi0XWA+EjZ1e2zu7+TzEMRWFYmvJPx8TRo5cV5txtg0I22/Y7bxUA==}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
requiresBuild: true requiresBuild: true
dev: true dev: true
optional: true optional: true
/turbo-darwin-arm64/1.7.4: /turbo-darwin-arm64/1.8.1:
resolution: {integrity: sha512-CKIXg9uqp1a+Yeq/c4U0alPOqvwLUq5SBZf1PGYhGqJsfG0fRBtJfkUjHuBsuJIOGXg8rCmcGSWGIsIF6fqYuw==} resolution: {integrity: sha512-zMcvplVGluR6v4oJXW7S1/R9QFsHdDkXMhPq8PIdvT3HwTb69ms0MNv7aKiQ0ZFy5D/eKCTyBRUFZvjorZmBqA==}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
requiresBuild: true requiresBuild: true
dev: true dev: true
optional: true optional: true
/turbo-linux-64/1.7.4: /turbo-linux-64/1.8.1:
resolution: {integrity: sha512-RIUl4RUFFyzD2T024vL7509Ygwcw+SEa8NOwPfaN6TtJHK7RZV/SBP3fLNVOptG9WRLnOWX3OvsLMbiOqDLLyA==} resolution: {integrity: sha512-eJNx8iWDn5Lt8d0221RFd6lBjViLiPCVWNFF5JtqOohgRYplvepY3y/THa1GivMxY4px6zjTiy2oPE/VscVP4w==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: true dev: true
optional: true optional: true
/turbo-linux-arm64/1.7.4: /turbo-linux-arm64/1.8.1:
resolution: {integrity: sha512-Bg65F0AjYYYxqE6RPf2H5TIGuA/EyWMeGOATHVSZOWAbYcnG3Ly03GZii8AHnUi7ntWBdjwvXf/QbOS1ayNB6A==} resolution: {integrity: sha512-hFZkm8tq9kLE8tdbOzD6EbNzftdzMR4JEuuoKC6AbTzx1ZsWRvXJ/BGTeSH9/dYYm/wfuIEUiOP7HeXWiZRx7g==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: true dev: true
optional: true optional: true
/turbo-windows-64/1.7.4: /turbo-windows-64/1.8.1:
resolution: {integrity: sha512-rTaV50XZ2BRxRHOHqt1UsWfeDmYLbn8UKE6g2D2ED+uW+kmnTvR9s01nmlGWd2sAuWcRYQyQ2V+O09VfKPKcQw==} resolution: {integrity: sha512-o3oDg0lTYZl5KZD3Mi753On2vQT51unIiungoUmHDCeDH5JXfWPFu+6p+GAoIyRwQkZPvaEzMLuUtRgklKcBJw==}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
requiresBuild: true requiresBuild: true
dev: true dev: true
optional: true optional: true
/turbo-windows-arm64/1.7.4: /turbo-windows-arm64/1.8.1:
resolution: {integrity: sha512-h8sxdKPvHTnWUPtwnYszFMmSO0P/iUUwmYY9n7iYThA71zSao28UeZ0H0Gw75cY3MPjvkjn2C4EBAUGPjuZJLw==} resolution: {integrity: sha512-NDYr2Mra21KOdl18BhMRoH2jQmlu+oqkpqRd+cGB8+c5P0B6LDVCM83cfcXQ+PNqX9S3Y1eZDRENZJx9I03sSw==}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
requiresBuild: true requiresBuild: true
dev: true dev: true
optional: true optional: true
/turbo/1.7.4: /turbo/1.8.1:
resolution: {integrity: sha512-8RLedDoUL0kkVKWEZ/RMM70BvKLyDFen06QuKKhYC2XNOfNKqFDqzIdcY/vGick869bNIWalChoy4O07k0HLsA==} resolution: {integrity: sha512-g8RltmG5zd0nYbKpkBQwnTSXTWUiup9+yileQ1TETNzpjxI3TL5k7kt2WkgUHEqR947IPUV+ckIduZHVITJmIQ==}
hasBin: true hasBin: true
requiresBuild: true requiresBuild: true
optionalDependencies: optionalDependencies:
turbo-darwin-64: 1.7.4 turbo-darwin-64: 1.8.1
turbo-darwin-arm64: 1.7.4 turbo-darwin-arm64: 1.8.1
turbo-linux-64: 1.7.4 turbo-linux-64: 1.8.1
turbo-linux-arm64: 1.7.4 turbo-linux-arm64: 1.8.1
turbo-windows-64: 1.7.4 turbo-windows-64: 1.8.1
turbo-windows-arm64: 1.7.4 turbo-windows-arm64: 1.8.1
dev: true dev: true
/type-check/0.3.2: /type-check/0.3.2: