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 {
NumberInputProps,
NumberInput,
@ -5,49 +6,80 @@ import {
NumberInputStepper,
NumberIncrementStepper,
NumberDecrementStepper,
HStack,
FormControl,
FormLabel,
} from '@chakra-ui/react'
import { Variable, VariableString } from 'models'
import { useEffect, useState } from 'react'
import { useDebouncedCallback } from 'use-debounce'
import { env } from 'utils'
import { MoreInfoTooltip } from '../MoreInfoTooltip'
type Props = {
value?: number
type Value<HasVariable> = HasVariable extends undefined | true
? number | VariableString
: number
type Props<HasVariable extends boolean> = {
defaultValue?: Value<HasVariable>
debounceTimeout?: number
withVariableButton?: boolean
onValueChange: (value?: number) => void
} & NumberInputProps
withVariableButton?: HasVariable
label?: string
moreInfoTooltip?: string
isRequired?: boolean
onValueChange: (value?: Value<HasVariable>) => void
} & Omit<NumberInputProps, 'defaultValue' | 'value' | 'onChange' | 'isRequired'>
export const SmartNumberInput = ({
value,
export const SmartNumberInput = <HasVariable extends boolean>({
defaultValue,
onValueChange,
withVariableButton,
debounceTimeout = 1000,
label,
moreInfoTooltip,
isRequired,
...props
}: Props) => {
const [currentValue, setCurrentValue] = useState(value?.toString() ?? '')
const debounced = useDebouncedCallback(
}: Props<HasVariable>) => {
const [value, setValue] = useState(defaultValue?.toString() ?? '')
const onValueChangeDebounced = useDebouncedCallback(
onValueChange,
env('E2E_TEST') === 'true' ? 0 : debounceTimeout
)
useEffect(
() => () => {
debounced.flush()
onValueChangeDebounced.flush()
},
// eslint-disable-next-line react-hooks/exhaustive-deps
[]
[onValueChangeDebounced]
)
const handleValueChange = (value: string) => {
setCurrentValue(value)
setValue(value)
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)
if (isNaN(newValue)) return
debounced(newValue)
onValueChangeDebounced(newValue)
}
return (
<NumberInput onChange={handleValueChange} value={currentValue} {...props}>
const handleVariableSelected = (variable?: Variable) => {
if (!variable) return
const newValue = `{{${variable.name}}}`
handleValueChange(newValue)
}
const Input = (
<NumberInput onChange={handleValueChange} value={value} {...props}>
<NumberInputField placeholder={props.placeholder} />
<NumberInputStepper>
<NumberIncrementStepper />
@ -55,4 +87,29 @@ export const SmartNumberInput = ({
</NumberInputStepper>
</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 })
}
const handleHeightChange = (height?: number) =>
const handleHeightChange = (height?: EmbedBubbleContent['height']) =>
height && onSubmit({ ...content, height })
return (
@ -32,12 +32,13 @@ export const EmbedUploadContent = ({ content, onSubmit }: Props) => {
</Text>
</Stack>
<HStack justify="space-between">
<Text>Height: </Text>
<HStack>
<SmartNumberInput
value={content?.height}
label="Height:"
defaultValue={content?.height}
onValueChange={handleHeightChange}
/>
<Text>px</Text>
</HStack>
</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 { FileInputOptions, Variable } from 'models'
import React from 'react'
@ -48,16 +48,16 @@ export const FileInputSettings = ({ options, onOptionsChange }: Props) => {
initialValue={options.isMultipleAllowed}
onCheckChange={handleMultipleFilesChange}
/>
<Stack>
<FormLabel mb="0" htmlFor="limit">
Size limit (MB):
</FormLabel>
<HStack>
<SmartNumberInput
id="limit"
value={options.sizeLimit ?? 10}
label={'Size limit:'}
defaultValue={options.sizeLimit ?? 10}
onValueChange={handleSizeLimitChange}
withVariableButton={false}
/>
</Stack>
<Text>MB</Text>
</HStack>
<Stack>
<FormLabel mb="0">Placeholder:</FormLabel>
<CodeEditor

View File

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

View File

@ -1,6 +1,6 @@
import { Input, SmartNumberInput } from '@/components/inputs'
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 { SmtpCredentialsData } from 'models'
import React from 'react'
@ -73,14 +73,14 @@ export const SmtpConfigForm = ({ config, onConfigChange }: Props) => {
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."
/>
<FormControl as={HStack} justifyContent="space-between" isRequired>
<FormLabel mb="0">Port number:</FormLabel>
<SmartNumberInput
placeholder="25"
value={config.port}
onValueChange={handlePortNumberChange}
/>
</FormControl>
<SmartNumberInput
isRequired
label="Port number:"
placeholder="25"
defaultValue={config.port}
onValueChange={handlePortNumberChange}
withVariableButton={false}
/>
</Stack>
)
}

View File

@ -53,7 +53,7 @@ test('should be configurable', async ({ page }) => {
await page.waitForTimeout(1000)
await page.click('input[value="My link typebot 2"]', { clickCount: 3 })
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"]', {
clickCount: 3,
})

View File

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

View File

@ -1,5 +1,7 @@
import { deepParseVariable } from '@/features/variables'
import {
BubbleBlock,
BubbleBlockType,
ChatReply,
Group,
InputBlock,
@ -38,7 +40,7 @@ export const executeGroup =
if (isBubbleBlock(block)) {
messages.push(
deepParseVariable(newSessionState.typebot.variables)(block)
parseBubbleBlock(newSessionState.typebot.variables)(block)
)
lastBubbleBlockId = block.id
continue
@ -126,3 +128,25 @@ const getPrefilledInputValue =
)?.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",
"cz-emoji": "1.3.2-canary.2",
"husky": "^8.0.3",
"turbo": "1.7.4"
"turbo": "1.8.1"
},
"config": {
"commitizen": {
"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])
const height = block.content.height
? typeof block.content.height === 'string'
? parseVariables(typebot.variables)(block.content.height) + 'px'
: block.content.height
: '2rem'
return (
<div className="flex flex-col w-full" ref={messageContainer}>
<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')
}
style={{
height: isTyping ? '2rem' : block.content.height,
height: isTyping ? '2rem' : height,
borderRadius: '15px',
}}
/>

View File

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

View File

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

View File

@ -7,3 +7,9 @@ export const schemaForType =
<S extends z.ZodType<T, any, any>>(arg: S) => {
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
cz-emoji: 1.3.2-canary.2
husky: ^8.0.3
turbo: 1.7.4
turbo: 1.8.1
devDependencies:
cross-env: 7.0.3
cz-emoji: 1.3.2-canary.2
husky: 8.0.3
turbo: 1.7.4
turbo: 1.8.1
apps/builder:
specifiers:
@ -570,12 +570,12 @@ importers:
eslint-plugin-react: 7.32.1
dependencies:
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-plugin-react: 7.32.1_eslint@8.32.0
devDependencies:
'@typescript-eslint/eslint-plugin': 5.50.0_insdzuwemx2bpvgu2m32dsrzvm
'@typescript-eslint/parser': 5.50.0_et5x32uxl7z5ldub3ye5rhlyqm
'@typescript-eslint/eslint-plugin': 5.50.0_skqhap4rvjneq2n5v2vocxqt74
'@typescript-eslint/parser': 5.50.0_7uibuqfxkfaozanbtbziikiqje
packages/js:
specifiers:
@ -7183,7 +7183,7 @@ packages:
dependencies:
'@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==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
@ -7194,10 +7194,10 @@ packages:
typescript:
optional: true
dependencies:
'@typescript-eslint/parser': 5.50.0_et5x32uxl7z5ldub3ye5rhlyqm
'@typescript-eslint/parser': 5.50.0_7uibuqfxkfaozanbtbziikiqje
'@typescript-eslint/scope-manager': 5.50.0
'@typescript-eslint/type-utils': 5.50.0_et5x32uxl7z5ldub3ye5rhlyqm
'@typescript-eslint/utils': 5.50.0_et5x32uxl7z5ldub3ye5rhlyqm
'@typescript-eslint/type-utils': 5.50.0_7uibuqfxkfaozanbtbziikiqje
'@typescript-eslint/utils': 5.50.0_7uibuqfxkfaozanbtbziikiqje
debug: 4.3.4
eslint: 8.32.0
grapheme-splitter: 1.0.4
@ -7205,13 +7205,13 @@ packages:
natural-compare-lite: 1.4.0
regexpp: 3.2.0
semver: 7.3.8
tsutils: 3.21.0_typescript@4.9.5
typescript: 4.9.5
tsutils: 3.21.0_typescript@4.9.4
typescript: 4.9.4
transitivePeerDependencies:
- supports-color
dev: true
/@typescript-eslint/parser/5.50.0_et5x32uxl7z5ldub3ye5rhlyqm:
/@typescript-eslint/parser/5.50.0_7uibuqfxkfaozanbtbziikiqje:
resolution: {integrity: sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
@ -7223,10 +7223,10 @@ packages:
dependencies:
'@typescript-eslint/scope-manager': 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
eslint: 8.32.0
typescript: 4.9.5
typescript: 4.9.4
transitivePeerDependencies:
- supports-color
@ -7237,7 +7237,7 @@ packages:
'@typescript-eslint/types': 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==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
@ -7247,12 +7247,12 @@ packages:
typescript:
optional: true
dependencies:
'@typescript-eslint/typescript-estree': 5.50.0_typescript@4.9.5
'@typescript-eslint/utils': 5.50.0_et5x32uxl7z5ldub3ye5rhlyqm
'@typescript-eslint/typescript-estree': 5.50.0_typescript@4.9.4
'@typescript-eslint/utils': 5.50.0_7uibuqfxkfaozanbtbziikiqje
debug: 4.3.4
eslint: 8.32.0
tsutils: 3.21.0_typescript@4.9.5
typescript: 4.9.5
tsutils: 3.21.0_typescript@4.9.4
typescript: 4.9.4
transitivePeerDependencies:
- supports-color
dev: true
@ -7280,27 +7280,6 @@ packages:
typescript: 4.9.4
transitivePeerDependencies:
- 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:
resolution: {integrity: sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==}
@ -7322,26 +7301,6 @@ packages:
- typescript
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:
resolution: {integrity: sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@ -10983,7 +10942,7 @@ packages:
source-map: 0.6.1
dev: true
/eslint-config-next/13.1.6_et5x32uxl7z5ldub3ye5rhlyqm:
/eslint-config-next/13.1.6_7uibuqfxkfaozanbtbziikiqje:
resolution: {integrity: sha512-0cg7h5wztg/SoLAlxljZ0ZPUQ7i6QKqRiP4M2+MgTZtxWwNKb2JSwNc18nJ6/kXBI6xYvPraTbQSIhAuVw6czw==}
peerDependencies:
eslint: ^7.23.0 || ^8.0.0
@ -10994,7 +10953,7 @@ packages:
dependencies:
'@next/eslint-plugin-next': 13.1.6
'@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-import-resolver-node: 0.3.7
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-react: 7.32.1_eslint@8.32.0
eslint-plugin-react-hooks: 4.6.0_eslint@8.32.0
typescript: 4.9.5
typescript: 4.9.4
transitivePeerDependencies:
- eslint-import-resolver-webpack
- supports-color
@ -11068,7 +11027,7 @@ packages:
eslint-import-resolver-webpack:
optional: true
dependencies:
'@typescript-eslint/parser': 5.50.0_et5x32uxl7z5ldub3ye5rhlyqm
'@typescript-eslint/parser': 5.50.0_7uibuqfxkfaozanbtbziikiqje
debug: 3.2.7
eslint: 8.32.0
eslint-import-resolver-node: 0.3.7
@ -11086,7 +11045,7 @@ packages:
'@typescript-eslint/parser':
optional: true
dependencies:
'@typescript-eslint/parser': 5.50.0_et5x32uxl7z5ldub3ye5rhlyqm
'@typescript-eslint/parser': 5.50.0_7uibuqfxkfaozanbtbziikiqje
array-includes: 3.1.6
array.prototype.flat: 1.3.1
array.prototype.flatmap: 1.3.1
@ -19268,16 +19227,6 @@ packages:
dependencies:
tslib: 1.14.1
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:
resolution: {integrity: sha512-ykAEkoBg30RXxeOMVeZwar+JH632dZn9EUJVyJwhfag62k6UO/dIyJEV58YuLF6e5BTdV/qmbQrpkWqjq9cUnQ==}
@ -19290,65 +19239,65 @@ packages:
fsevents: 2.3.2
dev: true
/turbo-darwin-64/1.7.4:
resolution: {integrity: sha512-ZyYrQlUl8K/mYN1e6R7bEhPPYjMakz0DYMaexkyD7TAijQtWmTSd4a+I7VknOYNEssnUZ/v41GU3gPV1JAzxxQ==}
/turbo-darwin-64/1.8.1:
resolution: {integrity: sha512-H7pxGF/vsYG7kbY+vB8h+3r8VXn2L6hhYQi0XWA+EjZ1e2zu7+TzEMRWFYmvJPx8TRo5cV5txtg0I22/Y7bxUA==}
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/turbo-darwin-arm64/1.7.4:
resolution: {integrity: sha512-CKIXg9uqp1a+Yeq/c4U0alPOqvwLUq5SBZf1PGYhGqJsfG0fRBtJfkUjHuBsuJIOGXg8rCmcGSWGIsIF6fqYuw==}
/turbo-darwin-arm64/1.8.1:
resolution: {integrity: sha512-zMcvplVGluR6v4oJXW7S1/R9QFsHdDkXMhPq8PIdvT3HwTb69ms0MNv7aKiQ0ZFy5D/eKCTyBRUFZvjorZmBqA==}
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/turbo-linux-64/1.7.4:
resolution: {integrity: sha512-RIUl4RUFFyzD2T024vL7509Ygwcw+SEa8NOwPfaN6TtJHK7RZV/SBP3fLNVOptG9WRLnOWX3OvsLMbiOqDLLyA==}
/turbo-linux-64/1.8.1:
resolution: {integrity: sha512-eJNx8iWDn5Lt8d0221RFd6lBjViLiPCVWNFF5JtqOohgRYplvepY3y/THa1GivMxY4px6zjTiy2oPE/VscVP4w==}
cpu: [x64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/turbo-linux-arm64/1.7.4:
resolution: {integrity: sha512-Bg65F0AjYYYxqE6RPf2H5TIGuA/EyWMeGOATHVSZOWAbYcnG3Ly03GZii8AHnUi7ntWBdjwvXf/QbOS1ayNB6A==}
/turbo-linux-arm64/1.8.1:
resolution: {integrity: sha512-hFZkm8tq9kLE8tdbOzD6EbNzftdzMR4JEuuoKC6AbTzx1ZsWRvXJ/BGTeSH9/dYYm/wfuIEUiOP7HeXWiZRx7g==}
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/turbo-windows-64/1.7.4:
resolution: {integrity: sha512-rTaV50XZ2BRxRHOHqt1UsWfeDmYLbn8UKE6g2D2ED+uW+kmnTvR9s01nmlGWd2sAuWcRYQyQ2V+O09VfKPKcQw==}
/turbo-windows-64/1.8.1:
resolution: {integrity: sha512-o3oDg0lTYZl5KZD3Mi753On2vQT51unIiungoUmHDCeDH5JXfWPFu+6p+GAoIyRwQkZPvaEzMLuUtRgklKcBJw==}
cpu: [x64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/turbo-windows-arm64/1.7.4:
resolution: {integrity: sha512-h8sxdKPvHTnWUPtwnYszFMmSO0P/iUUwmYY9n7iYThA71zSao28UeZ0H0Gw75cY3MPjvkjn2C4EBAUGPjuZJLw==}
/turbo-windows-arm64/1.8.1:
resolution: {integrity: sha512-NDYr2Mra21KOdl18BhMRoH2jQmlu+oqkpqRd+cGB8+c5P0B6LDVCM83cfcXQ+PNqX9S3Y1eZDRENZJx9I03sSw==}
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/turbo/1.7.4:
resolution: {integrity: sha512-8RLedDoUL0kkVKWEZ/RMM70BvKLyDFen06QuKKhYC2XNOfNKqFDqzIdcY/vGick869bNIWalChoy4O07k0HLsA==}
/turbo/1.8.1:
resolution: {integrity: sha512-g8RltmG5zd0nYbKpkBQwnTSXTWUiup9+yileQ1TETNzpjxI3TL5k7kt2WkgUHEqR947IPUV+ckIduZHVITJmIQ==}
hasBin: true
requiresBuild: true
optionalDependencies:
turbo-darwin-64: 1.7.4
turbo-darwin-arm64: 1.7.4
turbo-linux-64: 1.7.4
turbo-linux-arm64: 1.7.4
turbo-windows-64: 1.7.4
turbo-windows-arm64: 1.7.4
turbo-darwin-64: 1.8.1
turbo-darwin-arm64: 1.8.1
turbo-linux-64: 1.8.1
turbo-linux-arm64: 1.8.1
turbo-windows-64: 1.8.1
turbo-windows-arm64: 1.8.1
dev: true
/type-check/0.3.2: