diff --git a/lerna.json b/lerna.json index 5da1d799..c9db3d1e 100644 --- a/lerna.json +++ b/lerna.json @@ -1,4 +1,4 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", - "version": "2.0.4" + "version": "2.1.0" } \ No newline at end of file diff --git a/packages/cli/package.json b/packages/cli/package.json index 0a4855a6..fbe13b3e 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@codeblitzjs/ide-cli", - "version": "2.0.4", + "version": "2.1.0", "description": "@codeblitzjs/ide-cli", "main": "lib/commander.js", "files": [ diff --git a/packages/code-api/package.json b/packages/code-api/package.json index f61146e7..cdba13f9 100644 --- a/packages/code-api/package.json +++ b/packages/code-api/package.json @@ -1,6 +1,6 @@ { "name": "@codeblitzjs/ide-code-api", - "version": "2.0.4", + "version": "2.1.0", "description": "@codeblitzjs/ide-code-api", "main": "lib/index.js", "typings": "lib/index.d.ts", diff --git a/packages/code-service/package.json b/packages/code-service/package.json index 737f0a07..266cde9a 100644 --- a/packages/code-service/package.json +++ b/packages/code-service/package.json @@ -1,6 +1,6 @@ { "name": "@codeblitzjs/ide-code-service", - "version": "2.0.4", + "version": "2.1.0", "description": "@codeblitzjs/ide-code-service", "main": "lib/index.js", "typings": "lib/index.d.ts", diff --git a/packages/common/package.json b/packages/common/package.json index 53f87700..66117ac9 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@codeblitzjs/ide-common", - "version": "2.0.4", + "version": "2.1.0", "description": "@codeblitzjs/ide-common", "main": "lib/index.js", "typing": "lib/index.d.ts", diff --git a/packages/core/package.json b/packages/core/package.json index 1189665c..4f584582 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@codeblitzjs/ide-core", - "version": "2.0.4", + "version": "2.1.0", "description": "@codeblitzjs/ide-core", "main": "lib/index.js", "typings": "lib/index.d.ts", diff --git a/packages/core/src/api/createEditor.tsx b/packages/core/src/api/createEditor.tsx index ce3bc4fe..4dab65a2 100644 --- a/packages/core/src/api/createEditor.tsx +++ b/packages/core/src/api/createEditor.tsx @@ -30,7 +30,7 @@ import { IAppInstance, IConfig } from './types'; export { BoxPanel, SlotLocation, SlotRenderer, SplitPanel }; -const getDefaultAppConfig = (): IAppOpts => ({ +const getDefaultEditorAppConfig = (): IAppOpts => ({ modules: getModules(), useCdnIcon: true, noExtHost: true, @@ -62,7 +62,7 @@ const getDefaultAppConfig = (): IAppOpts => ({ }); export function createEditor({ appConfig, runtimeConfig }: IConfig): IAppInstance { - const opts = interceptAppOpts(mergeConfig(getDefaultAppConfig(), appConfig), runtimeConfig); + const opts = interceptAppOpts(mergeConfig(getDefaultEditorAppConfig(), appConfig), runtimeConfig); if (!opts.workspaceDir) { throw new Error( diff --git a/packages/core/src/core/diff-viewer/internal/base.ts b/packages/core/src/core/diff-viewer/internal/base.ts index 865ef036..8a231d1e 100644 --- a/packages/core/src/core/diff-viewer/internal/base.ts +++ b/packages/core/src/core/diff-viewer/internal/base.ts @@ -1,6 +1,6 @@ import { fsExtra, isFilesystemReady } from '@codeblitzjs/ide-sumi-core'; import { InlineChatHandler } from '@opensumi/ide-ai-native/lib/browser/widget/inline-chat/inline-chat.handler'; -import { AppConfig, ClientAppContribution, EDITOR_COMMANDS, IClientApp } from '@opensumi/ide-core-browser'; +import { AppConfig, ClientAppContribution, EDITOR_COMMANDS } from '@opensumi/ide-core-browser'; import { Disposable, DisposableStore, @@ -10,14 +10,12 @@ import { IChatProgress, ILogger, isArray, - isWindows, MaybePromise, Sequencer, URI, } from '@opensumi/ide-core-common'; import { IResourceOpenOptions, WorkbenchEditorService } from '@opensumi/ide-editor'; import { Selection, SelectionDirection } from '@opensumi/ide-monaco'; -import { toSlashes } from '@opensumi/ide-utils/lib/path'; import { Autowired } from '@opensumi/di'; import { InlineChatController } from '@opensumi/ide-ai-native/lib/browser/widget/inline-chat/inline-chat-controller'; @@ -87,12 +85,8 @@ export class DiffViewerContribution implements ClientAppContribution, MenuContri return URI.file(this.getFullPath(filePath)); } - normalizePath(filePath: string) { - let result = removeStart(filePath, this.appConfig.workspaceDir); - if (isWindows) { - result = toSlashes(result); - } - + normalizePath(path: string) { + let result = removeStart(path, this.appConfig.workspaceDir); if (result.startsWith('/')) { return result.slice(1); } @@ -245,7 +239,7 @@ export class DiffViewerContribution implements ClientAppContribution, MenuContri }; getFilePathForEditor = (editor: IEditor) => { - return this.normalizePath(editor.currentUri!.codeUri.fsPath); + return this.normalizePath(editor.currentUri!.codeUri.path); }; getAllTabs = (): IDiffViewerTab[] => { @@ -254,7 +248,7 @@ export class DiffViewerContribution implements ClientAppContribution, MenuContri return resources.map((editor, idx) => ({ index: idx, - filePath: this.normalizePath(editor.uri.codeUri.fsPath), + filePath: this.normalizePath(editor.uri.codeUri.path), })); }; @@ -362,17 +356,16 @@ export class DiffViewerContribution implements ClientAppContribution, MenuContri this._disposables.add(disposable); disposable.addDispose(this.inlineDiffHandler.onPartialEditEvent((e) => { - const fsPath = e.uri.fsPath; + const path = e.uri.path; this._onPartialEditEvent.fire({ - filePath: this.normalizePath(fsPath), + filePath: this.normalizePath(path), ...e, }); })); disposable.addDispose(this.workbenchEditorService.onActiveResourceChange((e) => { - const _newPath = e?.uri.codeUri.fsPath; - let newPath = _newPath; + let newPath = e?.uri.codeUri.path; let currentIndex = -1; if (newPath) { currentIndex = this.getFileIndex(newPath); diff --git a/packages/core/src/core/editor/contributions/static-resource.contribution.ts b/packages/core/src/core/editor/contributions/static-resource.contribution.ts new file mode 100644 index 00000000..b0b6f061 --- /dev/null +++ b/packages/core/src/core/editor/contributions/static-resource.contribution.ts @@ -0,0 +1,66 @@ +import { Autowired, Injectable } from '@opensumi/di'; +import { AppConfig, Domain, path as paths, URI } from '@opensumi/ide-core-browser'; +import { + StaticResourceContribution as CoreStaticResourceContribution, + StaticResourceService, +} from '@opensumi/ide-core-browser/lib/static-resource'; +import { IWorkspaceService } from '@opensumi/ide-workspace'; +import { IPropsService } from '../../props.service'; +import { fromSCMUri } from '../../utils'; +import { CodeDocumentModel, EditorProps } from '../types'; + +const EXPRESS_SERVER_PATH = window.location.href; + +// file 文件资源 远程读取 +@Domain(CoreStaticResourceContribution) +export class EditorStaticResourceContribution implements CoreStaticResourceContribution { + @Autowired(AppConfig) + private readonly appConfig: AppConfig; + + @Autowired(IWorkspaceService) + private readonly workspaceService: IWorkspaceService; + + @Autowired(IPropsService) + propsService: IPropsService; + + registerStaticResolver(service: StaticResourceService): void { + // 用来打开 raw 文件,如 jpg + service.registerStaticResourceProvider({ + scheme: 'file', + resolveStaticResource: (uri: URI) => { + const documentModel = this.propsService.props.documentModel; + + if ( + !(this.appConfig.staticServicePath + || (documentModel && (documentModel as CodeDocumentModel).resolveStaticResourcePath)) + ) { + return uri; + } + + // 将 file 协议转为代码托管平台提供的 raw 服务 + const assetsUri = new URI(this.appConfig.staticServicePath!); + const rootUri = new URI(this.workspaceService.workspace?.uri!); + const relativePath = rootUri.relative(uri); + if (!relativePath) { + return uri; + } + + // FIXME: 由于 resolveStaticResource 是同步方法,这里 hardcode 了 workspaceManagerService 的实现 + let relativePathStr = relativePath.toString(); + + // trim leading whitespace + if (relativePathStr.startsWith(paths.Path.separator)) { + relativePathStr = relativePathStr.slice(1); + } + + if (documentModel && (documentModel as CodeDocumentModel).resolveStaticResourcePath) { + return (documentModel as CodeDocumentModel).resolveStaticResourcePath!( + documentModel as CodeDocumentModel, + ); + } + return assetsUri.withPath(assetsUri.path.join(relativePathStr)); + }, + roots: [this.appConfig.staticServicePath || EXPRESS_SERVER_PATH], + }); + } +} diff --git a/packages/core/src/core/editor/editor.module.ts b/packages/core/src/core/editor/editor.module.ts index 1943c0ed..18b0265d 100644 --- a/packages/core/src/core/editor/editor.module.ts +++ b/packages/core/src/core/editor/editor.module.ts @@ -58,9 +58,10 @@ import md5 from 'md5'; import * as path from 'path'; import { CodeBlitzCommandContribution } from '../commands'; import { IPropsService } from '../props.service'; +import { DefaultThemeGuardContribution } from '../providers'; import styles from '../style.module.less'; +import { EditorStaticResourceContribution } from './contributions/static-resource.contribution'; import { CodeDocumentModel, EditorProps, isCodeDocumentModel } from './types'; -import { DefaultThemeGuardContribution } from '../providers'; const ContextTrue = new RawContextKey('alex.context.true', undefined); const ContextFalse = new RawContextKey('alex.context.false', undefined); @@ -740,5 +741,6 @@ export class EditorSpecialModule extends BrowserModule { DefaultThemeGuardContribution, EditorSpecialContribution, CodeBlitzCommandContribution, + EditorStaticResourceContribution, ]; } diff --git a/packages/core/src/core/editor/modules.ts b/packages/core/src/core/editor/modules.ts index f1066116..3c3b1e06 100644 --- a/packages/core/src/core/editor/modules.ts +++ b/packages/core/src/core/editor/modules.ts @@ -26,7 +26,7 @@ import { WorkspaceModule } from '@opensumi/ide-workspace/lib/browser'; * alex */ import { PluginModule } from '@codeblitzjs/ide-plugin'; -import { ClientModule, ServerModuleCollection } from '@codeblitzjs/ide-sumi-core'; +import { ClientModule, EditorServerModuleCollection } from '@codeblitzjs/ide-sumi-core'; /** * editor special @@ -66,7 +66,7 @@ export const getModules: () => ModuleConstructor[] = () => [ // CodeBlitz ClientModule, PluginModule, - ...ServerModuleCollection, + ...EditorServerModuleCollection, // Editor Special EditorSpecialModule, diff --git a/packages/core/src/core/editor/types.ts b/packages/core/src/core/editor/types.ts index ce26e04b..c7dd3193 100644 --- a/packages/core/src/core/editor/types.ts +++ b/packages/core/src/core/editor/types.ts @@ -1,3 +1,5 @@ +import { URI } from '@opensumi/ide-core-common'; + export interface DocumentModel { /** * 打开的文件路径 @@ -48,6 +50,8 @@ export interface CodeDocumentModel extends DocumentModel { * 仓库名 */ name: string; + + resolveStaticResourcePath?(documentModel: CodeDocumentModel): URI; } export interface EditorConfig { diff --git a/packages/core/src/core/utils.ts b/packages/core/src/core/utils.ts index ba6ab1aa..67a8d840 100644 --- a/packages/core/src/core/utils.ts +++ b/packages/core/src/core/utils.ts @@ -1,7 +1,6 @@ -import { IExtensionBasicMetadata } from '@codeblitzjs/ide-common'; import { IAppOpts } from '@codeblitzjs/ide-sumi-core'; import { ModuleConstructor } from '@opensumi/ide-core-browser'; -import { BuiltinTheme, getThemeId, getThemeType, IThemeContribution } from '@opensumi/ide-theme'; +import { URI } from '@opensumi/ide-core-common'; import { IAppConfig } from '../api/types'; @@ -68,3 +67,48 @@ export function createHook(obj: any, targetFunction: string, options: { } }; } + +interface SCMUriQueryParams { + ref: string; // commitId + branch?: string; // 分支名 +} + +interface SCMUriParams extends SCMUriQueryParams { + platform: string; // 例如 gitlab/gitlab 等 + repo: string; // groupName/repoName 项目名称 + path: string; // 文件路径 +} + +export function fromSCMUri(uri: URI): SCMUriParams { + const query = uri.getParsedQuery(); + + const result: SCMUriParams = { + platform: query.scheme, + repo: query.authority, + path: query.path, + ref: query.ref, + }; + + if (query.branch) { + result.branch = query.branch; + } + + return result; +} + +export function toSCMUri(uriParams: SCMUriParams) { + const query: SCMUriQueryParams = { + ref: uriParams.ref, + }; + + if (uriParams.branch) { + query.branch = uriParams.branch; + } + + return URI.from({ + scheme: uriParams.platform, + authority: uriParams.repo, + path: uriParams.path, + query: JSON.stringify(query), + }); +} diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 86402d70..60570ae8 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@codeblitzjs/ide-i18n", - "version": "2.0.4", + "version": "2.1.0", "description": "@codeblitzjs/ide-i18n", "main": "lib/index.js", "typings": "lib/index.d.ts", diff --git a/packages/plugin/package.json b/packages/plugin/package.json index e2eac8bb..92852a97 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -1,6 +1,6 @@ { "name": "@codeblitzjs/ide-plugin", - "version": "2.0.4", + "version": "2.1.0", "description": "@codeblitzjs/ide-plugin", "main": "lib/index.js", "typings": "lib/index.d.ts", diff --git a/packages/registry/package.json b/packages/registry/package.json index 044677f7..fe48461b 100644 --- a/packages/registry/package.json +++ b/packages/registry/package.json @@ -1,6 +1,6 @@ { "name": "@codeblitzjs/ide-registry", - "version": "2.0.4", + "version": "2.1.0", "description": "@codeblitzjs/ide-registry", "main": "lib/index.js", "typings": "lib/index.d.ts", diff --git a/packages/startup/package.json b/packages/startup/package.json index 4243dcb1..3ebfeb63 100644 --- a/packages/startup/package.json +++ b/packages/startup/package.json @@ -1,6 +1,6 @@ { "name": "@codeblitzjs/ide-startup", - "version": "2.0.4", + "version": "2.1.0", "description": "@codeblitzjs/ide-startup", "main": "lib/index.js", "typing": "types/index.d.ts", diff --git a/packages/startup/src/editor/index.tsx b/packages/startup/src/editor/index.tsx index e17982a0..9958a417 100644 --- a/packages/startup/src/editor/index.tsx +++ b/packages/startup/src/editor/index.tsx @@ -12,6 +12,10 @@ import Cascader from 'antd/lib/cascader'; import Select from 'antd/lib/select'; import './style.less'; import { request } from '@codeblitzjs/ide-common'; +import { URI } from '@opensumi/ide-core-common'; + +import { CodeDocumentModel } from '@codeblitzjs/ide-core/lib/core/editor/types'; +import { getFileTypeByExt } from '@codeblitzjs/ide-core/lib/modules/opensumi__ide-file-service'; import { LocalExtensionModule } from '../common/local-extension.module'; import * as editorPlugin from './plugin'; @@ -29,7 +33,7 @@ const fileOptions = (function transform(obj) { }); })({ 'opensumi/core': { - main: ['README.md', 'package.json'], + main: ['README.md', 'package.json', 'packages/design/src/browser/style/images/design-background-light.png'], }, }); @@ -46,6 +50,8 @@ const App = () => { [30, 40], ]); + const staticServicePath = `https://raw.githubusercontent.com`; + const readFile = async (filepath: string) => { const res = await request( `https://api.github.com/repos/${project}/contents/${filepath}?ref=${ref}`, @@ -170,7 +176,11 @@ const App = () => { startupEditor: 'none', // hideEditorTab: true, resolveFileType(path) { - return 'text'; + const ext = path.split('.').pop(); + if (!ext) { + return 'text'; + } + return getFileTypeByExt(ext); }, }} editorConfig={{ @@ -194,6 +204,11 @@ const App = () => { onLineNumberChange(num) { setLineNumber(num); }, + resolveStaticResourcePath(documentModel: CodeDocumentModel) { + return URI.parse( + `${staticServicePath}/${documentModel.owner}/${documentModel.name}/${documentModel.ref}/${documentModel.filepath}`, + ); + }, }} /> ) diff --git a/packages/sumi-core/package.json b/packages/sumi-core/package.json index 85791d32..f8bd689c 100644 --- a/packages/sumi-core/package.json +++ b/packages/sumi-core/package.json @@ -1,6 +1,6 @@ { "name": "@codeblitzjs/ide-sumi-core", - "version": "2.0.4", + "version": "2.1.0", "description": "core", "main": "lib/index.js", "typings": "lib/index.d.ts", diff --git a/packages/sumi-core/src/common/types.ts b/packages/sumi-core/src/common/types.ts index 345a1823..65a53678 100644 --- a/packages/sumi-core/src/common/types.ts +++ b/packages/sumi-core/src/common/types.ts @@ -8,6 +8,7 @@ import { IChatProgress, IReporter, } from '@opensumi/ide-core-common'; +import { EditorFileType } from '@opensumi/ide-file-service/lib/common'; import { ITheme } from '@opensumi/ide-theme'; import { SumiReadableStream } from '@opensumi/ide-utils/lib/stream'; import { FileSystemConfiguration, FileSystemInstance } from '../server/node'; @@ -212,7 +213,7 @@ export interface RuntimeConfig { * 当文件后缀名判断格式 不满足条件时,可通过此配置项进行自定义 * 优先会从语法服务中获取类型 */ - resolveFileType?: (path: string) => 'image' | 'text' | 'video' | undefined; + resolveFileType?: (path: string) => 'image' | 'text' | 'video' | undefined | EditorFileType; /** * AI Native 相关配置 diff --git a/packages/sumi-core/src/server/core/app.ts b/packages/sumi-core/src/server/core/app.ts index 50f1aaaf..561e487f 100644 --- a/packages/sumi-core/src/server/core/app.ts +++ b/packages/sumi-core/src/server/core/app.ts @@ -111,7 +111,7 @@ export class ServerApp implements IServerApp { public rootFS: RootFS; - private disposeCollection = new DisposableCollection(); + private _disposables = new DisposableCollection(); constructor( opts: IServerAppOpts & { @@ -149,7 +149,7 @@ export class ServerApp implements IServerApp { }; window.addEventListener('unload', handleUnload); - this.disposeCollection.push({ + this._disposables.push({ dispose: () => { window.removeEventListener('unload', handleUnload); }, @@ -191,7 +191,7 @@ export class ServerApp implements IServerApp { try { const runtimeConfig: RuntimeConfig = this.injector.get(RuntimeConfig); this.rootFS = await initializeRootFileSystem(); - this.disposeCollection.push( + this._disposables.push( await initializeHomeFileSystem(this.rootFS, runtimeConfig.scenario), ); @@ -223,8 +223,8 @@ export class ServerApp implements IServerApp { async start() { await this.launch(); await this.initializeContribution(); - const commonChannelPathHandler = this.injector.get(CommonChannelPathHandler); - const handler = new CodeblitzCommonChannelHandler('codeblitz-server', commonChannelPathHandler); + const pathHandler = this.injector.get(CommonChannelPathHandler); + const handler = new CodeblitzCommonChannelHandler('codeblitz-server', pathHandler); const channel = this.injector.get(InMemoryMessageChannel) as InMemoryMessageChannel; handler.receiveConnection(new CodeBlitzConnection(channel.port2)); @@ -236,11 +236,11 @@ export class ServerApp implements IServerApp { dispose: () => {}, }; - commonChannelPathHandler.register(RPCServiceChannelPath, channelHandler); + pathHandler.register(RPCServiceChannelPath, channelHandler); - this.disposeCollection.push({ + this._disposables.push({ dispose: () => { - commonChannelPathHandler.removeHandler(RPCServiceChannelPath, channelHandler); + pathHandler.removeHandler(RPCServiceChannelPath, channelHandler); }, }); @@ -252,7 +252,7 @@ export class ServerApp implements IServerApp { } dispose() { - this.disposeCollection.dispose(); + this._disposables.dispose(); } } diff --git a/packages/sumi-core/src/server/file-service/encoding.ts b/packages/sumi-core/src/server/file-service/encoding.ts index b3fc9228..1df5ad0d 100644 --- a/packages/sumi-core/src/server/file-service/encoding.ts +++ b/packages/sumi-core/src/server/file-service/encoding.ts @@ -159,19 +159,6 @@ export function detectEncodingByBuffer(buffer: Buffer): string | null { return mapped || normalizedEncodingName; } -// export function detectEncodingByURI(uri: URI): string | null { -// const filePath = FileUri.fsPath(uri); -// const fd = fs.openSync(filePath, 'r'); -// const maxLength = 100; -// let buffer = Buffer.allocUnsafe(maxLength); -// const readLength = fs.readSync(fd, buffer, 0, maxLength, null); - -// // Reset real length -// buffer = buffer.slice(0, readLength); -// fs.closeSync(fd); -// return detectEncodingByBuffer(buffer); -// } - export function getEncodingInfo(encoding: string | null): null | EncodingInfo { if (!encoding) { return null; diff --git a/packages/sumi-core/src/server/file-service/file-service-watcher.ts b/packages/sumi-core/src/server/file-service/file-service-watcher.ts index d9098665..f1c74b72 100644 --- a/packages/sumi-core/src/server/file-service/file-service-watcher.ts +++ b/packages/sumi-core/src/server/file-service/file-service-watcher.ts @@ -140,12 +140,12 @@ export class FWFileSystemWatcherServer implements IFileSystemWatcherServer { protected async lookup(path: string, count: number = 3) { let uri = new URI(path); let times = 0; - while (!(await fse.pathExists(uri.codeUri.fsPath)) && times <= count) { + while (!(await fse.pathExists(uri.codeUri.path)) && times <= count) { uri = uri.parent; times++; } - if (await fse.pathExists(uri.codeUri.fsPath)) { - return uri.codeUri.fsPath; + if (await fse.pathExists(uri.codeUri.path)) { + return uri.codeUri.path; } else { return ''; } diff --git a/packages/sumi-core/src/server/index.ts b/packages/sumi-core/src/server/index.ts index 6f0be113..5eaf1adb 100644 --- a/packages/sumi-core/src/server/index.ts +++ b/packages/sumi-core/src/server/index.ts @@ -1,3 +1,4 @@ +import { ModuleConstructor } from '@opensumi/ide-core-browser'; import { ServerCommonModule } from './core/common.module'; import { ExtensionManagerModule } from './extension-manager'; import { FileSchemeNodeModule } from './file-scheme'; @@ -33,4 +34,10 @@ export const ServerModuleCollection = [ FileSearchModule, SearchModule, ExtensionManagerModule, -]; +] as ModuleConstructor[]; + +const editorDisabledModules = new Set([SearchModule] as ModuleConstructor[]); + +export const EditorServerModuleCollection = ServerModuleCollection.filter((m) => { + return !editorDisabledModules.has(m); +}); diff --git a/packages/sumi-core/src/server/search/base.ts b/packages/sumi-core/src/server/search/base.ts index 3b8f3511..6287ca3f 100644 --- a/packages/sumi-core/src/server/search/base.ts +++ b/packages/sumi-core/src/server/search/base.ts @@ -7,7 +7,7 @@ export { SendClientResult, } from '@opensumi/ide-search/lib/common'; -export const IContentSearchServer = Symbol('ContentSearchService'); +export const IContentSearchServer = Symbol('IContentSearchServer'); export interface IContentSearchServer extends _IContentSearchServer {} diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index 8a62f81b..6fd4f7ef 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -1,6 +1,6 @@ { "name": "@codeblitzjs/ide-toolkit", - "version": "2.0.4", + "version": "2.1.0", "description": "@codeblitzjs/ide-toolkit", "main": "index.js", "files": [