diff --git a/packages/ai-native/src/browser/components/ChatMarkdown.tsx b/packages/ai-native/src/browser/components/ChatMarkdown.tsx index a9f0a9cb43..52dc7141b5 100644 --- a/packages/ai-native/src/browser/components/ChatMarkdown.tsx +++ b/packages/ai-native/src/browser/components/ChatMarkdown.tsx @@ -1,5 +1,5 @@ import cls from 'classnames'; -import React, { ReactNode, useEffect, useRef, useState } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import { MarkdownReactParser, MarkdownReactRenderer } from '@opensumi/ide-components/lib/markdown-react'; import { IMarkedOptions, marked } from '@opensumi/ide-components/lib/utils'; diff --git a/packages/ai-native/src/browser/components/WelcomeMsg.tsx b/packages/ai-native/src/browser/components/WelcomeMsg.tsx index 088b3c3870..1a2c0d5ff6 100644 --- a/packages/ai-native/src/browser/components/WelcomeMsg.tsx +++ b/packages/ai-native/src/browser/components/WelcomeMsg.tsx @@ -14,7 +14,7 @@ import { import { isMarkdownString } from '@opensumi/monaco-editor-core/esm/vs/base/common/htmlContent'; import 'react-chat-elements/dist/main.css'; -import { IChatAgentService, IChatReplyFollowup, ISampleQuestions } from '../../common'; +import { IChatAgentService, ISampleQuestions } from '../../common'; import { ChatService } from '../chat/chat.api.service'; import { ChatFeatureRegistry } from '../chat/chat.feature.registry'; import { ChatRenderRegistry } from '../chat/chat.render.registry'; diff --git a/packages/components/src/icon/iconfont/iconManager.ts b/packages/components/src/icon/iconfont/iconManager.ts index cc8a997f55..7060170242 100644 --- a/packages/components/src/icon/iconfont/iconManager.ts +++ b/packages/components/src/icon/iconfont/iconManager.ts @@ -57,7 +57,7 @@ class IconManager { const iconValue = this._iconMap[this._ktIconPrefixes[lastIndex]][iconKey]; if (!iconValue) { - warning(false, '图标库缺失图标:' + iconKey); + warning(false, 'No icon found for ' + iconKey); return []; } return [`${this._ktIconPrefixes[lastIndex]}${iconValue}`]; diff --git a/packages/components/src/markdown-react/parse.tsx b/packages/components/src/markdown-react/parse.tsx index a596e844d5..61ba08bc68 100644 --- a/packages/components/src/markdown-react/parse.tsx +++ b/packages/components/src/markdown-react/parse.tsx @@ -1,5 +1,5 @@ import { marked } from 'marked'; -import { ReactNode } from 'react'; +import React, { ReactNode } from 'react'; import { HeadingLevels, MarkdownReactRenderer } from './render'; @@ -16,93 +16,115 @@ export class MarkdownReactParser extends marked.Renderer { } parse(tokens: marked.Token[]): ReactNode[] { - return tokens.map((token) => { - switch (token.type) { - case 'html': { - return this.renderer.html(token.text); - } - - case 'space': { - return null; - } - - case 'heading': { - const level = token.depth as HeadingLevels; - return this.renderer.heading(this.parseInline(token.tokens), level); - } - - case 'paragraph': { - return this.renderer.paragraph(this.parseInline(token.tokens)); - } - - case 'text': { - const textToken = token as marked.Tokens.Text; - return textToken.tokens ? this.parseInline(textToken.tokens) : token.text; - } - - case 'blockquote': { - const blockquoteToken = token as marked.Tokens.Blockquote; - const quote = this.parse(blockquoteToken.tokens); - return this.renderer.blockquote(quote); - } - - case 'list': { - const listToken = token as marked.Tokens.List; - - const children = listToken.items.map((item) => { - const listItemChildren: ReactNode[] = []; - - if (item.task) { - listItemChildren.push(this.renderer.checkbox(item.checked ?? false)); - } - - listItemChildren.push(this.parse(item.tokens)); - - return this.renderer.listItem(listItemChildren); - }); - - return this.renderer.list(children, token.ordered); - } - - case 'code': { - return this.renderer.code(token.text, token.lang); - } - - case 'table': { - const tableToken = token as marked.Tokens.Table; - const headerCells = tableToken.header.map((cell, index) => - this.renderer.tableCell(this.parseInline(cell.tokens), { header: true, align: token.align[index] }), - ); - - const headerRow = this.renderer.tableRow(headerCells); - const header = this.renderer.tableHeader(headerRow); - - const bodyChilren = tableToken.rows.map((row) => { - const rowChildren = row.map((cell, index) => - this.renderer.tableCell(this.parseInline(cell.tokens), { - header: false, - align: token.align[index], - }), + return tokens.map((token, index) => { + const element = (() => { + switch (token.type) { + case 'html': { + return this.renderer.html(token.text); + } + + case 'space': { + return null; + } + + case 'heading': { + const level = token.depth as HeadingLevels; + return this.renderer.heading(this.parseInline(token.tokens), level); + } + + case 'paragraph': { + return this.renderer.paragraph(this.parseInline(token.tokens)); + } + + case 'text': { + const textToken = token as marked.Tokens.Text; + return textToken.tokens ? this.parseInline(textToken.tokens) : token.text; + } + + case 'blockquote': { + const blockquoteToken = token as marked.Tokens.Blockquote; + const quote = this.parse(blockquoteToken.tokens); + return this.renderer.blockquote(quote); + } + + case 'list': { + const listToken = token as marked.Tokens.List; + + const children = listToken.items.map((item, itemIndex) => { + const listItemChildren: ReactNode[] = []; + + if (item.task) { + listItemChildren.push(this.renderer.checkbox(item.checked ?? false)); + } + + listItemChildren.push(this.parse(item.tokens)); + + return React.cloneElement(this.renderer.listItem(listItemChildren) as React.ReactElement, { + key: `list-item-${itemIndex}`, + }); + }); + + return this.renderer.list(children, token.ordered); + } + + case 'code': { + return this.renderer.code(token.text, token.lang); + } + + case 'table': { + const tableToken = token as marked.Tokens.Table; + const headerCells = tableToken.header.map((cell, cellIndex) => + React.cloneElement( + this.renderer.tableCell(this.parseInline(cell.tokens), { + header: true, + align: token.align[cellIndex], + }) as React.ReactElement, + { key: `header-cell-${cellIndex}` }, + ), ); - return this.renderer.tableRow(rowChildren); - }); - - const body = this.renderer.tableBody(bodyChilren); - - return this.renderer.table([header, body]); - } - - case 'hr': { - return this.renderer.hr(); - } - - default: { - // eslint-disable-next-line no-console - console.warn(`Token with "${token.type}" type was not found`); - return null; - } + const headerRow = React.cloneElement(this.renderer.tableRow(headerCells) as React.ReactElement, { + key: 'header-row', + }); + const header = this.renderer.tableHeader(headerRow); + + const bodyChilren = tableToken.rows.map((row, rowIndex) => { + const rowChildren = row.map((cell, cellIndex) => + React.cloneElement( + this.renderer.tableCell(this.parseInline(cell.tokens), { + header: false, + align: token.align[cellIndex], + }) as React.ReactElement, + { key: `body-cell-${rowIndex}-${cellIndex}` }, + ), + ); + + return React.cloneElement(this.renderer.tableRow(rowChildren) as React.ReactElement, { + key: `body-row-${rowIndex}`, + }); + }); + + const body = this.renderer.tableBody(bodyChilren); + + return this.renderer.table([header, body]); + } + + case 'hr': { + return this.renderer.hr(); + } + + default: { + // eslint-disable-next-line no-console + console.warn(`Token with "${token.type}" type was not found`); + return null; + } + } + })(); + + if (React.isValidElement(element)) { + return React.cloneElement(element, { key: `token-${index}` }); } + return element; }); } diff --git a/packages/components/src/utils/warning.ts b/packages/components/src/utils/warning.ts index e5f5b28907..05857fad52 100644 --- a/packages/components/src/utils/warning.ts +++ b/packages/components/src/utils/warning.ts @@ -4,7 +4,7 @@ export function warning(valid: boolean, message: string) { // Support uglify if (process.env.NODE_ENV !== 'production' && !valid && console !== undefined) { // eslint-disable-next-line no-console - console.error(`Warning: ${message}`); + console.warn(`Warning: ${message}`); } } diff --git a/packages/connection/src/common/rpc/connection.ts b/packages/connection/src/common/rpc/connection.ts index d3c3fb7488..8d4883dc2b 100644 --- a/packages/connection/src/common/rpc/connection.ts +++ b/packages/connection/src/common/rpc/connection.ts @@ -202,6 +202,12 @@ export class SumiConnection implements IDisposable { const opType = message.kind; const requestId = message.requestId; + if (opType === OperationType.Error) { + this.logger.warn( + `[${message.requestId}] Error received from server method ${message.method}: ${message.error}`, + ); + } + switch (opType) { case OperationType.Error: case OperationType.Response: { diff --git a/packages/core-browser/src/react-providers/config-provider.tsx b/packages/core-browser/src/react-providers/config-provider.tsx index 87eaff31c2..3bb1dc8550 100644 --- a/packages/core-browser/src/react-providers/config-provider.tsx +++ b/packages/core-browser/src/react-providers/config-provider.tsx @@ -387,6 +387,6 @@ export function getCDNHref( } } -export function getTreeSitterWasmCDNUri(CDNType: string = 'alipay') { +export function getTreeSitterWasmCDNUri(CDNType: string = 'npmmirror') { return getCDNHref('@opensumi/tree-sitter-wasm', '', '0.0.2', CDNType as TComponentCDNType); } diff --git a/packages/file-tree-next/src/browser/services/file-tree-api.service.ts b/packages/file-tree-next/src/browser/services/file-tree-api.service.ts index 80dac48330..f704b78f1d 100644 --- a/packages/file-tree-next/src/browser/services/file-tree-api.service.ts +++ b/packages/file-tree-next/src/browser/services/file-tree-api.service.ts @@ -26,7 +26,6 @@ export class FileTreeAPI implements IFileTreeAPI { @Autowired(IDialogService) private readonly dialogService: IDialogService; - private cacheFileStat: Map = new Map(); private userhomePath: URI; diff --git a/packages/terminal-next/src/browser/component/resize.view.tsx b/packages/terminal-next/src/browser/component/resize.view.tsx index 2ab14fa8d5..96fa2e702d 100644 --- a/packages/terminal-next/src/browser/component/resize.view.tsx +++ b/packages/terminal-next/src/browser/component/resize.view.tsx @@ -24,7 +24,6 @@ export interface IResizeViewProps { const ResizeItem = ({ index, widget, wholeWidth, setEvent, self, left, right, last }) => { const shadowDynamic = useAutorun(widget.shadowDynamic); - return (
{ return ( { {widgets && widgets.map((widget) => (