@@ -243,11 +243,17 @@ export const ChipExpressionBaseComponent = (props: ChipExpressionBaseComponentPr
243243 const cursorPositionAfterUpdate = getAbsoluteCaretPositionFromModel ( updatedModel ) ;
244244 const cursorDelta = updatedValue . length - props . value . length ;
245245
246+ // Check if expression model contains merged tokens (document or variable with interpolations)
247+ // These tokens have metadata and are created by merging multiple sub-tokens
248+ const hasMergedTokens = expressionModel ?. some ( el => el . metadata !== undefined ) || false ;
249+
246250 // Update tokens based on cursor movement
251+ // Skip manual token updates if merged tokens are present to avoid breaking their structure
247252 const previousFullText = getTextValueFromExpressionModel ( expressionModel ) ;
248- const updatedTokens = updateTokens ( tokens , cursorPositionBeforeUpdate , cursorDelta , previousFullText ) ;
253+ const updatedTokens = hasMergedTokens ? tokens : updateTokens ( tokens , cursorPositionBeforeUpdate , cursorDelta , previousFullText ) ;
249254
250- const shouldUpdateTokens = ( ! lastTypedText ?. startsWith ( '#$' ) || lastTypedText === BACKSPACE_MARKER )
255+ const shouldUpdateTokens = ! hasMergedTokens
256+ && ( ! lastTypedText ?. startsWith ( '#$' ) || lastTypedText === BACKSPACE_MARKER )
251257 && JSON . stringify ( updatedTokens ) !== JSON . stringify ( tokens ) ;
252258
253259 if ( shouldUpdateTokens ) {
@@ -267,7 +273,8 @@ export const ChipExpressionBaseComponent = (props: ChipExpressionBaseComponentPr
267273 }
268274
269275 // Determine if we need to fetch new tokens
270- if ( shouldFetchNewTokens ( lastTypedText ) ) {
276+ // Always fetch new tokens if merged tokens are present to maintain their structure
277+ if ( hasMergedTokens || shouldFetchNewTokens ( lastTypedText ) ) {
271278 fetchnewTokensRef . current = true ;
272279 }
273280
0 commit comments