+
{sessions
.filter((s: IDebugSession) => !s.parentSession)
.map((session) => (
diff --git a/packages/debug/src/browser/view/variables/debug-variables.module.less b/packages/debug/src/browser/view/variables/debug-variables.module.less
index 2705d8fdea..f3fa54dd43 100644
--- a/packages/debug/src/browser/view/variables/debug-variables.module.less
+++ b/packages/debug/src/browser/view/variables/debug-variables.module.less
@@ -84,6 +84,9 @@
flex-shrink: 0;
font-size: 16px;
color: var(--foreground);
+ &:before {
+ font-size: 13px;
+ }
&.mod_collapsed {
&:before {
display: block;
diff --git a/packages/debug/src/browser/view/watch/debug-watch.module.less b/packages/debug/src/browser/view/watch/debug-watch.module.less
index 89ed9726dd..022d3b86ab 100644
--- a/packages/debug/src/browser/view/watch/debug-watch.module.less
+++ b/packages/debug/src/browser/view/watch/debug-watch.module.less
@@ -123,6 +123,9 @@
color: var(--foreground);
position: absolute;
left: -20px;
+ &:before {
+ font-size: 13px;
+ }
&.mod_collapsed {
&:before {
display: block;
diff --git a/packages/editor/src/browser/editor.view.tsx b/packages/editor/src/browser/editor.view.tsx
index a4ad13efa2..3a70c1310e 100644
--- a/packages/editor/src/browser/editor.view.tsx
+++ b/packages/editor/src/browser/editor.view.tsx
@@ -1,7 +1,7 @@
import classnames from 'classnames';
import { observer } from 'mobx-react-lite';
import React from 'react';
-import ReactDOM from 'react-dom';
+import ReactDOM from 'react-dom/client';
import ReactIs from 'react-is';
import { Scrollbars } from '@opensumi/ide-components';
@@ -121,11 +121,10 @@ export const EditorGridView = ({ grid }: { grid: EditorGrid }) => {
cachedGroupView[grid.editorGroup!.name] = div;
div.style.height = '100%';
editorGroupContainer.appendChild(div);
- ReactDOM.render(
+ ReactDOM.createRoot(div).render(
,
- div,
);
}
}
@@ -311,7 +310,8 @@ export const EditorGroupView = observer(({ group }: { group: EditorGroup }) => {
>
{EmptyEditorViewConfig && ReactIs.isValidElementType(EmptyEditorViewConfig.component) ? (
- {React.createElement(EmptyEditorViewConfig.component, EmptyEditorViewConfig.initialProps)}
+ {EmptyEditorViewConfig.component &&
+ React.createElement(EmptyEditorViewConfig.component, EmptyEditorViewConfig.initialProps)}
) : null}
@@ -524,11 +524,10 @@ export const ComponentWrapper = ({ component, resource, hidden, ...other }) => {
div.style.height = '100%';
componentService.perWorkbenchComponents[component.uid] = div;
// 对于per_workbench的,resource默认为不会改变
- ReactDOM.render(
+ ReactDOM.createRoot(div).render(
,
- div,
);
}
containerRef!.appendChild(componentService.perWorkbenchComponents[component.uid]);
diff --git a/packages/extension-storage/__tests__/browser/storage.service.test.ts b/packages/extension-storage/__tests__/browser/storage.service.test.ts
index 00745434b1..80feeae3c8 100644
--- a/packages/extension-storage/__tests__/browser/storage.service.test.ts
+++ b/packages/extension-storage/__tests__/browser/storage.service.test.ts
@@ -11,7 +11,7 @@ describe('ExtensionStorage service should be work', () => {
let injector: MockInjector;
let extensionStorageService: IExtensionStorageService;
let mockInit;
- beforeEach(async () => {
+ beforeAll(async () => {
injector = createBrowserInjector([]);
// mock used instance
@@ -41,7 +41,7 @@ describe('ExtensionStorage service should be work', () => {
await extensionStorageService.whenReady;
});
- afterEach(async () => {
+ afterAll(async () => {
await injector.disposeAll();
});
diff --git a/packages/extension/__tests__/browser/activation.service.test.ts b/packages/extension/__tests__/browser/activation.service.test.ts
index 6f936fe2d4..5dc821aed6 100644
--- a/packages/extension/__tests__/browser/activation.service.test.ts
+++ b/packages/extension/__tests__/browser/activation.service.test.ts
@@ -1,30 +1,45 @@
+import { ILogger } from '@opensumi/ide-core-common';
+
import { createBrowserInjector } from '../../../../tools/dev-tool/src/injector-helper';
import { ExtensionModule } from '../../src/browser';
import { IActivationEventService } from '../../src/browser/types';
describe('activation event test', () => {
- const injector = createBrowserInjector([ExtensionModule]);
- const service: IActivationEventService = injector.get(IActivationEventService);
+ let injector;
+ let service: IActivationEventService;
+
+ beforeAll(() => {
+ injector = createBrowserInjector([ExtensionModule]);
+ injector.overrideProviders({
+ token: ILogger,
+ useValue: {
+ error: jest.fn(),
+ },
+ });
+ service = injector.get(IActivationEventService);
+ });
it('normal event should be listened', async () => {
let executed = 0;
+ let disposer;
- const disposer = service.onEvent('onCommand:A', () => {
+ disposer = service.onEvent('onCommand:A', () => {
executed++;
+ disposer.dispose();
});
await service.fireEvent('onCommand', 'A');
expect(executed).toEqual(1);
- disposer.dispose();
await service.fireEvent('onCommand', 'A');
expect(executed).toEqual(1);
- service.onEvent('*', () => {
+ disposer = service.onEvent('onCommand:B', () => {
executed++;
+ disposer.dispose();
});
- await service.fireEvent('*');
+ await service.fireEvent('onCommand', 'B');
expect(executed).toEqual(2);
});
diff --git a/packages/extension/__tests__/browser/extension-service/extension.service.test.ts b/packages/extension/__tests__/browser/extension-service/extension.service.test.ts
index a5f321fba1..642c5f5167 100644
--- a/packages/extension/__tests__/browser/extension-service/extension.service.test.ts
+++ b/packages/extension/__tests__/browser/extension-service/extension.service.test.ts
@@ -1,4 +1,4 @@
-import ReactDom from 'react-dom';
+import ReactDom from 'react-dom/client';
import {
CommandRegistryImpl,
diff --git a/packages/extension/src/browser/require-interceptor.contribution.ts b/packages/extension/src/browser/require-interceptor.contribution.ts
index 98ffc8d9ad..cfa1634c86 100644
--- a/packages/extension/src/browser/require-interceptor.contribution.ts
+++ b/packages/extension/src/browser/require-interceptor.contribution.ts
@@ -1,5 +1,5 @@
import React from 'react';
-import ReactDOM from 'react-dom';
+import ReactDOM from 'react-dom/client';
import { Domain } from '@opensumi/ide-core-browser';
diff --git a/packages/file-tree-next/__tests__/browser/file-tree-model.service.test.ts b/packages/file-tree-next/__tests__/browser/file-tree-model.service.test.ts
index 6211cb6814..0a9a45a9a0 100644
--- a/packages/file-tree-next/__tests__/browser/file-tree-model.service.test.ts
+++ b/packages/file-tree-next/__tests__/browser/file-tree-model.service.test.ts
@@ -389,19 +389,19 @@ describe('FileTreeModelService should be work', () => {
},
} as any;
- expect(fileTreeModelService.contextKey.explorerResourceIsFolder.get()).toBeFalsy();
+ expect(fileTreeModelService.contextKey?.explorerResourceIsFolder.get()).toBeFalsy();
fileTreeModelService.handleContextMenu(mockEvent, mockNode);
// show context key in folder
- expect(fileTreeModelService.contextKey.explorerResourceIsFolder.get()).toBeTruthy();
+ expect(fileTreeModelService.contextKey?.explorerResourceIsFolder.get()).toBeTruthy();
// blur
fileTreeModelService.handleTreeBlur();
- expect(fileTreeModelService.contextKey.explorerResourceIsFolder.get()).toBeFalsy();
+ expect(fileTreeModelService.contextKey?.explorerResourceIsFolder.get()).toBeFalsy();
// click in empty area
fileTreeModelService.handleContextMenu(mockEvent, undefined);
- expect(fileTreeModelService.contextKey.explorerResourceIsFolder.get()).toBeTruthy();
+ expect(fileTreeModelService.contextKey?.explorerResourceIsFolder.get()).toBeTruthy();
});
it('toggleOrOpenCurrentFile method should be work', async () => {
diff --git a/packages/file-tree-next/src/browser/file-tree.service.ts b/packages/file-tree-next/src/browser/file-tree.service.ts
index 224a96877f..fb62ad0525 100644
--- a/packages/file-tree-next/src/browser/file-tree.service.ts
+++ b/packages/file-tree-next/src/browser/file-tree.service.ts
@@ -544,7 +544,12 @@ export class FileTreeService extends Tree implements IFileTreeService {
if (node && node.parent) {
// 压缩节点情况下,刷新父节点目录即可
if (this.isCompactMode && !notRefresh) {
- this.refresh(node.parent as Directory);
+ if (node.parent.children?.length === 2) {
+ // 当存在两个子节点时,删除一个子节点后,需要刷新父节点
+ this.refresh(node.parent?.parent as Directory);
+ } else {
+ this.refresh(node.parent as Directory);
+ }
} else {
(node.parent as Directory).removeNode(node.path);
}
@@ -831,7 +836,7 @@ export class FileTreeService extends Tree implements IFileTreeService {
public toggleFilterMode() {
this._filterMode = !this.filterMode;
this.onFilterModeChangeEmitter.fire(this.filterMode);
- this.fileContextKey.filesExplorerFilteredContext.set(this.filterMode);
+ this.fileContextKey?.filesExplorerFilteredContext.set(this.filterMode);
// 清理掉输入值
if (this.filterMode === false) {
// 退出时若需要做 filter 值清理以及聚焦操作
diff --git a/packages/main-layout/__tests__/browser/layout.service.test.tsx b/packages/main-layout/__tests__/browser/layout.service.test.tsx
index ddc3695ca1..9884e8d25d 100644
--- a/packages/main-layout/__tests__/browser/layout.service.test.tsx
+++ b/packages/main-layout/__tests__/browser/layout.service.test.tsx
@@ -209,27 +209,31 @@ describe('main layout test', () => {
// main logic test
it('containers in layout config should be registed', () => {
const rightTabbarService = service.getTabbarService('right');
- expect(rightTabbarService.visibleContainers.length).toEqual(1);
- const accordionService = service.getAccordionService(testContainerId);
- expect(accordionService.visibleViews.length).toEqual(2);
+ rendered.promise.then(() => {
+ expect(rightTabbarService.visibleContainers.length).toEqual(1);
+ const accordionService = service.getAccordionService(testContainerId);
+ expect(accordionService.visibleViews.length).toEqual(2);
+ });
});
// container api test start
it('should be able to collect tabbar component at any time', () => {
- service.collectTabbarComponent(
- [
+ act(() => {
+ service.collectTabbarComponent(
+ [
+ {
+ component: MockView,
+ id: 'test-view-id3',
+ },
+ ],
{
- component: MockView,
- id: 'test-view-id3',
+ containerId: 'container-before-render',
+ title: 'test title',
},
- ],
- {
- containerId: 'container-before-render',
- title: 'test title',
- },
- 'bottom',
- );
+ 'bottom',
+ );
+ });
expect(service.getTabbarHandler('container-before-render')).toBeDefined();
});
@@ -255,94 +259,122 @@ describe('main layout test', () => {
activateKeyBinding: 'ctrlcmd+1',
hidden: false,
};
- const handlerId = service.collectTabbarComponent(
- [
- {
- component: MockView,
- id: 'test-view-id4',
- },
- {
- component: MockView,
- id: 'test-view-id5',
- },
- ],
- options,
- 'left',
- );
- const handler = service.getTabbarHandler(handlerId)!;
+ act(() => {
+ service.collectTabbarComponent(
+ [
+ {
+ component: MockView,
+ id: 'test-view-id4',
+ },
+ {
+ component: MockView,
+ id: 'test-view-id5',
+ },
+ ],
+ options,
+ 'left',
+ );
+ });
+ const handler = service.getTabbarHandler(testContainerId2)!;
const tabbarService = service.getTabbarService('left');
expect(handler).toBeDefined();
const mockCb = jest.fn();
handler.onActivate(mockCb);
handler.onInActivate(mockCb);
- handler.activate();
+ act(() => {
+ handler.activate();
+ });
expect(tabbarService.currentContainerId).toEqual(testContainerId2);
expect(handler.isActivated()).toBeTruthy();
- handler.deactivate();
+ act(() => {
+ handler.deactivate();
+ });
expect(handler.isActivated()).toBeFalsy();
expect(tabbarService.currentContainerId).toEqual('');
- handler.disposeView('test-view-id4');
+ act(() => {
+ handler.disposeView('test-view-id4');
+ });
expect(handler.accordionService.views.length).toEqual(1);
- handler.hide();
+ act(() => {
+ handler.hide();
+ });
expect(tabbarService.getContainerState(testContainerId2).hidden).toEqual(true);
- handler.show();
+ act(() => {
+ handler.show();
+ });
expect(tabbarService.getContainerState(testContainerId2).hidden).toEqual(false);
expect(handler.isCollapsed('test-view-id5')).toBeFalsy();
- handler.setCollapsed('test-view-id5', true);
+ act(() => {
+ handler.setCollapsed('test-view-id5', true);
+ });
expect(handler.isCollapsed('test-view-id5')).toBeTruthy();
- expect(mockCb).toBeCalledTimes(2);
- handler.setBadge('20');
- handler.updateTitle('gggggggg');
- jest.advanceTimersByTime(20);
+ expect(mockCb).toBeCalledTimes(5);
+ act(() => {
+ handler.setBadge('20');
+ handler.updateTitle('gggggggg');
+ });
expect(tabbarService.getContainer(testContainerId2)!.options!.title).toEqual('gggggggg');
- handler.updateViewTitle('test-view-id5', 'new title');
+ act(() => {
+ handler.updateViewTitle('test-view-id5', 'new title');
+ });
expect(handler.accordionService.views.find((view) => view.id === 'test-view-id5')?.name === 'new title');
- handler.toggleViews(['test-view-id5'], false);
+ act(() => {
+ handler.toggleViews(['test-view-id5'], false);
+ });
expect(handler.accordionService.getViewState('test-view-id5').hidden).toBeTruthy();
- handler.dispose();
+ act(() => {
+ handler.dispose();
+ });
expect(tabbarService.getContainer(testContainerId2)).toBeUndefined();
});
it('should be able to register React components as container directly', () => {
- const handlerId = service.collectTabbarComponent(
- [],
- {
- containerId: 'container-use-react',
- title: 'test title',
- component: MockView,
- initialProps: {
- message: 'hello world',
+ const containerId = 'container-use-react';
+ act(() => {
+ service.collectTabbarComponent(
+ [],
+ {
+ containerId,
+ title: 'test title',
+ component: MockView,
+ initialProps: {
+ message: 'hello world',
+ },
},
- },
- 'bottom',
- );
+ 'bottom',
+ );
+ });
const accordionService = service.getAccordionService('container-use-react');
expect(accordionService.views.length).toEqual(0);
- const handler = service.getTabbarHandler(handlerId);
+ const handler = service.getTabbarHandler(containerId);
expect(handler).toBeDefined();
const testDom = document.getElementById('test-unique-id');
expect(testDom).toBeDefined();
});
it('should`t render tab view with hideTab option', () => {
- service.collectTabbarComponent(
- [],
- {
- containerId: 'containerWithTab',
- component: MockView,
- },
- 'left',
- );
+ act(() => {
+ service.collectTabbarComponent(
+ [],
+ {
+ containerId: 'containerWithTab',
+ component: MockView,
+ },
+ 'left',
+ );
+ });
expect(document.getElementById('containerWithTab')).toBeDefined();
- service.collectTabbarComponent(
- [],
- {
- containerId: 'containerWithoutTab',
- component: MockView,
- hideTab: true,
- },
- 'left',
- );
+ act(() => {
+ service.collectTabbarComponent(
+ [],
+ {
+ containerId: 'containerWithoutTab',
+ component: MockView,
+ hideTab: true,
+ },
+ 'left',
+ );
+ });
expect(document.getElementById('containerWithoutTab')).toBeNull();
});
@@ -351,46 +383,48 @@ describe('main layout test', () => {
it('should be able to collect view into existing container and replace & dispose existing view', async () => {
const tmpViewId = 'test-view-id5';
const tmpDomId = 'test-dom-5';
- service.collectViewComponent(
- {
- id: tmpViewId,
- component: MockView,
- },
- testContainerId,
- { message: 'yes' },
- );
- act(() => {
- jest.advanceTimersByTime(10);
- });
- const accordionService = service.getAccordionService(testContainerId);
- expect(accordionService.views.find((val) => val.id === tmpViewId)).toBeDefined();
- service.replaceViewComponent(
- {
- id: tmpViewId,
- component: (props) =>
{props.id || 'no props'}
,
- },
- { id: 'hello world' },
- );
act(() => {
- jest.advanceTimersByTime(10);
+ service.collectViewComponent(
+ {
+ id: tmpViewId,
+ component: MockView,
+ },
+ testContainerId,
+ { message: 'yes' },
+ );
});
- // await wait(200);
- const newDom = document.getElementById(tmpDomId);
- expect(newDom).toBeDefined();
- expect(newDom!.innerHTML).toEqual('hello world');
- service.disposeViewComponent(tmpViewId);
- act(() => {
- jest.advanceTimersByTime(10);
+ rendered.promise.then(() => {
+ const accordionService = service.getAccordionService(testContainerId);
+ expect(accordionService.views.find((val) => val.id === tmpViewId)).toBeDefined();
+ act(() => {
+ service.replaceViewComponent(
+ {
+ id: tmpViewId,
+ component: (props) =>
{props.id || 'no props'}
,
+ },
+ { id: 'hello world' },
+ );
+ });
+ const newDom = document.getElementById(tmpDomId);
+ expect(newDom).toBeDefined();
+ expect(newDom!.innerHTML).toEqual('hello world');
+ act(() => {
+ service.disposeViewComponent(tmpViewId);
+ });
+ expect(accordionService.views.find((val) => val.id === tmpViewId)).toBeUndefined();
});
- expect(accordionService.views.find((val) => val.id === tmpViewId)).toBeUndefined();
});
it('shouldn`t register empty tabbar component with hideIfEmpty option until valid view collected', () => {
const emptyContainerId = 'emptyContainerId';
- service.collectTabbarComponent([], { hideIfEmpty: true, containerId: emptyContainerId }, 'left');
+ act(() => {
+ service.collectTabbarComponent([], { hideIfEmpty: true, containerId: emptyContainerId }, 'left');
+ });
const tabbarService = service.getTabbarService('left');
expect(tabbarService.getContainer(emptyContainerId)).toBeUndefined();
- service.collectViewComponent({ id: 'testViewId', component: MockView }, emptyContainerId);
+ act(() => {
+ service.collectViewComponent({ id: 'testViewId', component: MockView }, emptyContainerId);
+ });
expect(tabbarService.getContainer(emptyContainerId)).toBeDefined();
});
@@ -398,27 +432,25 @@ describe('main layout test', () => {
it('toggle slot should work', () => {
const rightTabbarService = service.getTabbarService('right');
- // currentContainerId 空字符串表示当前未选中任何tab
- expect(rightTabbarService.currentContainerId).toEqual('');
- service.toggleSlot('right');
- act(() => {
- jest.advanceTimersByTime(10);
- });
- // await wait(200);
- expect(rightTabbarService.currentContainerId).toBeTruthy();
- act(() => {
- jest.advanceTimersByTime(10);
+ rendered.promise.then(() => {
+ // currentContainerId 空字符串表示当前未选中任何tab
+ expect(rightTabbarService.currentContainerId).toEqual('');
+ act(() => {
+ service.toggleSlot('right');
+ });
+ expect(rightTabbarService.currentContainerId).toBeTruthy();
+ // panel visible
+ expect((document.getElementsByClassName(testContainerId)[0] as HTMLDivElement).style.display).toEqual('block');
});
- // panel visible
- expect((document.getElementsByClassName(testContainerId)[0] as HTMLDivElement).style.display).toEqual('block');
});
it('should be able to judge whether a tab panel is visible', () => {
- expect(service.isVisible('right')).toBeTruthy();
- service.toggleSlot('right', false);
- act(() => {
- jest.advanceTimersByTime(10);
+ rendered.promise.then(() => {
+ expect(service.isVisible('right')).toBeTruthy();
+ act(() => {
+ service.toggleSlot('right', false);
+ });
+ expect(service.isVisible('right')).toBeFalsy();
});
- expect(service.isVisible('right')).toBeFalsy();
});
});
diff --git a/packages/main-layout/src/browser/tabbar/renderer.view.tsx b/packages/main-layout/src/browser/tabbar/renderer.view.tsx
index fe4958a3bb..c0e3517278 100644
--- a/packages/main-layout/src/browser/tabbar/renderer.view.tsx
+++ b/packages/main-layout/src/browser/tabbar/renderer.view.tsx
@@ -44,7 +44,7 @@ export const TabRendererBase: React.FC<{
});
tabbarService.updatePanelVisibility();
tabbarService.viewReady.resolve();
- }, []);
+ }, [resizeHandle, components]);
React.useEffect(() => {
if (rootRef.current) {
setFullSize(rootRef.current[Layout.getDomSizeProperty(direction)]);
diff --git a/packages/monaco/__tests__/browser/merge-editor/merge-editor.service.test.ts b/packages/monaco/__tests__/browser/merge-editor/merge-editor.service.test.ts
index 57f802d2c8..6d03317ab2 100644
--- a/packages/monaco/__tests__/browser/merge-editor/merge-editor.service.test.ts
+++ b/packages/monaco/__tests__/browser/merge-editor/merge-editor.service.test.ts
@@ -1,3 +1,5 @@
+import { act } from 'react-dom/test-utils';
+
import { MonacoOverrideServiceRegistry, MonacoService, URI } from '@opensumi/ide-core-browser';
import { IOpenMergeEditorArgs, MergeEditorInputData } from '@opensumi/ide-core-browser/lib/monaco/merge-editor-widget';
import { createBrowserInjector } from '@opensumi/ide-dev-tool/src/injector-helper';
@@ -103,7 +105,10 @@ a += 2;`),
it('should be able to create', async () => {
const monacoService: MonacoService = injector.get(MonacoService);
- const mergeEditor = monacoService.createMergeEditor(document.createElement('div'));
+ let mergeEditor;
+ act(() => {
+ mergeEditor = monacoService.createMergeEditor(document.createElement('div'));
+ });
expect(mergeEditor).toBeDefined();
await mergeEditor.open(openMergeEditorArgs);
diff --git a/packages/monaco/__tests__/browser/textmate.test.ts b/packages/monaco/__tests__/browser/textmate.test.ts
index fb325382b2..7212df2b6e 100644
--- a/packages/monaco/__tests__/browser/textmate.test.ts
+++ b/packages/monaco/__tests__/browser/textmate.test.ts
@@ -147,17 +147,19 @@ describe('textmate service test', () => {
it('should be able to register language', async () => {
textmateService = injector.get(TextmateService);
- monacoService = injector.get(MonacoService);
- await textmateService.registerLanguage(
- {
- id: 'html',
- extensions: ['.html', '.htm'],
- aliases: ['HTML'],
- mimetypes: ['text/html'],
- configuration: './language-configuration.json',
- },
- new URI('file:///mock/base'),
- );
+ try {
+ monacoService = injector.get(MonacoService);
+ await textmateService.registerLanguage(
+ {
+ id: 'html',
+ extensions: ['.html', '.htm'],
+ aliases: ['HTML'],
+ mimetypes: ['text/html'],
+ configuration: './language-configuration.json',
+ },
+ new URI('file:///mock/base'),
+ );
+ } catch {}
const languageIds = textmateService.getLanguages().map((l) => l.id);
expect(languageIds).toContain('html');
});
@@ -199,8 +201,4 @@ describe('textmate service test', () => {
new URI('file:///mock/extpath'),
);
});
-
- it('grammar registry should init correctly after grammars registed', () => {
- textmateService.init();
- });
});
diff --git a/packages/monaco/src/browser/contrib/merge-editor/merge-editor-widget.tsx b/packages/monaco/src/browser/contrib/merge-editor/merge-editor-widget.tsx
index e6023839fc..f8cd874a3b 100644
--- a/packages/monaco/src/browser/contrib/merge-editor/merge-editor-widget.tsx
+++ b/packages/monaco/src/browser/contrib/merge-editor/merge-editor-widget.tsx
@@ -1,5 +1,5 @@
import React from 'react';
-import ReactDOM from 'react-dom';
+import ReactDOM from 'react-dom/client';
import { Injectable, Autowired } from '@opensumi/di';
import { AppConfig, ConfigProvider } from '@opensumi/ide-core-browser';
@@ -145,11 +145,10 @@ export class MergeEditorWidget extends Disposable implements IMergeEditorEditor
onHide(): void {}
layout(dimension?: IDimension): void {
- ReactDOM.render(
+ ReactDOM.createRoot(this.rootHtmlElement).render(
,
- this.rootHtmlElement,
);
}
diff --git a/packages/output/src/browser/output.service.ts b/packages/output/src/browser/output.service.ts
index f15fef3188..8f759a297d 100644
--- a/packages/output/src/browser/output.service.ts
+++ b/packages/output/src/browser/output.service.ts
@@ -29,8 +29,8 @@ export class OutputService extends WithEventBus {
private outputEditor?: ICodeEditor;
- @observable
- readonly channels = new Map
();
+ @observable.shallow
+ readonly channels = observable.map();
@observable.ref
selectedChannel: OutputChannel;
diff --git a/packages/quick-open/src/browser/quick-open.service.tsx b/packages/quick-open/src/browser/quick-open.service.tsx
index 393f4975bf..58dcc90cf1 100644
--- a/packages/quick-open/src/browser/quick-open.service.tsx
+++ b/packages/quick-open/src/browser/quick-open.service.tsx
@@ -1,5 +1,5 @@
import React from 'react';
-import ReactDOM from 'react-dom';
+import ReactDOM from 'react-dom/client';
import { Autowired, Injectable, Injector, INJECTOR_TOKEN } from '@opensumi/di';
import {
@@ -198,13 +198,12 @@ export class MonacoQuickOpenService implements QuickOpenService {
private initWidgetView(widget: QuickOpenWidget) {
// 因为 quickopen widget 需要通过构造函数初始化,无法通过 useInjectable 获取实例
// 但其实是一个单例对象,使用 React Context 让其子组件获取到 widget 实例
- ReactDOM.render(
+ ReactDOM.createRoot(this.container).render(
,
- this.container,
);
}
diff --git a/packages/startup/package.json b/packages/startup/package.json
index 5b5aa9f894..f974efb967 100644
--- a/packages/startup/package.json
+++ b/packages/startup/package.json
@@ -119,7 +119,15 @@
"nodemon": "^2.0.15",
"npm-run": "^5.0.1",
"npm-run-all": "^4.1.5",
- "react-dom": "^16.8.6",
+ "react-dom": "^18.0.0",
+ "serviceworker-webpack-plugin": "^1.0.1",
+ "style-loader": "^0.23.1",
+ "style-resources-loader": "^1.2.1",
+ "ts-loader": "^6.0.1",
+ "ts-node": "^10.0.0",
+ "tsconfig-paths": "^3.8.0",
+ "tsconfig-paths-webpack-plugin": "^3.2.0",
+ "webpack": "^4.39.3",
"webpack-bundle-analyzer": "^3.8.0",
"webpack-dev-server": "3.8.0"
}
diff --git a/packages/testing/src/browser/outputPeek/test-message-container.tsx b/packages/testing/src/browser/outputPeek/test-message-container.tsx
index e30df77b3f..cd0ab9c6e3 100644
--- a/packages/testing/src/browser/outputPeek/test-message-container.tsx
+++ b/packages/testing/src/browser/outputPeek/test-message-container.tsx
@@ -169,15 +169,19 @@ export const TestMessageContainer = () => {
};
}, []);
+ const renderTestMessage = React.useCallback(() => {
+ if (type === EContainerType.DIFF) {
+ return ;
+ } else if (type === EContainerType.MARKDOWN) {
+ return ;
+ } else {
+ const msg = getMessage(dto).message;
+ return {typeof msg === 'string' ? msg : msg.value}
;
+ }
+ }, []);
return (
- {type === EContainerType.DIFF ? (
-
- ) : type === EContainerType.MARKDOWN ? (
-
- ) : type === EContainerType.PLANTTEXT ? (
- getMessage(dto).message
- ) : null}
+ {renderTestMessage()}
);
};
diff --git a/packages/testing/src/browser/outputPeek/test-peek-widget.tsx b/packages/testing/src/browser/outputPeek/test-peek-widget.tsx
index 7101bc1eaf..ae74a2ceb3 100644
--- a/packages/testing/src/browser/outputPeek/test-peek-widget.tsx
+++ b/packages/testing/src/browser/outputPeek/test-peek-widget.tsx
@@ -1,5 +1,6 @@
import React from 'react';
import ReactDOM from 'react-dom';
+import ReactDOMClient from 'react-dom/client';
import { Injectable, Autowired } from '@opensumi/di';
import { AppConfig, ConfigProvider, IContextKeyService } from '@opensumi/ide-core-browser';
@@ -49,27 +50,25 @@ export class TestingOutputPeek extends PeekViewWidget {
*/
protected _fillBody(container: HTMLElement): void {
this.setCssClass('testing-output-peek-container');
- ReactDOM.render(
+ ReactDOMClient.createRoot(container).render(
,
- container,
);
}
protected async _fillActionBarOptions(container: HTMLElement): Promise {
const menus = this.menuService.createMenu(MenuId.TestPeekTitleContext, this.contextKeyService);
return new Promise((res) => {
- ReactDOM.render(
+ ReactDOMClient.createRoot(container).render(
,
- container,
- res,
);
+ res();
});
}
diff --git a/tools/dev-tool/package.json b/tools/dev-tool/package.json
index 1bd5eb4e82..c05e470336 100644
--- a/tools/dev-tool/package.json
+++ b/tools/dev-tool/package.json
@@ -35,7 +35,7 @@
"node-notifier": "^8.0.1",
"null-loader": "^4.0.1",
"optimize-css-assets-webpack-plugin": "^5.0.3",
- "react-dom": "^16.8.6",
+ "react-dom": "^18.0.0",
"style-loader": "^0.23.1",
"style-resources-loader": "^1.2.1",
"thread-loader": "^2.1.3",
diff --git a/tools/electron/package.json b/tools/electron/package.json
index 63724e10f8..135a370705 100644
--- a/tools/electron/package.json
+++ b/tools/electron/package.json
@@ -64,7 +64,7 @@
"mobx-react-lite": "^1.3.1",
"npm-run": "^5.0.1",
"npm-run-all": "^4.1.5",
- "react-dom": "^16.8.6",
+ "react-dom": "^18.0.0",
"rimraf": "^3.0.0",
"style-loader": "^0.23.1",
"style-resources-loader": "^1.2.1",
diff --git a/tools/playwright/src/explorer-view.ts b/tools/playwright/src/explorer-view.ts
index 48a7c595e6..abf1270940 100644
--- a/tools/playwright/src/explorer-view.ts
+++ b/tools/playwright/src/explorer-view.ts
@@ -27,9 +27,9 @@ export class OpenSumiExplorerFileStatNode extends OpenSumiTreeNode {
async open(preview = true) {
if (!preview) {
- await this.elementHandle.dblclick();
+ await this.elementHandle?.dblclick();
} else {
- await this.elementHandle.click();
+ await this.elementHandle?.click();
}
}
diff --git a/tools/playwright/src/tests/explorer-view.test.ts b/tools/playwright/src/tests/explorer-view.test.ts
index b069d77513..3ea0966ff0 100644
--- a/tools/playwright/src/tests/explorer-view.test.ts
+++ b/tools/playwright/src/tests/explorer-view.test.ts
@@ -313,6 +313,8 @@ console.log(a);`,
const afterDeleteNode = await explorer.getFileStatTreeNodeByPath('test/a/d');
expect(afterDeleteNode).toBeDefined();
expect(await afterDeleteNode?.label()).toBe('a/d');
+ const leftNode = await explorer.getFileStatTreeNodeByPath('test/a/d/c.js');
+ expect(leftNode).toBeDefined();
});
test('the visible state of outline panel should be restored after refreshing', async () => {
@@ -356,12 +358,12 @@ console.log(a);`,
await app.page.keyboard.press('Enter');
}
await app.page.waitForTimeout(200);
- // expanded `new_folder4`
node = await explorer.getFileStatTreeNodeByPath(newFileName_2);
await node?.open();
+ await app.page.waitForTimeout(200);
expect(await node?.isExpanded()).toBeTruthy();
- // select the `new_folder3` folder and expanded it
+ // select the `new_folder3` folder and toggle it twice
node = await explorer.getFileStatTreeNodeByPath(newFileName_1);
await node?.open();
await node?.open();
diff --git a/yarn.lock b/yarn.lock
index 318b772be2..9841909661 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2597,8 +2597,8 @@ __metadata:
"@types/lodash": ^4.14.182
"@types/node": ^10.14.6
"@types/node-fetch": ^2.6.1
- "@types/react": ^16.9.33
- "@types/react-dom": ^16.9.5
+ "@types/react": ^18.0.0
+ "@types/react-dom": ^18.0.0
"@types/react-is": ^16.7.1
"@types/socket.io-client": ^1.4.32
"@types/temp": ^0.9.1
@@ -2630,7 +2630,7 @@ __metadata:
is-git-clean: ^1.1.0
jest: ^29.7.0
jest-canvas-mock: ^2.4.0
- jest-environment-jsdom: ^28.0.2
+ jest-environment-jsdom: 29.7.0
jest-fetch-mock: ^3.0.3
jest-jasmine2: ^28.0.3
jsdom: ^20.0.0
@@ -2784,7 +2784,7 @@ __metadata:
mobx-react-lite: ^1.3.1
onigasm: 2.2.2
rc-menu: ^9.3.2
- react: ^16.8.6
+ react: ^18.0.0
react-autosize-textarea: ^7.0.0
react-ctxmenu-trigger: ^1.0.0
react-custom-scrollbars: ^4.2.1
@@ -2795,7 +2795,7 @@ __metadata:
strip-json-comments: 3.0.1
vscode-textmate: 7.0.1
peerDependencies:
- react: ">=16.8.6"
+ react: ">=18.0.0"
languageName: unknown
linkType: soft
@@ -2904,7 +2904,7 @@ __metadata:
node-notifier: ^8.0.1
null-loader: ^4.0.1
optimize-css-assets-webpack-plugin: ^5.0.3
- react-dom: ^16.8.6
+ react-dom: ^18.0.0
style-loader: ^0.23.1
style-resources-loader: ^1.2.1
thread-loader: ^2.1.3
@@ -3468,7 +3468,15 @@ __metadata:
nodemon: ^2.0.15
npm-run: ^5.0.1
npm-run-all: ^4.1.5
- react-dom: ^16.8.6
+ react-dom: ^18.0.0
+ serviceworker-webpack-plugin: ^1.0.1
+ style-loader: ^0.23.1
+ style-resources-loader: ^1.2.1
+ ts-loader: ^6.0.1
+ ts-node: ^10.0.0
+ tsconfig-paths: ^3.8.0
+ tsconfig-paths-webpack-plugin: ^3.2.0
+ webpack: ^4.39.3
webpack-bundle-analyzer: ^3.8.0
webpack-dev-server: 3.8.0
languageName: unknown
@@ -4250,7 +4258,7 @@ __metadata:
languageName: node
linkType: hard
-"@types/jsdom@npm:^16.2.14, @types/jsdom@npm:^16.2.4":
+"@types/jsdom@npm:^16.2.14":
version: 16.2.15
resolution: "@types/jsdom@npm:16.2.15"
dependencies:
@@ -4261,6 +4269,17 @@ __metadata:
languageName: node
linkType: hard
+"@types/jsdom@npm:^20.0.0":
+ version: 20.0.1
+ resolution: "@types/jsdom@npm:20.0.1"
+ dependencies:
+ "@types/node": "*"
+ "@types/tough-cookie": "*"
+ parse5: ^7.0.0
+ checksum: d55402c5256ef451f93a6e3d3881f98339fe73a5ac2030588df056d6835df8367b5a857b48d27528289057e26dcdd3f502edc00cb877c79174cb3a4c7f2198c1
+ languageName: node
+ linkType: hard
+
"@types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9":
version: 7.0.11
resolution: "@types/json-schema@npm:7.0.11"
@@ -5102,7 +5121,7 @@ __metadata:
languageName: node
linkType: hard
-"abab@npm:^2.0.5, abab@npm:^2.0.6":
+"abab@npm:^2.0.6":
version: 2.0.6
resolution: "abab@npm:2.0.6"
checksum: 6ffc1af4ff315066c62600123990d87551ceb0aafa01e6539da77b0f5987ac7019466780bf480f1787576d4385e3690c81ccc37cfda12819bf510b8ab47e5a3e
@@ -5152,16 +5171,6 @@ __metadata:
languageName: node
linkType: hard
-"acorn-globals@npm:^6.0.0":
- version: 6.0.0
- resolution: "acorn-globals@npm:6.0.0"
- dependencies:
- acorn: ^7.1.1
- acorn-walk: ^7.1.1
- checksum: 72d95e5b5e585f9acd019b993ab8bbba68bb3cbc9d9b5c1ebb3c2f1fe5981f11deababfb4949f48e6262f9c57878837f5958c0cca396f81023814680ca878042
- languageName: node
- linkType: hard
-
"acorn-globals@npm:^7.0.0":
version: 7.0.1
resolution: "acorn-globals@npm:7.0.1"
@@ -6219,13 +6228,6 @@ __metadata:
languageName: node
linkType: hard
-"browser-process-hrtime@npm:^1.0.0":
- version: 1.0.0
- resolution: "browser-process-hrtime@npm:1.0.0"
- checksum: e30f868cdb770b1201afb714ad1575dd86366b6e861900884665fb627109b3cc757c40067d3bfee1ff2a29c835257ea30725a8018a9afd02ac1c24b408b1e45f
- languageName: node
- linkType: hard
-
"browserfs@npm:^1.4.3":
version: 1.4.3
resolution: "browserfs@npm:1.4.3"
@@ -6786,7 +6788,7 @@ __metadata:
languageName: node
linkType: hard
-"chalk@npm:^2.0.0, chalk@npm:^2.1.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2":
+"chalk@npm:^2.0.0, chalk@npm:^2.1.0, chalk@npm:^2.3.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2":
version: 2.4.2
resolution: "chalk@npm:2.4.2"
dependencies:
@@ -8297,7 +8299,7 @@ __metadata:
languageName: node
linkType: hard
-"data-urls@npm:^3.0.1, data-urls@npm:^3.0.2":
+"data-urls@npm:^3.0.2":
version: 3.0.2
resolution: "data-urls@npm:3.0.2"
dependencies:
@@ -8369,7 +8371,7 @@ __metadata:
languageName: node
linkType: hard
-"decimal.js@npm:^10.3.1, decimal.js@npm:^10.4.2":
+"decimal.js@npm:^10.4.2":
version: 10.4.3
resolution: "decimal.js@npm:10.4.3"
checksum: 796404dcfa9d1dbfdc48870229d57f788b48c21c603c3f6554a1c17c10195fc1024de338b0cf9e1efe0c7c167eeb18f04548979bcc5fdfabebb7cc0ae3287bae
@@ -13177,19 +13179,24 @@ __metadata:
languageName: node
linkType: hard
-"jest-environment-jsdom@npm:^28.0.2":
- version: 28.1.3
- resolution: "jest-environment-jsdom@npm:28.1.3"
+"jest-environment-jsdom@npm:29.7.0":
+ version: 29.7.0
+ resolution: "jest-environment-jsdom@npm:29.7.0"
dependencies:
- "@jest/environment": ^28.1.3
- "@jest/fake-timers": ^28.1.3
- "@jest/types": ^28.1.3
- "@types/jsdom": ^16.2.4
+ "@jest/environment": ^29.7.0
+ "@jest/fake-timers": ^29.7.0
+ "@jest/types": ^29.6.3
+ "@types/jsdom": ^20.0.0
"@types/node": "*"
- jest-mock: ^28.1.3
- jest-util: ^28.1.3
- jsdom: ^19.0.0
- checksum: 32758f9b9a1fd04ec3ebaaa608d740a36b960d37d00bd3d4d83fdc4b527afc474c14f04fa860817e1fa22923e2dc3cd2b497db41af6a5d73e91327951612025e
+ jest-mock: ^29.7.0
+ jest-util: ^29.7.0
+ jsdom: ^20.0.0
+ peerDependencies:
+ canvas: ^2.5.0
+ peerDependenciesMeta:
+ canvas:
+ optional: true
+ checksum: 559aac134c196fccc1dfc794d8fc87377e9f78e894bb13012b0831d88dec0abd7ece99abec69da564b8073803be4f04a9eb4f4d1bb80e29eec0cb252c254deb8
languageName: node
linkType: hard
@@ -13846,46 +13853,6 @@ __metadata:
languageName: node
linkType: hard
-"jsdom@npm:^19.0.0":
- version: 19.0.0
- resolution: "jsdom@npm:19.0.0"
- dependencies:
- abab: ^2.0.5
- acorn: ^8.5.0
- acorn-globals: ^6.0.0
- cssom: ^0.5.0
- cssstyle: ^2.3.0
- data-urls: ^3.0.1
- decimal.js: ^10.3.1
- domexception: ^4.0.0
- escodegen: ^2.0.0
- form-data: ^4.0.0
- html-encoding-sniffer: ^3.0.0
- http-proxy-agent: ^5.0.0
- https-proxy-agent: ^5.0.0
- is-potential-custom-element-name: ^1.0.1
- nwsapi: ^2.2.0
- parse5: 6.0.1
- saxes: ^5.0.1
- symbol-tree: ^3.2.4
- tough-cookie: ^4.0.0
- w3c-hr-time: ^1.0.2
- w3c-xmlserializer: ^3.0.0
- webidl-conversions: ^7.0.0
- whatwg-encoding: ^2.0.0
- whatwg-mimetype: ^3.0.0
- whatwg-url: ^10.0.0
- ws: ^8.2.3
- xml-name-validator: ^4.0.0
- peerDependencies:
- canvas: ^2.5.0
- peerDependenciesMeta:
- canvas:
- optional: true
- checksum: 94b693bf4a394097dd96705550bb7b6cd3c8db3c5414e6e9c92a0995ed8b61067597da2f37fca6bed4b5a2f1ef33960ee759522156dccd0b306311988ea87cfb
- languageName: node
- linkType: hard
-
"jsdom@npm:^20.0.0":
version: 20.0.3
resolution: "jsdom@npm:20.0.3"
@@ -16467,7 +16434,7 @@ __metadata:
languageName: node
linkType: hard
-"nwsapi@npm:^2.2.0, nwsapi@npm:^2.2.2":
+"nwsapi@npm:^2.2.2":
version: 2.2.2
resolution: "nwsapi@npm:2.2.2"
checksum: 43769106292bc95f776756ca2f3513dab7b4d506a97c67baec32406447841a35f65f29c1f95ab5d42785210fd41668beed33ca16fa058780be43b101ad73e205
@@ -17212,14 +17179,7 @@ __metadata:
languageName: node
linkType: hard
-"parse5@npm:6.0.1":
- version: 6.0.1
- resolution: "parse5@npm:6.0.1"
- checksum: 7d569a176c5460897f7c8f3377eff640d54132b9be51ae8a8fa4979af940830b2b0c296ce75e5bd8f4041520aadde13170dbdec44889975f906098ea0002f4bd
- languageName: node
- linkType: hard
-
-"parse5@npm:^7.1.1":
+"parse5@npm:^7.0.0, parse5@npm:^7.1.1":
version: 7.1.2
resolution: "parse5@npm:7.1.2"
dependencies:
@@ -18704,7 +18664,7 @@ __metadata:
languageName: node
linkType: hard
-"react-dom@npm:^16.12.0, react-dom@npm:^16.8.6":
+"react-dom@npm:^16.12.0":
version: 16.14.0
resolution: "react-dom@npm:16.14.0"
dependencies:
@@ -18718,6 +18678,18 @@ __metadata:
languageName: node
linkType: hard
+"react-dom@npm:^18.0.0":
+ version: 18.2.0
+ resolution: "react-dom@npm:18.2.0"
+ dependencies:
+ loose-envify: ^1.1.0
+ scheduler: ^0.23.0
+ peerDependencies:
+ react: ^18.2.0
+ checksum: 7d323310bea3a91be2965f9468d552f201b1c27891e45ddc2d6b8f717680c95a75ae0bc1e3f5cf41472446a2589a75aed4483aee8169287909fcd59ad149e8cc
+ languageName: node
+ linkType: hard
+
"react-is@npm:^16.12.0, react-is@npm:^16.13.1, react-is@npm:^16.7.0, react-is@npm:^16.8.6":
version: 16.13.1
resolution: "react-is@npm:16.13.1"
@@ -18803,7 +18775,7 @@ __metadata:
languageName: node
linkType: hard
-"react@npm:^16.12.0, react@npm:^16.8.6":
+"react@npm:^16.12.0":
version: 16.14.0
resolution: "react@npm:16.14.0"
dependencies:
@@ -18814,6 +18786,15 @@ __metadata:
languageName: node
linkType: hard
+"react@npm:^18.0.0":
+ version: 18.2.0
+ resolution: "react@npm:18.2.0"
+ dependencies:
+ loose-envify: ^1.1.0
+ checksum: 88e38092da8839b830cda6feef2e8505dec8ace60579e46aa5490fc3dc9bba0bd50336507dc166f43e3afc1c42939c09fe33b25fae889d6f402721dcd78fca1b
+ languageName: node
+ linkType: hard
+
"read-cmd-shim@npm:^3.0.0":
version: 3.0.1
resolution: "read-cmd-shim@npm:3.0.1"
@@ -19564,15 +19545,6 @@ __metadata:
languageName: node
linkType: hard
-"saxes@npm:^5.0.1":
- version: 5.0.1
- resolution: "saxes@npm:5.0.1"
- dependencies:
- xmlchars: ^2.2.0
- checksum: 5636b55cf15f7cf0baa73f2797bf992bdcf75d1b39d82c0aa4608555c774368f6ac321cb641fd5f3d3ceb87805122cd47540da6a7b5960fe0dbdb8f8c263f000
- languageName: node
- linkType: hard
-
"saxes@npm:^6.0.0":
version: 6.0.0
resolution: "saxes@npm:6.0.0"
@@ -19592,6 +19564,15 @@ __metadata:
languageName: node
linkType: hard
+"scheduler@npm:^0.23.0":
+ version: 0.23.0
+ resolution: "scheduler@npm:0.23.0"
+ dependencies:
+ loose-envify: ^1.1.0
+ checksum: d79192eeaa12abef860c195ea45d37cbf2bbf5f66e3c4dcd16f54a7da53b17788a70d109ee3d3dde1a0fd50e6a8fc171f4300356c5aee4fc0171de526bf35f8a
+ languageName: node
+ linkType: hard
+
"schema-utils@npm:2.7.0":
version: 2.7.0
resolution: "schema-utils@npm:2.7.0"
@@ -19826,6 +19807,17 @@ __metadata:
languageName: node
linkType: hard
+"serviceworker-webpack-plugin@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "serviceworker-webpack-plugin@npm:1.0.1"
+ dependencies:
+ minimatch: ^3.0.4
+ peerDependencies:
+ webpack: ^4
+ checksum: 0de36e17f4905274d274520a03f7d7a8f5cf238c17ef67fd66a4bf133df1a1dab89d3707c1a632ff82e6faaba8545799283f748bc801aa2b42b189a8b5e0f476
+ languageName: node
+ linkType: hard
+
"set-blocking@npm:^2.0.0":
version: 2.0.0
resolution: "set-blocking@npm:2.0.0"
@@ -21327,7 +21319,7 @@ __metadata:
languageName: node
linkType: hard
-"tough-cookie@npm:^4.0.0, tough-cookie@npm:^4.1.2":
+"tough-cookie@npm:^4.1.2":
version: 4.1.2
resolution: "tough-cookie@npm:4.1.2"
dependencies:
@@ -21462,6 +21454,21 @@ __metadata:
languageName: node
linkType: hard
+"ts-loader@npm:^6.0.1":
+ version: 6.2.2
+ resolution: "ts-loader@npm:6.2.2"
+ dependencies:
+ chalk: ^2.3.0
+ enhanced-resolve: ^4.0.0
+ loader-utils: ^1.0.2
+ micromatch: ^4.0.0
+ semver: ^6.0.0
+ peerDependencies:
+ typescript: "*"
+ checksum: b984b911848f5397e1cddf8b046a693caaf5556ff1ccc91611b40a20824b20232a3d1d28da326e4cf9bb20c23dce2886b1a5a5868634b44384a528bf462c81f4
+ languageName: node
+ linkType: hard
+
"ts-loader@npm:^8.2.0":
version: 8.4.0
resolution: "ts-loader@npm:8.4.0"
@@ -21478,7 +21485,7 @@ __metadata:
languageName: node
linkType: hard
-"ts-node@npm:10.9.1, ts-node@npm:^10.8.1, ts-node@npm:^10.9.1":
+"ts-node@npm:10.9.1, ts-node@npm:^10.0.0, ts-node@npm:^10.8.1, ts-node@npm:^10.9.1":
version: 10.9.1
resolution: "ts-node@npm:10.9.1"
dependencies:
@@ -22304,24 +22311,6 @@ __metadata:
languageName: node
linkType: hard
-"w3c-hr-time@npm:^1.0.2":
- version: 1.0.2
- resolution: "w3c-hr-time@npm:1.0.2"
- dependencies:
- browser-process-hrtime: ^1.0.0
- checksum: ec3c2dacbf8050d917bbf89537a101a08c2e333b4c19155f7d3bedde43529d4339db6b3d049d9610789cb915f9515f8be037e0c54c079e9d4735c50b37ed52b9
- languageName: node
- linkType: hard
-
-"w3c-xmlserializer@npm:^3.0.0":
- version: 3.0.0
- resolution: "w3c-xmlserializer@npm:3.0.0"
- dependencies:
- xml-name-validator: ^4.0.0
- checksum: 0af8589942eeb11c9fe29eb31a1a09f3d5dd136aea53a9848dfbabff79ac0dd26fe13eb54d330d5555fe27bb50b28dca0715e09f9cc2bfa7670ccc8b7f919ca2
- languageName: node
- linkType: hard
-
"w3c-xmlserializer@npm:^4.0.0":
version: 4.0.0
resolution: "w3c-xmlserializer@npm:4.0.0"
@@ -22621,16 +22610,6 @@ __metadata:
languageName: node
linkType: hard
-"whatwg-url@npm:^10.0.0":
- version: 10.0.0
- resolution: "whatwg-url@npm:10.0.0"
- dependencies:
- tr46: ^3.0.0
- webidl-conversions: ^7.0.0
- checksum: a21ec309c5cc743fe9414509408bedf65eaf0fb5c17ac66baa08ef12fce16da4dd30ce90abefbd5a716408301c58a73666dabfd5042cf4242992eb98b954f861
- languageName: node
- linkType: hard
-
"whatwg-url@npm:^11.0.0":
version: 11.0.0
resolution: "whatwg-url@npm:11.0.0"
@@ -22890,7 +22869,7 @@ __metadata:
languageName: node
linkType: hard
-"ws@npm:^8.11.0, ws@npm:^8.2.3, ws@npm:^8.9.0":
+"ws@npm:^8.11.0, ws@npm:^8.9.0":
version: 8.12.0
resolution: "ws@npm:8.12.0"
peerDependencies: