@opensumi/ide-core-common 3.4.4 → 3.4.5-next-1729069673.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.
@@ -345,16 +345,18 @@ class TerminalService {
345
345
  由于装饰器的执行是在类实例化之前,所以我们可以在 `GDataStore` 这个装饰器中收集 token,然后将它们加入 Injector 即可:
346
346
 
347
347
  ```ts
348
- const dataStore = [] as [string, DataStoreOptions][];
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
- dataStore.push([token, options]);
354
+ const sym = generateToken('global', token, options);
351
355
 
352
- return Autowired(GDataStore, {
353
- tag: String(token),
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: GDataStore,
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<T> = InMemoryDataStore<T>;
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<T> = InMemoryDataStore<T>;
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;AAgB9D,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC;AACjD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,iBAAiB,CAMvF;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC;AACvD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,iBAAiB,CAM7F;AAkBD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,QAEnD;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,QAEzD"}
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
- global: {},
8
- session: {},
7
+ GDataStore: {},
8
+ SessionDataStore: {},
9
9
  };
10
- function saveToken(type, token, options) {
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
- dataStore[type][token] = options;
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
- saveToken('global', token, options);
19
- return (0, di_1.Autowired)(GDataStore, {
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
- saveToken('session', token, options);
26
- return (0, di_1.Autowired)(SessionDataStore, {
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
- const token = type === 'global' ? GDataStore : SessionDataStore;
35
- injector.addProviders(...Object.entries(stores).map(([tag, opts]) => ({
36
- token,
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('global', injector);
42
+ _injectDataStores('GDataStore', injector);
45
43
  }
46
44
  exports.injectGDataStores = injectGDataStores;
47
45
  function injectSessionDataStores(injector) {
48
- _injectDataStores('session', injector);
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;AAE9D,MAAM,SAAS,GAAG;IAChB,MAAM,EAAE,EAAkD;IAC1D,OAAO,EAAE,EAAkD;CACnD,CAAC;AAEX,SAAS,SAAS,CAAC,IAA0B,EAAE,KAAa,EAAE,OAA0B;IACtF,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE;QAC1B,oCAAoC;QACpC,OAAO;KACR;IAED,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;AACnC,CAAC;AAGD,SAAgB,UAAU,CAAC,KAAa,EAAE,OAA0B;IAClE,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAEpC,OAAO,IAAA,cAAS,EAAC,UAAU,EAAE;QAC3B,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC;KACnB,CAAC,CAAC;AACL,CAAC;AAND,gCAMC;AAGD,SAAgB,gBAAgB,CAAC,KAAa,EAAE,OAA0B;IACxE,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAErC,OAAO,IAAA,cAAS,EAAC,gBAAgB,EAAE;QACjC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC;KACnB,CAAC,CAAC;AACL,CAAC;AAND,4CAMC;AAED,SAAS,iBAAiB,CAAC,IAA0B,EAAE,QAAkB;IACvE,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,MAAM,EAAE;QACV,MAAM,KAAK,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAEhE,QAAQ,CAAC,YAAY,CACnB,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9C,KAAK;YACL,QAAQ,EAAE,IAAI,yBAAiB,CAAC,IAAI,CAAC;YACrC,GAAG;YACH,cAAc,EAAE,KAAK;SACtB,CAAC,CAAC,CACJ,CAAC;KACH;AACH,CAAC;AAED,SAAgB,iBAAiB,CAAC,QAAkB;IAClD,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACxC,CAAC;AAFD,8CAEC;AAED,SAAgB,uBAAuB,CAAC,QAAkB;IACxD,iBAAiB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAFD,0DAEC"}
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<string, any>;
2
- export type Store<T> = Iterable<T> | Record<string, T> | Map<string, T>;
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,MAAM,EAAE,GAAG,CAAC,CAAC;AACxC,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAexE,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,CAqBzE"}
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,CAA6B,CAAC;AACnE,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
+ {"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
- export interface DataStore<Item> {
3
- create(item: Item): Item;
4
- find(query: Record<string, any>): Item[] | undefined;
5
- size(query: Record<string, any>): number;
6
- get(id: string, query?: Record<string, any>): Item | undefined;
7
- update(id: string, item: Partial<Item>): void;
8
- remove(id: string): void;
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
- export declare class InMemoryDataStore<Item> extends EventEmitter<DataStoreEvent<Item>> implements DataStore<Item> {
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: Record<string, any>): Item[] | undefined;
29
- size(query?: Record<string, any>): number;
30
- get(id: string): Item | undefined;
31
- has(id: string): boolean;
32
- update(id: string, item: Partial<Item>): void;
33
- remove(id: string): void;
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;AAIhD,MAAM,WAAW,SAAS,CAAC,IAAI;IAC7B,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,SAAS,CAAC;IACrD,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC;IACzC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/D,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC9C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc,CAAC,IAAI,CAAE,SAAQ,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAC/D,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;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,qBAAa,iBAAiB,CAAC,IAAI,CAAE,SAAQ,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,CAAE,YAAW,SAAS,CAAC,IAAI,CAAC;IAQ5F,SAAS,CAAC,OAAO,CAAC;IAP9B,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,IAAI,CAAK;IACjB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAS;gBAEG,OAAO,CAAC,8BAAkB;IAKhD,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAUxB,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,SAAS;IAIpD,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM;IAQzC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAIjC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIxB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAY7C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;CAQzB"}
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] || String(this._uid++);
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
- size(query) {
30
+ count(query) {
27
31
  var _a;
28
- if (!query) {
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 (!current) {
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;AAEhD,qCAAkC;AAqBlC,MAAa,iBAAwB,SAAQ,qBAAkC;IAQ7E,YAAsB,OAA0B;QAC9C,KAAK,EAAE,CAAC;QADY,YAAO,GAAP,OAAO,CAAmB;QAPxC,UAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;QAChC,SAAI,GAAG,CAAC,CAAC;QAQf,IAAI,CAAC,EAAE,GAAG,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,EAAE,KAAI,IAAI,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,IAAU;QACf,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAA,gBAAM,EAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAS,CAAC;QAE3D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAE3B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,KAA0B;QAC7B,OAAO,IAAA,eAAM,EAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,CAAC,KAA2B;;QAC9B,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;SACxB;QAED,OAAO,CAAA,MAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,0CAAE,MAAM,KAAI,CAAC,CAAC;IACvC,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,EAAU,EAAE,IAAmB;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO;SACR;QAED,MAAM,MAAM,GAAG,IAAA,gBAAM,EAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAEtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,EAAU;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;SAC5B;QAED,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;CACF;AA/DD,8CA+DC"}
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.4",
3
+ "version": "3.4.5-next-1729069673.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.4"
23
+ "@opensumi/ide-utils": "3.4.5-next-1729069673.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@opensumi/ide-dev-tool": "3.4.4"
26
+ "@opensumi/ide-dev-tool": "3.4.5-next-1729069673.0"
27
27
  },
28
- "gitHead": "591891f890560abddd476796a0a7a5b9683b1847"
28
+ "gitHead": "7c5e59b90a73d8dee58adab31b1239a9a319c972"
29
29
  }
@@ -345,16 +345,18 @@ class TerminalService {
345
345
  由于装饰器的执行是在类实例化之前,所以我们可以在 `GDataStore` 这个装饰器中收集 token,然后将它们加入 Injector 即可:
346
346
 
347
347
  ```ts
348
- const dataStore = [] as [string, DataStoreOptions][];
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
- dataStore.push([token, options]);
354
+ const sym = generateToken('global', token, options);
351
355
 
352
- return Autowired(GDataStore, {
353
- tag: String(token),
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: GDataStore,
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
- global: {} as Record<string, DataStoreOptions | undefined>,
7
- session: {} as Record<string, DataStoreOptions | undefined>,
14
+ GDataStore: {} as DataStoreItem,
15
+ SessionDataStore: {} as DataStoreItem,
8
16
  } as const;
17
+ type DataStoreType = keyof typeof dataStore;
9
18
 
10
- function saveToken(type: 'global' | 'session', token: string, options?: DataStoreOptions) {
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
- dataStore[type][token] = options;
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<T> = InMemoryDataStore<T>;
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
- saveToken('global', token, options);
39
+ const sym = generateToken('GDataStore', token, options);
22
40
 
23
- return Autowired(GDataStore, {
24
- tag: String(token),
25
- });
41
+ return Autowired(sym);
26
42
  }
27
43
 
28
- export type SessionDataStore<T> = InMemoryDataStore<T>;
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
- saveToken('session', token, options);
50
+ const sym = generateToken('SessionDataStore', token, options);
31
51
 
32
- return Autowired(SessionDataStore, {
33
- tag: String(token),
34
- });
52
+ return Autowired(sym);
35
53
  }
36
54
 
37
- function _injectDataStores(type: 'global' | 'session', injector: Injector) {
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.entries(stores).map(([tag, opts]) => ({
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('global', injector);
68
+ _injectDataStores('GDataStore', injector);
55
69
  }
56
70
 
57
71
  export function injectSessionDataStores(injector: Injector) {
58
- _injectDataStores('session', injector);
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<string, any>;
4
- export type Store<T> = Iterable<T> | Record<string, T> | Map<string, T>;
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: Query) => boolean;
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
- export interface DataStore<Item> {
8
- create(item: Item): Item;
9
- find(query: Record<string, any>): Item[] | undefined;
10
- size(query: Record<string, any>): number;
11
- get(id: string, query?: Record<string, any>): Item | undefined;
12
- update(id: string, item: Partial<Item>): void;
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> extends Record<string, any> {
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
- export class InMemoryDataStore<Item> extends EventEmitter<DataStoreEvent<Item>> implements DataStore<Item> {
27
- private store = new Map<string, Item>();
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] || String(this._uid++);
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: Record<string, any>): Item[] | undefined {
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
- size(query?: Record<string, any>): number {
54
- if (!query) {
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: string): Item | undefined {
71
+ get(id: PrimaryKeyType): Item | undefined {
62
72
  return this.store.get(id);
63
73
  }
64
74
 
65
- has(id: string): boolean {
75
+ has(id: PrimaryKeyType): boolean {
66
76
  return this.store.has(id);
67
77
  }
68
78
 
69
- update(id: string, item: Partial<Item>): void {
79
+ update(id: PrimaryKeyType, item: Partial<Item>): void {
70
80
  const current = this.store.get(id);
71
- if (!current) {
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: string): void {
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
  }