@opensumi/ide-core-common 3.4.4 → 3.4.5-next-1729482152.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/remote-service/README.md +9 -9
- package/lib/remote-service/data-store/decorators.d.ts +2 -2
- package/lib/remote-service/data-store/decorators.d.ts.map +1 -1
- package/lib/remote-service/data-store/decorators.js +19 -21
- package/lib/remote-service/data-store/decorators.js.map +1 -1
- package/lib/remote-service/data-store/select.d.ts +2 -2
- package/lib/remote-service/data-store/select.d.ts.map +1 -1
- package/lib/remote-service/data-store/select.js.map +1 -1
- package/lib/remote-service/data-store/store.d.ts +20 -17
- package/lib/remote-service/data-store/store.d.ts.map +1 -1
- package/lib/remote-service/data-store/store.js +32 -4
- package/lib/remote-service/data-store/store.js.map +1 -1
- package/package.json +4 -4
- package/src/remote-service/README.md +9 -9
- package/src/remote-service/data-store/decorators.ts +39 -25
- package/src/remote-service/data-store/select.ts +3 -3
- package/src/remote-service/data-store/store.ts +60 -21
|
@@ -345,16 +345,18 @@ class TerminalService {
|
|
|
345
345
|
由于装饰器的执行是在类实例化之前,所以我们可以在 `GDataStore` 这个装饰器中收集 token,然后将它们加入 Injector 即可:
|
|
346
346
|
|
|
347
347
|
```ts
|
|
348
|
-
|
|
348
|
+
function generateToken(type: 'global' | 'session', token: string, options?: DataStoreOptions) {
|
|
349
|
+
// ...
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
export type GDataStore<T, K = number> = InMemoryDataStore<T, K>;
|
|
349
353
|
export function GDataStore(token: string, options?: DataStoreOptions): PropertyDecorator {
|
|
350
|
-
|
|
354
|
+
const sym = generateToken('global', token, options);
|
|
351
355
|
|
|
352
|
-
return Autowired(
|
|
353
|
-
tag:
|
|
356
|
+
return Autowired(sym, {
|
|
357
|
+
tag: token,
|
|
354
358
|
});
|
|
355
359
|
}
|
|
356
|
-
|
|
357
|
-
export type GDataStore<T> = InMemoryDataStore<T>;
|
|
358
360
|
```
|
|
359
361
|
|
|
360
362
|
用一个闭包中的变量 `dataStore` 来储存,然后在创建 Injector 的时候将所有的 token 放入 injector:
|
|
@@ -363,10 +365,8 @@ export type GDataStore<T> = InMemoryDataStore<T>;
|
|
|
363
365
|
function _injectDataStores(injector: Injector) {
|
|
364
366
|
dataStore.forEach(([token, opts]) => {
|
|
365
367
|
injector.addProviders({
|
|
366
|
-
token
|
|
368
|
+
token,
|
|
367
369
|
useValue: new InMemoryDataStore(opts),
|
|
368
|
-
tag: String(token),
|
|
369
|
-
dropdownForTag: false,
|
|
370
370
|
});
|
|
371
371
|
});
|
|
372
372
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Injector } from '@opensumi/di';
|
|
2
2
|
import { DataStoreOptions, InMemoryDataStore } from './store';
|
|
3
|
-
export type GDataStore<
|
|
3
|
+
export type GDataStore<Item extends Record<any, any>, PrimaryKey = keyof Item, PrimaryKeyType = Item[PrimaryKey]> = InMemoryDataStore<Item, PrimaryKey, PrimaryKeyType>;
|
|
4
4
|
export declare function GDataStore(token: string, options?: DataStoreOptions): PropertyDecorator;
|
|
5
|
-
export type SessionDataStore<
|
|
5
|
+
export type SessionDataStore<Item extends Record<any, any>, PrimaryKey = keyof Item, PrimaryKeyType = Item[PrimaryKey]> = InMemoryDataStore<Item, PrimaryKey, PrimaryKeyType>;
|
|
6
6
|
export declare function SessionDataStore(token: string, options?: DataStoreOptions): PropertyDecorator;
|
|
7
7
|
export declare function injectGDataStores(injector: Injector): void;
|
|
8
8
|
export declare function injectSessionDataStores(injector: Injector): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../../src/remote-service/data-store/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../../src/remote-service/data-store/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AA8B9D,MAAM,MAAM,UAAU,CACpB,IAAI,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAC7B,UAAU,GAAG,MAAM,IAAI,EACvB,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,IAC/B,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;AACxD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,iBAAiB,CAIvF;AAED,MAAM,MAAM,gBAAgB,CAC1B,IAAI,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAC7B,UAAU,GAAG,MAAM,IAAI,EACvB,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,IAC/B,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;AACxD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,iBAAiB,CAI7F;AAcD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,QAEnD;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,QAEzD"}
|
|
@@ -4,48 +4,46 @@ exports.injectSessionDataStores = exports.injectGDataStores = exports.SessionDat
|
|
|
4
4
|
const di_1 = require("@opensumi/di");
|
|
5
5
|
const store_1 = require("./store");
|
|
6
6
|
const dataStore = {
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
GDataStore: {},
|
|
8
|
+
SessionDataStore: {},
|
|
9
9
|
};
|
|
10
|
-
function
|
|
10
|
+
function generateToken(type, token, options) {
|
|
11
11
|
if (dataStore[type][token]) {
|
|
12
12
|
// 同样的 token 只能被注入一次,options 也以第一次为准
|
|
13
|
-
return;
|
|
13
|
+
return dataStore[type][token].sym;
|
|
14
14
|
}
|
|
15
|
-
|
|
15
|
+
const sym = Symbol(`${type}:${token}`);
|
|
16
|
+
dataStore[type][token] = {
|
|
17
|
+
sym,
|
|
18
|
+
options,
|
|
19
|
+
};
|
|
20
|
+
return sym;
|
|
16
21
|
}
|
|
17
22
|
function GDataStore(token, options) {
|
|
18
|
-
|
|
19
|
-
return (0, di_1.Autowired)(
|
|
20
|
-
tag: String(token),
|
|
21
|
-
});
|
|
23
|
+
const sym = generateToken('GDataStore', token, options);
|
|
24
|
+
return (0, di_1.Autowired)(sym);
|
|
22
25
|
}
|
|
23
26
|
exports.GDataStore = GDataStore;
|
|
24
27
|
function SessionDataStore(token, options) {
|
|
25
|
-
|
|
26
|
-
return (0, di_1.Autowired)(
|
|
27
|
-
tag: String(token),
|
|
28
|
-
});
|
|
28
|
+
const sym = generateToken('SessionDataStore', token, options);
|
|
29
|
+
return (0, di_1.Autowired)(sym);
|
|
29
30
|
}
|
|
30
31
|
exports.SessionDataStore = SessionDataStore;
|
|
31
32
|
function _injectDataStores(type, injector) {
|
|
32
33
|
const stores = dataStore[type];
|
|
33
34
|
if (stores) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
useValue: new store_1.InMemoryDataStore(opts),
|
|
38
|
-
tag,
|
|
39
|
-
dropdownForTag: false,
|
|
35
|
+
injector.addProviders(...Object.values(stores).map((opts) => ({
|
|
36
|
+
token: opts.sym,
|
|
37
|
+
useValue: new store_1.InMemoryDataStore(opts.options),
|
|
40
38
|
})));
|
|
41
39
|
}
|
|
42
40
|
}
|
|
43
41
|
function injectGDataStores(injector) {
|
|
44
|
-
_injectDataStores('
|
|
42
|
+
_injectDataStores('GDataStore', injector);
|
|
45
43
|
}
|
|
46
44
|
exports.injectGDataStores = injectGDataStores;
|
|
47
45
|
function injectSessionDataStores(injector) {
|
|
48
|
-
_injectDataStores('
|
|
46
|
+
_injectDataStores('SessionDataStore', injector);
|
|
49
47
|
}
|
|
50
48
|
exports.injectSessionDataStores = injectSessionDataStores;
|
|
51
49
|
//# sourceMappingURL=decorators.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../../src/remote-service/data-store/decorators.ts"],"names":[],"mappings":";;;AAAA,qCAAmD;AAEnD,mCAA8D;
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../../src/remote-service/data-store/decorators.ts"],"names":[],"mappings":";;;AAAA,qCAAmD;AAEnD,mCAA8D;AAU9D,MAAM,SAAS,GAAG;IAChB,UAAU,EAAE,EAAmB;IAC/B,gBAAgB,EAAE,EAAmB;CAC7B,CAAC;AAGX,SAAS,aAAa,CAAC,IAAmB,EAAE,KAAa,EAAE,OAA0B;IACnF,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE;QAC1B,oCAAoC;QACpC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC;KACnC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC;IACvC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG;QACvB,GAAG;QACH,OAAO;KACR,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC;AAOD,SAAgB,UAAU,CAAC,KAAa,EAAE,OAA0B;IAClE,MAAM,GAAG,GAAG,aAAa,CAAC,YAAY,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAExD,OAAO,IAAA,cAAS,EAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAJD,gCAIC;AAOD,SAAgB,gBAAgB,CAAC,KAAa,EAAE,OAA0B;IACxE,MAAM,GAAG,GAAG,aAAa,CAAC,kBAAkB,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAE9D,OAAO,IAAA,cAAS,EAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAJD,4CAIC;AAED,SAAS,iBAAiB,CAAC,IAAmB,EAAE,QAAkB;IAChE,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,MAAM,EAAE;QACV,QAAQ,CAAC,YAAY,CACnB,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACtC,KAAK,EAAE,IAAI,CAAC,GAAG;YACf,QAAQ,EAAE,IAAI,yBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;SAC9C,CAAC,CAAC,CACJ,CAAC;KACH;AACH,CAAC;AAED,SAAgB,iBAAiB,CAAC,QAAkB;IAClD,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAFD,8CAEC;AAED,SAAgB,uBAAuB,CAAC,QAAkB;IACxD,iBAAiB,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;AAClD,CAAC;AAFD,0DAEC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type Query = Record<
|
|
2
|
-
export type Store<T> = Iterable<T> | Record<
|
|
1
|
+
export type Query = Record<any, any>;
|
|
2
|
+
export type Store<T> = Iterable<T> | Record<any, T> | Map<any, T>;
|
|
3
3
|
export declare function select<I, T extends Store<I>>(items: T, query: Query): I[];
|
|
4
4
|
//# sourceMappingURL=select.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../../src/remote-service/data-store/select.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../../src/remote-service/data-store/select.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACrC,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAelE,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,CAqBzE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../../src/remote-service/data-store/select.ts"],"names":[],"mappings":";;;AAAA,mDAAiD;AAKjD,SAAS,WAAW,CAAC,KAAY;IAC/B,MAAM,UAAU,GAAG,EAAc,CAAC;IAClC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC7C,UAAU,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG;aACL,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;GACjC,CAAC;IAEF,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../../src/remote-service/data-store/select.ts"],"names":[],"mappings":";;;AAAA,mDAAiD;AAKjD,SAAS,WAAW,CAAC,KAAY;IAC/B,MAAM,UAAU,GAAG,EAAc,CAAC;IAClC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC7C,UAAU,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG;aACL,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;GACjC,CAAC;IAEF,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,OAAO,CAA2B,CAAC;AACjE,CAAC;AAED,SAAgB,MAAM,CAAwB,KAAQ,EAAE,KAAY;IAClE,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,EAAS,CAAC;IAEzB,IAAI,SAAoC,CAAC;IAEzC,IAAI,KAAK,YAAY,GAAG,EAAE;QACxB,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;KAC5B;SAAM,IAAI,IAAA,sBAAU,EAAC,KAAK,CAAC,EAAE;QAC5B,SAAS,GAAG,KAAK,CAAC;KACnB;SAAM;QACL,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAClC;IAED,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE;QAC5B,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE;YACjB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACnB;KACF;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AArBD,wBAqBC"}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import { EventEmitter } from '@opensumi/events';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
export interface DataStoreEvent<Item> extends Record<string, any> {
|
|
2
|
+
/**
|
|
3
|
+
* The query looks like:
|
|
4
|
+
* { field: value }
|
|
5
|
+
* { field: conditions }
|
|
6
|
+
*/
|
|
7
|
+
export type Query = Record<string, any>;
|
|
8
|
+
export interface DataStoreEvent<Item> {
|
|
11
9
|
created: [item: Item];
|
|
12
10
|
updated: [oldItem: Item, newItem: Item];
|
|
13
11
|
removed: [item: Item];
|
|
12
|
+
[key: string]: any[];
|
|
14
13
|
}
|
|
15
14
|
export interface DataStoreOptions {
|
|
16
15
|
id?: string;
|
|
17
16
|
}
|
|
18
|
-
|
|
17
|
+
type MarkOptional<T, K extends keyof T> = Omit<T, K> & Partial<T>;
|
|
18
|
+
export declare class InMemoryDataStore<Item extends Record<any, any>, PrimaryKey extends keyof Item = 'id', PrimaryKeyType = Required<Item>[PrimaryKey]> extends EventEmitter<DataStoreEvent<Item>> {
|
|
19
19
|
protected options?: DataStoreOptions | undefined;
|
|
20
20
|
private store;
|
|
21
21
|
private _uid;
|
|
@@ -24,12 +24,15 @@ export declare class InMemoryDataStore<Item> extends EventEmitter<DataStoreEvent
|
|
|
24
24
|
*/
|
|
25
25
|
private id;
|
|
26
26
|
constructor(options?: DataStoreOptions | undefined);
|
|
27
|
-
create(item: Item): Item;
|
|
28
|
-
find(query
|
|
29
|
-
|
|
30
|
-
get(id:
|
|
31
|
-
has(id:
|
|
32
|
-
update(id:
|
|
33
|
-
remove(id:
|
|
27
|
+
create(item: MarkOptional<Item, PrimaryKey>): Item;
|
|
28
|
+
find(query?: Query): Item[] | undefined;
|
|
29
|
+
count(query?: Query): number;
|
|
30
|
+
get(id: PrimaryKeyType): Item | undefined;
|
|
31
|
+
has(id: PrimaryKeyType): boolean;
|
|
32
|
+
update(id: PrimaryKeyType, item: Partial<Item>): void;
|
|
33
|
+
remove(id: PrimaryKeyType): void;
|
|
34
|
+
removeItem(item: Item): void;
|
|
35
|
+
removeAll(query?: Query): void;
|
|
34
36
|
}
|
|
37
|
+
export {};
|
|
35
38
|
//# sourceMappingURL=store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/remote-service/data-store/store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/remote-service/data-store/store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAKhD;;;;GAIG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAExC,MAAM,WAAW,cAAc,CAAC,IAAI;IAClC,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtB,OAAO,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACxC,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAEtB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,KAAK,YAAY,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAElE,qBAAa,iBAAiB,CAC5B,IAAI,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAC7B,UAAU,SAAS,MAAM,IAAI,GAAG,IAAI,EACpC,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAC3C,SAAQ,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAQ9B,SAAS,CAAC,OAAO,CAAC;IAP9B,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,IAAI,CAAK;IACjB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAS;gBAEG,OAAO,CAAC,8BAAkB;IAKhD,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,IAAI;IAUlD,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,SAAS;IAOvC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM;IAQ5B,GAAG,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS;IAIzC,GAAG,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO;IAIhC,MAAM,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAYrD,MAAM,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI;IAShC,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAS5B,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;CAmB/B"}
|
|
@@ -4,6 +4,7 @@ exports.InMemoryDataStore = void 0;
|
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const extend_1 = tslib_1.__importDefault(require("lodash/extend"));
|
|
6
6
|
const events_1 = require("@opensumi/events");
|
|
7
|
+
const ide_utils_1 = require("@opensumi/ide-utils");
|
|
7
8
|
const select_1 = require("./select");
|
|
8
9
|
class InMemoryDataStore extends events_1.EventEmitter {
|
|
9
10
|
constructor(options) {
|
|
@@ -14,18 +15,21 @@ class InMemoryDataStore extends events_1.EventEmitter {
|
|
|
14
15
|
this.id = (options === null || options === void 0 ? void 0 : options.id) || 'id';
|
|
15
16
|
}
|
|
16
17
|
create(item) {
|
|
17
|
-
const id = item[this.id] ||
|
|
18
|
+
const id = item[this.id] || this._uid++;
|
|
18
19
|
const result = (0, extend_1.default)({}, item, { [this.id]: id });
|
|
19
20
|
this.store.set(id, result);
|
|
20
21
|
this.emit('created', result);
|
|
21
22
|
return result;
|
|
22
23
|
}
|
|
23
24
|
find(query) {
|
|
25
|
+
if ((0, ide_utils_1.isUndefined)(query)) {
|
|
26
|
+
return Array.from(this.store.values());
|
|
27
|
+
}
|
|
24
28
|
return (0, select_1.select)(this.store, query);
|
|
25
29
|
}
|
|
26
|
-
|
|
30
|
+
count(query) {
|
|
27
31
|
var _a;
|
|
28
|
-
if (
|
|
32
|
+
if ((0, ide_utils_1.isUndefined)(query)) {
|
|
29
33
|
return this.store.size;
|
|
30
34
|
}
|
|
31
35
|
return ((_a = this.find(query)) === null || _a === void 0 ? void 0 : _a.length) || 0;
|
|
@@ -38,7 +42,7 @@ class InMemoryDataStore extends events_1.EventEmitter {
|
|
|
38
42
|
}
|
|
39
43
|
update(id, item) {
|
|
40
44
|
const current = this.store.get(id);
|
|
41
|
-
if (
|
|
45
|
+
if ((0, ide_utils_1.isUndefined)(current)) {
|
|
42
46
|
return;
|
|
43
47
|
}
|
|
44
48
|
const result = (0, extend_1.default)({}, current, item);
|
|
@@ -52,6 +56,30 @@ class InMemoryDataStore extends events_1.EventEmitter {
|
|
|
52
56
|
}
|
|
53
57
|
this.store.delete(id);
|
|
54
58
|
}
|
|
59
|
+
removeItem(item) {
|
|
60
|
+
const id = item[this.id];
|
|
61
|
+
if ((0, ide_utils_1.isUndefined)(id)) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
this.remove(id);
|
|
65
|
+
}
|
|
66
|
+
removeAll(query) {
|
|
67
|
+
if ((0, ide_utils_1.isUndefined)(query)) {
|
|
68
|
+
const items = Array.from(this.store.values());
|
|
69
|
+
this.store.clear();
|
|
70
|
+
items.forEach((item) => {
|
|
71
|
+
this.emit('removed', item);
|
|
72
|
+
});
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const items = this.find(query);
|
|
76
|
+
if (items) {
|
|
77
|
+
items.forEach((item) => {
|
|
78
|
+
this.store.delete(item[this.id]);
|
|
79
|
+
this.emit('removed', item);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
55
83
|
}
|
|
56
84
|
exports.InMemoryDataStore = InMemoryDataStore;
|
|
57
85
|
//# sourceMappingURL=store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/remote-service/data-store/store.ts"],"names":[],"mappings":";;;;AAAA,mEAAmC;AAEnC,6CAAgD;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/remote-service/data-store/store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opensumi/ide-core-common",
|
|
3
|
-
"version": "3.4.
|
|
3
|
+
"version": "3.4.5-next-1729482152.0",
|
|
4
4
|
"description": "@opensumi/ide-core-common",
|
|
5
5
|
"files": [
|
|
6
6
|
"lib",
|
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"@opensumi/di": "^1.8.0",
|
|
22
22
|
"@opensumi/events": "^1.0.0",
|
|
23
|
-
"@opensumi/ide-utils": "3.4.
|
|
23
|
+
"@opensumi/ide-utils": "3.4.5-next-1729482152.0"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
|
-
"@opensumi/ide-dev-tool": "3.4.
|
|
26
|
+
"@opensumi/ide-dev-tool": "3.4.5-next-1729482152.0"
|
|
27
27
|
},
|
|
28
|
-
"gitHead": "
|
|
28
|
+
"gitHead": "06b3924cdb4f5d3d461221d711b056472a5643fc"
|
|
29
29
|
}
|
|
@@ -345,16 +345,18 @@ class TerminalService {
|
|
|
345
345
|
由于装饰器的执行是在类实例化之前,所以我们可以在 `GDataStore` 这个装饰器中收集 token,然后将它们加入 Injector 即可:
|
|
346
346
|
|
|
347
347
|
```ts
|
|
348
|
-
|
|
348
|
+
function generateToken(type: 'global' | 'session', token: string, options?: DataStoreOptions) {
|
|
349
|
+
// ...
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
export type GDataStore<T, K = number> = InMemoryDataStore<T, K>;
|
|
349
353
|
export function GDataStore(token: string, options?: DataStoreOptions): PropertyDecorator {
|
|
350
|
-
|
|
354
|
+
const sym = generateToken('global', token, options);
|
|
351
355
|
|
|
352
|
-
return Autowired(
|
|
353
|
-
tag:
|
|
356
|
+
return Autowired(sym, {
|
|
357
|
+
tag: token,
|
|
354
358
|
});
|
|
355
359
|
}
|
|
356
|
-
|
|
357
|
-
export type GDataStore<T> = InMemoryDataStore<T>;
|
|
358
360
|
```
|
|
359
361
|
|
|
360
362
|
用一个闭包中的变量 `dataStore` 来储存,然后在创建 Injector 的时候将所有的 token 放入 injector:
|
|
@@ -363,10 +365,8 @@ export type GDataStore<T> = InMemoryDataStore<T>;
|
|
|
363
365
|
function _injectDataStores(injector: Injector) {
|
|
364
366
|
dataStore.forEach(([token, opts]) => {
|
|
365
367
|
injector.addProviders({
|
|
366
|
-
token
|
|
368
|
+
token,
|
|
367
369
|
useValue: new InMemoryDataStore(opts),
|
|
368
|
-
tag: String(token),
|
|
369
|
-
dropdownForTag: false,
|
|
370
370
|
});
|
|
371
371
|
});
|
|
372
372
|
}
|
|
@@ -2,58 +2,72 @@ import { Autowired, Injector } from '@opensumi/di';
|
|
|
2
2
|
|
|
3
3
|
import { DataStoreOptions, InMemoryDataStore } from './store';
|
|
4
4
|
|
|
5
|
+
type DataStoreItem = Record<
|
|
6
|
+
string,
|
|
7
|
+
{
|
|
8
|
+
sym: symbol;
|
|
9
|
+
options: DataStoreOptions | undefined;
|
|
10
|
+
}
|
|
11
|
+
>;
|
|
12
|
+
|
|
5
13
|
const dataStore = {
|
|
6
|
-
|
|
7
|
-
|
|
14
|
+
GDataStore: {} as DataStoreItem,
|
|
15
|
+
SessionDataStore: {} as DataStoreItem,
|
|
8
16
|
} as const;
|
|
17
|
+
type DataStoreType = keyof typeof dataStore;
|
|
9
18
|
|
|
10
|
-
function
|
|
19
|
+
function generateToken(type: DataStoreType, token: string, options?: DataStoreOptions) {
|
|
11
20
|
if (dataStore[type][token]) {
|
|
12
21
|
// 同样的 token 只能被注入一次,options 也以第一次为准
|
|
13
|
-
return;
|
|
22
|
+
return dataStore[type][token].sym;
|
|
14
23
|
}
|
|
15
24
|
|
|
16
|
-
|
|
25
|
+
const sym = Symbol(`${type}:${token}`);
|
|
26
|
+
dataStore[type][token] = {
|
|
27
|
+
sym,
|
|
28
|
+
options,
|
|
29
|
+
};
|
|
30
|
+
return sym;
|
|
17
31
|
}
|
|
18
32
|
|
|
19
|
-
export type GDataStore<
|
|
33
|
+
export type GDataStore<
|
|
34
|
+
Item extends Record<any, any>,
|
|
35
|
+
PrimaryKey = keyof Item,
|
|
36
|
+
PrimaryKeyType = Item[PrimaryKey],
|
|
37
|
+
> = InMemoryDataStore<Item, PrimaryKey, PrimaryKeyType>;
|
|
20
38
|
export function GDataStore(token: string, options?: DataStoreOptions): PropertyDecorator {
|
|
21
|
-
|
|
39
|
+
const sym = generateToken('GDataStore', token, options);
|
|
22
40
|
|
|
23
|
-
return Autowired(
|
|
24
|
-
tag: String(token),
|
|
25
|
-
});
|
|
41
|
+
return Autowired(sym);
|
|
26
42
|
}
|
|
27
43
|
|
|
28
|
-
export type SessionDataStore<
|
|
44
|
+
export type SessionDataStore<
|
|
45
|
+
Item extends Record<any, any>,
|
|
46
|
+
PrimaryKey = keyof Item,
|
|
47
|
+
PrimaryKeyType = Item[PrimaryKey],
|
|
48
|
+
> = InMemoryDataStore<Item, PrimaryKey, PrimaryKeyType>;
|
|
29
49
|
export function SessionDataStore(token: string, options?: DataStoreOptions): PropertyDecorator {
|
|
30
|
-
|
|
50
|
+
const sym = generateToken('SessionDataStore', token, options);
|
|
31
51
|
|
|
32
|
-
return Autowired(
|
|
33
|
-
tag: String(token),
|
|
34
|
-
});
|
|
52
|
+
return Autowired(sym);
|
|
35
53
|
}
|
|
36
54
|
|
|
37
|
-
function _injectDataStores(type:
|
|
55
|
+
function _injectDataStores(type: DataStoreType, injector: Injector) {
|
|
38
56
|
const stores = dataStore[type];
|
|
39
57
|
if (stores) {
|
|
40
|
-
const token = type === 'global' ? GDataStore : SessionDataStore;
|
|
41
|
-
|
|
42
58
|
injector.addProviders(
|
|
43
|
-
...Object.
|
|
44
|
-
token,
|
|
45
|
-
useValue: new InMemoryDataStore(opts),
|
|
46
|
-
tag,
|
|
47
|
-
dropdownForTag: false,
|
|
59
|
+
...Object.values(stores).map((opts) => ({
|
|
60
|
+
token: opts.sym,
|
|
61
|
+
useValue: new InMemoryDataStore(opts.options),
|
|
48
62
|
})),
|
|
49
63
|
);
|
|
50
64
|
}
|
|
51
65
|
}
|
|
52
66
|
|
|
53
67
|
export function injectGDataStores(injector: Injector) {
|
|
54
|
-
_injectDataStores('
|
|
68
|
+
_injectDataStores('GDataStore', injector);
|
|
55
69
|
}
|
|
56
70
|
|
|
57
71
|
export function injectSessionDataStores(injector: Injector) {
|
|
58
|
-
_injectDataStores('
|
|
72
|
+
_injectDataStores('SessionDataStore', injector);
|
|
59
73
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { isIterable } from '@opensumi/ide-utils';
|
|
2
2
|
|
|
3
|
-
export type Query = Record<
|
|
4
|
-
export type Store<T> = Iterable<T> | Record<
|
|
3
|
+
export type Query = Record<any, any>;
|
|
4
|
+
export type Store<T> = Iterable<T> | Record<any, T> | Map<any, T>;
|
|
5
5
|
|
|
6
6
|
function makeMatcher(query: Query) {
|
|
7
7
|
const statements = [] as string[];
|
|
@@ -13,7 +13,7 @@ function makeMatcher(query: Query) {
|
|
|
13
13
|
return ${statements.join(' && ')};
|
|
14
14
|
`;
|
|
15
15
|
|
|
16
|
-
return new Function('item', matcher) as (item:
|
|
16
|
+
return new Function('item', matcher) as (item: any) => boolean;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export function select<I, T extends Store<I>>(items: T, query: Query): I[] {
|
|
@@ -1,30 +1,37 @@
|
|
|
1
1
|
import extend from 'lodash/extend';
|
|
2
2
|
|
|
3
3
|
import { EventEmitter } from '@opensumi/events';
|
|
4
|
+
import { isUndefined } from '@opensumi/ide-utils';
|
|
4
5
|
|
|
5
6
|
import { select } from './select';
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
remove(id: string): void;
|
|
14
|
-
}
|
|
8
|
+
/**
|
|
9
|
+
* The query looks like:
|
|
10
|
+
* { field: value }
|
|
11
|
+
* { field: conditions }
|
|
12
|
+
*/
|
|
13
|
+
export type Query = Record<string, any>;
|
|
15
14
|
|
|
16
|
-
export interface DataStoreEvent<Item>
|
|
15
|
+
export interface DataStoreEvent<Item> {
|
|
17
16
|
created: [item: Item];
|
|
18
17
|
updated: [oldItem: Item, newItem: Item];
|
|
19
18
|
removed: [item: Item];
|
|
19
|
+
|
|
20
|
+
[key: string]: any[];
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
export interface DataStoreOptions {
|
|
23
24
|
id?: string;
|
|
24
25
|
}
|
|
25
26
|
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
type MarkOptional<T, K extends keyof T> = Omit<T, K> & Partial<T>;
|
|
28
|
+
|
|
29
|
+
export class InMemoryDataStore<
|
|
30
|
+
Item extends Record<any, any>,
|
|
31
|
+
PrimaryKey extends keyof Item = 'id',
|
|
32
|
+
PrimaryKeyType = Required<Item>[PrimaryKey],
|
|
33
|
+
> extends EventEmitter<DataStoreEvent<Item>> {
|
|
34
|
+
private store = new Map<PrimaryKeyType, Item>();
|
|
28
35
|
private _uid = 0;
|
|
29
36
|
/**
|
|
30
37
|
* primary key
|
|
@@ -36,8 +43,8 @@ export class InMemoryDataStore<Item> extends EventEmitter<DataStoreEvent<Item>>
|
|
|
36
43
|
this.id = options?.id || 'id';
|
|
37
44
|
}
|
|
38
45
|
|
|
39
|
-
create(item: Item): Item {
|
|
40
|
-
const id = item[this.id] ||
|
|
46
|
+
create(item: MarkOptional<Item, PrimaryKey>): Item {
|
|
47
|
+
const id = item[this.id] || (this._uid++ as PrimaryKeyType);
|
|
41
48
|
const result = extend({}, item, { [this.id]: id }) as Item;
|
|
42
49
|
|
|
43
50
|
this.store.set(id, result);
|
|
@@ -46,29 +53,32 @@ export class InMemoryDataStore<Item> extends EventEmitter<DataStoreEvent<Item>>
|
|
|
46
53
|
return result;
|
|
47
54
|
}
|
|
48
55
|
|
|
49
|
-
find(query
|
|
56
|
+
find(query?: Query): Item[] | undefined {
|
|
57
|
+
if (isUndefined(query)) {
|
|
58
|
+
return Array.from(this.store.values());
|
|
59
|
+
}
|
|
50
60
|
return select(this.store, query);
|
|
51
61
|
}
|
|
52
62
|
|
|
53
|
-
|
|
54
|
-
if (
|
|
63
|
+
count(query?: Query): number {
|
|
64
|
+
if (isUndefined(query)) {
|
|
55
65
|
return this.store.size;
|
|
56
66
|
}
|
|
57
67
|
|
|
58
68
|
return this.find(query)?.length || 0;
|
|
59
69
|
}
|
|
60
70
|
|
|
61
|
-
get(id:
|
|
71
|
+
get(id: PrimaryKeyType): Item | undefined {
|
|
62
72
|
return this.store.get(id);
|
|
63
73
|
}
|
|
64
74
|
|
|
65
|
-
has(id:
|
|
75
|
+
has(id: PrimaryKeyType): boolean {
|
|
66
76
|
return this.store.has(id);
|
|
67
77
|
}
|
|
68
78
|
|
|
69
|
-
update(id:
|
|
79
|
+
update(id: PrimaryKeyType, item: Partial<Item>): void {
|
|
70
80
|
const current = this.store.get(id);
|
|
71
|
-
if (
|
|
81
|
+
if (isUndefined(current)) {
|
|
72
82
|
return;
|
|
73
83
|
}
|
|
74
84
|
|
|
@@ -78,7 +88,7 @@ export class InMemoryDataStore<Item> extends EventEmitter<DataStoreEvent<Item>>
|
|
|
78
88
|
this.store.set(id, result);
|
|
79
89
|
}
|
|
80
90
|
|
|
81
|
-
remove(id:
|
|
91
|
+
remove(id: PrimaryKeyType): void {
|
|
82
92
|
const item = this.store.get(id);
|
|
83
93
|
if (item) {
|
|
84
94
|
this.emit('removed', item);
|
|
@@ -86,4 +96,33 @@ export class InMemoryDataStore<Item> extends EventEmitter<DataStoreEvent<Item>>
|
|
|
86
96
|
|
|
87
97
|
this.store.delete(id);
|
|
88
98
|
}
|
|
99
|
+
|
|
100
|
+
removeItem(item: Item): void {
|
|
101
|
+
const id = item[this.id] as PrimaryKeyType;
|
|
102
|
+
if (isUndefined(id)) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
this.remove(id);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
removeAll(query?: Query): void {
|
|
110
|
+
if (isUndefined(query)) {
|
|
111
|
+
const items = Array.from(this.store.values());
|
|
112
|
+
this.store.clear();
|
|
113
|
+
|
|
114
|
+
items.forEach((item) => {
|
|
115
|
+
this.emit('removed', item);
|
|
116
|
+
});
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const items = this.find(query);
|
|
121
|
+
if (items) {
|
|
122
|
+
items.forEach((item) => {
|
|
123
|
+
this.store.delete(item[this.id]);
|
|
124
|
+
this.emit('removed', item);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
89
128
|
}
|