diff --git a/apps/builder/src/components/inputs/SmartNumberInput.tsx b/apps/builder/src/components/inputs/SmartNumberInput.tsx index 14faec86e..9a37b5316 100644 --- a/apps/builder/src/components/inputs/SmartNumberInput.tsx +++ b/apps/builder/src/components/inputs/SmartNumberInput.tsx @@ -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 extends undefined | true + ? number | VariableString + : number + +type Props = { + defaultValue?: Value debounceTimeout?: number - withVariableButton?: boolean - onValueChange: (value?: number) => void -} & NumberInputProps + withVariableButton?: HasVariable + label?: string + moreInfoTooltip?: string + isRequired?: boolean + onValueChange: (value?: Value) => void +} & Omit -export const SmartNumberInput = ({ - value, +export const SmartNumberInput = ({ + defaultValue, onValueChange, + withVariableButton, debounceTimeout = 1000, + label, + moreInfoTooltip, + isRequired, ...props -}: Props) => { - const [currentValue, setCurrentValue] = useState(value?.toString() ?? '') - const debounced = useDebouncedCallback( +}: Props) => { + 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) + return + } const newValue = parseFloat(value) if (isNaN(newValue)) return - debounced(newValue) + onValueChangeDebounced(newValue) } - return ( - + const handleVariableSelected = (variable?: Variable) => { + if (!variable) return + const newValue = `{{${variable.name}}}` + handleValueChange(newValue) + } + + const Input = ( + @@ -55,4 +87,29 @@ export const SmartNumberInput = ({ ) + + return ( + + {label && ( + + {label}{' '} + {moreInfoTooltip && ( + {moreInfoTooltip} + )} + + )} + {withVariableButton ?? true ? ( + + {Input} + + + ) : ( + Input + )} + + ) } diff --git a/apps/builder/src/features/blocks/bubbles/embed/components/EmbedUploadContent.tsx b/apps/builder/src/features/blocks/bubbles/embed/components/EmbedUploadContent.tsx index cbcddbd02..493be84ab 100644 --- a/apps/builder/src/features/blocks/bubbles/embed/components/EmbedUploadContent.tsx +++ b/apps/builder/src/features/blocks/bubbles/embed/components/EmbedUploadContent.tsx @@ -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) => { - - Height: + + px ) diff --git a/apps/builder/src/features/blocks/inputs/fileUpload/components/FileInputSettings.tsx b/apps/builder/src/features/blocks/inputs/fileUpload/components/FileInputSettings.tsx index d08dd1fdf..fcedcf13e 100644 --- a/apps/builder/src/features/blocks/inputs/fileUpload/components/FileInputSettings.tsx +++ b/apps/builder/src/features/blocks/inputs/fileUpload/components/FileInputSettings.tsx @@ -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} /> - - - Size limit (MB): - + - + MB + + Placeholder: - - - Min: - - - - - - Max: - - - - - - Step: - - - + + + Save answer in a variable: diff --git a/apps/builder/src/features/blocks/integrations/sendEmail/components/SendEmailSettings/SmtpConfigForm.tsx b/apps/builder/src/features/blocks/integrations/sendEmail/components/SendEmailSettings/SmtpConfigForm.tsx index 41ccac77c..8cd773af6 100644 --- a/apps/builder/src/features/blocks/integrations/sendEmail/components/SendEmailSettings/SmtpConfigForm.tsx +++ b/apps/builder/src/features/blocks/integrations/sendEmail/components/SendEmailSettings/SmtpConfigForm.tsx @@ -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." /> - - Port number: - - + ) } diff --git a/apps/builder/src/features/blocks/logic/typebotLink/typebotLink.spec.ts b/apps/builder/src/features/blocks/logic/typebotLink/typebotLink.spec.ts index 9d02744fc..6362d8cfe 100644 --- a/apps/builder/src/features/blocks/logic/typebotLink/typebotLink.spec.ts +++ b/apps/builder/src/features/blocks/logic/typebotLink/typebotLink.spec.ts @@ -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, }) diff --git a/apps/builder/src/features/settings/components/TypingEmulationForm.tsx b/apps/builder/src/features/settings/components/TypingEmulationForm.tsx index 9beb4c717..42a9012b1 100644 --- a/apps/builder/src/features/settings/components/TypingEmulationForm.tsx +++ b/apps/builder/src/features/settings/components/TypingEmulationForm.tsx @@ -36,32 +36,24 @@ export const TypingEmulationForm = ({ typingEmulation, onUpdate }: Props) => { {typingEmulation.enabled && ( - - - Words per minutes: - - - - - - Max delay (in seconds): - - - + + )} diff --git a/apps/viewer/src/features/chat/api/utils/executeGroup.ts b/apps/viewer/src/features/chat/api/utils/executeGroup.ts index e24d4e36c..1d1d189ad 100644 --- a/apps/viewer/src/features/chat/api/utils/executeGroup.ts +++ b/apps/viewer/src/features/chat/api/utils/executeGroup.ts @@ -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) + } + } diff --git a/package.json b/package.json index 71dd4c650..f698f2c0e 100644 --- a/package.json +++ b/package.json @@ -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" } diff --git a/packages/bot-engine/src/features/blocks/bubbles/embed/components/EmbedBubble.tsx b/packages/bot-engine/src/features/blocks/bubbles/embed/components/EmbedBubble.tsx index ec4817540..1268c0baa 100644 --- a/packages/bot-engine/src/features/blocks/bubbles/embed/components/EmbedBubble.tsx +++ b/packages/bot-engine/src/features/blocks/bubbles/embed/components/EmbedBubble.tsx @@ -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 (
@@ -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', }} /> diff --git a/packages/models/features/blocks/bubbles/embed.ts b/packages/models/features/blocks/bubbles/embed.ts index 205ab7a18..29b2048ce 100644 --- a/packages/models/features/blocks/bubbles/embed.ts +++ b/packages/models/features/blocks/bubbles/embed.ts @@ -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( diff --git a/packages/models/features/chat.ts b/packages/models/features/chat.ts index 017c8e7a7..0b949ff52 100644 --- a/packages/models/features/chat.ts +++ b/packages/models/features/chat.ts @@ -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 diff --git a/packages/models/features/utils.ts b/packages/models/features/utils.ts index 0dbc17252..29ea3366c 100644 --- a/packages/models/features/utils.ts +++ b/packages/models/features/utils.ts @@ -7,3 +7,9 @@ export const schemaForType = >(arg: S) => { return arg } + +export const variableStringSchema = z.custom<`{{${string}}}`>((val) => + /^{{.+}}$/g.test(val as string) +) + +export type VariableString = z.infer diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fcf00ead5..aa7d4ca62 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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: