Skip to content

Commit 3340fa8

Browse files
erha19bytemain
andauthored
refactor: add @opensumi/ide-utils module (#784)
* refactor: add @opensumi/ide-utils module * fix: module and function ref path * test: move utils test to utils module * chore: upgrade to 2.16.6 version * refactor: use common OperatingSystem define on platform and os file * chore: remove useless utils * test: fix unit test * test: use ResourceLoader on jsdom to make platform correctly * chore: make @opensumi/ide-utils to be public package * chore: merge cancelToken defined * chore: fix function ref * chore: add userAgent environment in jsdom * chore: add prettierPath config * chore: update jest.config.js * test: add more arrays unit test * chore: use v8 coverageProvider * chore: use babel provider * chore: add codecov.yml * chore: update utils version Co-authored-by: 野声 <lijiacheng.ljc@antgroup.com>
1 parent 568c393 commit 3340fa8

File tree

370 files changed

+1593
-6126
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

370 files changed

+1593
-6126
lines changed

codecov.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
coverage:
2+
status:
3+
project:
4+
default:
5+
target: auto
6+
# allow coverage to drop by this amount and still post success
7+
threshold: 0.5%
8+
if_ci_failed: error
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"extends": "../tsconfig.base.json",
3+
"compilerOptions": {
4+
"rootDir": "../../../packages/utils/src",
5+
"outDir": "../../../packages/utils/lib"
6+
},
7+
"include": ["../../../packages/utils/src"]
8+
}

configs/ts/tsconfig.build.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
{
22
"references": [
3+
{
4+
"path": "./references/tsconfig.utils.json"
5+
},
36
{
47
"path": "./references/tsconfig.core-common.json"
58
},

configs/ts/tsconfig.resolve.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
"compilerOptions": {
44
"baseUrl": "..",
55
"paths": {
6+
"@opensumi/ide-utils": ["../packages/utils/src/index.ts"],
7+
"@opensumi/ide-utils/lib/*": ["../packages/utils/src/*"],
68
"@opensumi/ide-addons": ["../packages/addons/src/index.ts"],
79
"@opensumi/ide-addons/lib/*": ["../packages/addons/src/*"],
810
"@opensumi/ide-comments": ["../packages/comments/src/index.ts"],

jest.config.js

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,24 +35,15 @@ const baseConfig = {
3535
'/packages/quick-open/entry',
3636
// 终端渲染测试暂时不跟随单元测试
3737
'/packages/terminal-next/__tests__/browser/render.test.ts',
38-
// components utils 均引用自 @opensumi/ide-core-common 模块,无须重复测试
39-
// 后续统一至 @opensumi/ide-utils 模块
40-
'/packages/components/src/utils',
4138
],
4239
modulePathIgnorePatterns: ['<rootDir>/dist/'],
4340
coveragePathIgnorePatterns: [
4441
'/dist/',
4542
'/node_modules/',
46-
'/__test__/',
4743
'/mocks/',
4844
'/tools/template/',
4945
'/tools/workspace/',
50-
'/packages/status-bar/entry',
5146
'/packages/startup/entry',
52-
'/packages/quick-open/entry',
53-
// components 下的 utils 均引用自 @opensumi/ide-core-common 模块,无须重复测试
54-
// 后续统一至 @opensumi/ide-utils 模块
55-
'/packages/components/src/utils',
5647
],
5748
coverageThreshold: {
5849
global: {
@@ -78,7 +69,7 @@ module.exports = {
7869
// 有个 webview 的 case 应该放在 electron 下测,也会被第一条规则匹配到
7970
// - packages/webview/__tests__/webview/webview.channel.test.ts
8071
'**/packages/*/__test?(s)__/!(browser)/**/?(*.)+(spec|test).[jt]s?(x)',
81-
'**/packages/{core-common,core-electron-main,core-node,electron-basic}/__tests__/**/?(*.)+(spec|test).[jt]s?(x)',
72+
'**/packages/{core-common,core-electron-main,core-node,electron-basic,utils}/__tests__/**/?(*.)+(spec|test).[jt]s?(x)',
8273
// exclude 的要放最后
8374
'!**/packages/{components,core-browser}/__tests__/**',
8475
],
@@ -93,6 +84,9 @@ module.exports = {
9384
</html>`,
9485
runScripts: 'dangerously',
9586
url: 'http://localhost/?id=1',
87+
userAgent: `Mozilla/5.0 (${
88+
process.platform === 'darwin' ? 'Macintosh' : process.platform === 'win32' ? 'Windows' : 'Linux'
89+
}) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/v16.7.0`,
9690
},
9791
setupFiles: ['./jest.setup.jsdom.js'],
9892
testMatch: [

jest.setup.node.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
1-
const { JSDOM } = require('jsdom');
1+
const { JSDOM, ResourceLoader } = require('jsdom');
2+
3+
const resourceLoader = new ResourceLoader({
4+
strictSSL: false,
5+
userAgent: `Mozilla/5.0 (${
6+
process.platform === 'darwin' ? 'Macintosh' : process.platform === 'win32' ? 'Windows' : 'Linux'
7+
}) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/v16.7.0`,
8+
});
9+
210
const jsdom = new JSDOM('<div id="main"></div>', {
311
// https://github.com/jsdom/jsdom#basic-options
412
// 禁用掉 resources: usable, 采用 jsdom 默认策略不加载 subresources
513
// 避免测试用例加载 external subresource, 如 iconfont 的 css 挂掉
614
// resources: 'usable',
715
runScripts: 'dangerously',
816
url: 'http://localhost/?id=1',
17+
// 保障 `platform.ts` 中 isLinux 等平台信息判断准确性
18+
resources: resourceLoader,
919
});
1020
global.document = jsdom.window.document;
1121
let text = '';

packages/addons/src/browser/file-drop.service.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { Injectable, Autowired } from '@opensumi/di';
2-
import { Path } from '@opensumi/ide-components/lib/utils/path';
3-
import { Uri, formatLocalize } from '@opensumi/ide-core-browser/lib';
2+
import { formatLocalize } from '@opensumi/ide-core-browser';
43
import { IStatusBarService, StatusBarAlignment, StatusBarEntryAccessor } from '@opensumi/ide-core-browser/lib/services';
5-
import { WithEventBus } from '@opensumi/ide-core-common/lib';
4+
import { WithEventBus, Uri, path } from '@opensumi/ide-core-common';
65
import { FileTreeDropEvent } from '@opensumi/ide-core-common/lib/types/dnd';
76
import { IFileServiceClient } from '@opensumi/ide-file-service/lib/common';
87

8+
const { Path } = path;
9+
910
import {
1011
IFileDropFrontendService,
1112
IFileDropBackendService,

packages/comments/src/browser/comments.service.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ import {
1717
IDisposable,
1818
positionToRange,
1919
Deferred,
20+
path,
21+
LRUCache,
2022
} from '@opensumi/ide-core-browser';
21-
import { LRUCache } from '@opensumi/ide-core-common/lib/map';
22-
import { dirname } from '@opensumi/ide-core-common/lib/path';
2323
import { IEditor } from '@opensumi/ide-editor';
2424
import {
2525
IEditorDecorationCollectionService,
@@ -46,6 +46,8 @@ import {
4646
import { CommentsPanel } from './comments-panel.view';
4747
import { CommentsThread } from './comments-thread';
4848

49+
const { dirname } = path;
50+
4951
@Injectable()
5052
export class CommentsService extends Disposable implements ICommentsService {
5153
@Autowired(INJECTOR_TOKEN)

packages/components/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"dependencies": {
1818
"@ant-design/icons": "^4.6.4",
1919
"@types/react-window": "^1.8.5",
20+
"@opensumi/ide-utils": "2.17.0",
2021
"fuzzy": "^0.1.3",
2122
"lodash": "^4.17.15",
2223
"raf": "^3.4.1",

packages/components/src/recycle-tree/RecycleTree.tsx

Lines changed: 12 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,17 @@ import fuzzy from 'fuzzy';
22
import React from 'react';
33
import { FixedSizeList, VariableSizeList, shouldComponentUpdate, ListProps } from 'react-window';
44

5+
import {
6+
DisposableCollection,
7+
Emitter,
8+
Event,
9+
Disposable,
10+
CancellationTokenSource,
11+
CancellationToken,
12+
Throttler,
13+
} from '@opensumi/ide-utils';
14+
515
import { ScrollbarsVirtualList } from '../scrollbars';
6-
import { DisposableCollection, Emitter, Event, Disposable, CancellationTokenSource, CancellationToken } from '../utils';
716

817
import { RenamePromptHandle, PromptHandle } from './prompt';
918
import { NewPromptHandle } from './prompt/NewPromptHandle';
@@ -286,8 +295,7 @@ export class RecycleTree extends React.Component<IRecycleTreeProps> {
286295

287296
private willUpdateTasks = 0;
288297

289-
private updateTimer;
290-
private updateTime = 0;
298+
private queueUpdateThrottler: Throttler = new Throttler();
291299

292300
// 批量更新Tree节点
293301
private doBatchUpdate = (() => {
@@ -376,52 +384,12 @@ export class RecycleTree extends React.Component<IRecycleTreeProps> {
376384
};
377385
})();
378386

379-
// FIXME: 待 @opensumi/ide-utils 合入后可合并逻辑至 Throttler.queue
380387
private batchUpdate = () => {
381388
this.willUpdateTasks++;
382-
this.queueUpdatePromise = this.queueUpdate(this.doBatchUpdate);
389+
this.queueUpdatePromise = this.queueUpdateThrottler.queue(this.doBatchUpdate);
383390
return this.queueUpdatePromise;
384391
};
385392

386-
private queueUpdate(promiseFactory: () => Promise<void>) {
387-
if (this.activePromise) {
388-
this.queuedPromiseFactory = promiseFactory;
389-
390-
if (!this.queuedPromise) {
391-
const onComplete = () => {
392-
this.queuedPromise = null;
393-
394-
const result = this.queueUpdate(this.queuedPromiseFactory!);
395-
this.queuedPromiseFactory = null;
396-
397-
return result;
398-
};
399-
400-
this.queuedPromise = new Promise((c) => {
401-
this.activePromise!.then(onComplete, onComplete).then(c);
402-
});
403-
}
404-
return new Promise((c, e) => {
405-
this.queuedPromise!.then(c, e);
406-
});
407-
}
408-
409-
this.activePromise = promiseFactory();
410-
411-
return new Promise((c, e) => {
412-
this.activePromise!.then(
413-
(result: any) => {
414-
this.activePromise = null;
415-
c(result);
416-
},
417-
(err: any) => {
418-
this.activePromise = null;
419-
e(err);
420-
},
421-
);
422-
});
423-
}
424-
425393
private getNewPromptInsertIndex(startIndex: number, parent: CompositeTreeNode) {
426394
const { root } = this.props.model;
427395
let insertIndex: number = startIndex + 1;

0 commit comments

Comments
 (0)