@zk-tech/bedrock 0.0.1 → 0.1.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.
Files changed (221) hide show
  1. package/dist/async/index.cjs.map +1 -1
  2. package/dist/async/index.d.cts +2 -2
  3. package/dist/async/index.d.ts +2 -2
  4. package/dist/async/index.js.map +1 -1
  5. package/dist/error/index.cjs.map +1 -1
  6. package/dist/error/index.d.cts +19 -19
  7. package/dist/error/index.d.ts +19 -19
  8. package/dist/error/index.js.map +1 -1
  9. package/dist/{error-base-B4zaiJ5m.d.cts → error-base-DOFtBFla.d.cts} +8 -8
  10. package/dist/{error-base-B4zaiJ5m.d.ts → error-base-DOFtBFla.d.ts} +8 -8
  11. package/dist/promise/index.cjs.map +1 -1
  12. package/dist/promise/index.d.cts +4 -4
  13. package/dist/promise/index.d.ts +4 -4
  14. package/dist/promise/index.js.map +1 -1
  15. package/dist/worker/index.cjs.map +1 -1
  16. package/dist/worker/index.d.cts +2 -2
  17. package/dist/worker/index.d.ts +2 -2
  18. package/dist/worker/index.js.map +1 -1
  19. package/package.json +1 -2
  20. package/src/_internal/logger.ts +0 -59
  21. package/src/array/array.test.ts +0 -35
  22. package/src/array/array.ts +0 -25
  23. package/src/array/index.ts +0 -1
  24. package/src/assert/assert.test.ts +0 -86
  25. package/src/assert/assert.ts +0 -42
  26. package/src/assert/index.ts +0 -2
  27. package/src/async/barrier.test.ts +0 -90
  28. package/src/async/barrier.ts +0 -58
  29. package/src/async/cancellation.test.ts +0 -85
  30. package/src/async/cancellation.ts +0 -193
  31. package/src/async/index.ts +0 -18
  32. package/src/async/queue/queue.test.ts +0 -70
  33. package/src/async/queue/queue.ts +0 -56
  34. package/src/async/queue/task.test.ts +0 -155
  35. package/src/async/queue/task.ts +0 -67
  36. package/src/async/utils.test.ts +0 -28
  37. package/src/async/utils.ts +0 -8
  38. package/src/async/wait.ts +0 -9
  39. package/src/byte/format.test.ts +0 -64
  40. package/src/byte/format.ts +0 -44
  41. package/src/byte/index.ts +0 -2
  42. package/src/byte/node_modules/.vitest/results.json +0 -1
  43. package/src/byte/var.ts +0 -11
  44. package/src/cache/index.ts +0 -2
  45. package/src/cache/lru-with-timeout.test.ts +0 -88
  46. package/src/cache/lru-with-timeout.ts +0 -85
  47. package/src/cache/lru.test.ts +0 -56
  48. package/src/cache/lru.ts +0 -59
  49. package/src/context/context.test.ts +0 -17
  50. package/src/context/context.ts +0 -60
  51. package/src/context/index.ts +0 -8
  52. package/src/di/base.ts +0 -73
  53. package/src/di/container-service.test.ts +0 -179
  54. package/src/di/context.web.tsx +0 -41
  55. package/src/di/descriptor.ts +0 -31
  56. package/src/di/idle-value.test.ts +0 -73
  57. package/src/di/idle-value.ts +0 -63
  58. package/src/di/index.common.ts +0 -32
  59. package/src/di/index.ts +0 -2
  60. package/src/di/instantiation-service.interface.ts +0 -46
  61. package/src/di/instantiation-service.test.ts +0 -337
  62. package/src/di/instantiation-service.ts +0 -468
  63. package/src/di/lazy/foo.mock.ts +0 -28
  64. package/src/di/lazy/idle-load.ts +0 -39
  65. package/src/di/lazy/index.ts +0 -4
  66. package/src/di/lazy/lazy-service.test.ts +0 -65
  67. package/src/di/lazy/lazy-service.ts +0 -71
  68. package/src/di/lazy/type.ts +0 -5
  69. package/src/di/node_modules/.vitest/results.json +0 -1
  70. package/src/di/proxy-builder.test.ts +0 -45
  71. package/src/di/proxy-builder.ts +0 -38
  72. package/src/di/service-collection.test.ts +0 -27
  73. package/src/di/service-collection.ts +0 -46
  74. package/src/di/service-ownership-collection.test.ts +0 -39
  75. package/src/di/service-ownership-collection.ts +0 -38
  76. package/src/di/service-registry.test.ts +0 -66
  77. package/src/di/service-registry.ts +0 -99
  78. package/src/di/trace.ts +0 -85
  79. package/src/dispose/disposable-store.test.ts +0 -57
  80. package/src/dispose/disposable-store.ts +0 -80
  81. package/src/dispose/disposable-t.test.ts +0 -123
  82. package/src/dispose/disposable-t.ts +0 -238
  83. package/src/dispose/disposable-utils.test.ts +0 -15
  84. package/src/dispose/disposable-utils.ts +0 -28
  85. package/src/dispose/dispose-base.ts +0 -9
  86. package/src/dispose/index.ts +0 -34
  87. package/src/dispose/logger.test.ts +0 -65
  88. package/src/dispose/logger.ts +0 -39
  89. package/src/dispose/timer.test.ts +0 -30
  90. package/src/dispose/timer.ts +0 -16
  91. package/src/dispose/tracker.test.ts +0 -51
  92. package/src/dispose/tracker.ts +0 -105
  93. package/src/error/error-base.ts +0 -45
  94. package/src/error/error-code.ts +0 -39
  95. package/src/error/error-const.test.ts +0 -30
  96. package/src/error/error-const.ts +0 -16
  97. package/src/error/error-or.test.ts +0 -44
  98. package/src/error/error-or.ts +0 -2
  99. package/src/error/error-t.test.ts +0 -116
  100. package/src/error/error-t.ts +0 -100
  101. package/src/error/index.ts +0 -24
  102. package/src/error/node_modules/.vitest/results.json +0 -1
  103. package/src/event/disposable-linked-list.ts +0 -29
  104. package/src/event/emitter.test.ts +0 -191
  105. package/src/event/emitter.ts +0 -162
  106. package/src/event/error-handler.ts +0 -22
  107. package/src/event/index.ts +0 -34
  108. package/src/event/once.ts +0 -29
  109. package/src/event/phase-emitter.test.ts +0 -212
  110. package/src/event/phase-emitter.ts +0 -209
  111. package/src/event/shortcut-event-utils.ts +0 -33
  112. package/src/event/utils.ts +0 -6
  113. package/src/event/when.ts +0 -40
  114. package/src/function/debounce.test.ts +0 -274
  115. package/src/function/debounce.ts +0 -168
  116. package/src/function/index.ts +0 -2
  117. package/src/function/node_modules/.vitest/results.json +0 -1
  118. package/src/function/throttle.test.ts +0 -179
  119. package/src/function/throttle.ts +0 -26
  120. package/src/hash/hash-t.test.ts +0 -100
  121. package/src/hash/hash-t.ts +0 -51
  122. package/src/hash/index.ts +0 -3
  123. package/src/json/index.ts +0 -1
  124. package/src/json/node_modules/.vitest/results.json +0 -1
  125. package/src/json/parse.ts +0 -19
  126. package/src/launch/abstract-job.ts +0 -45
  127. package/src/launch/cost-recorder.ts +0 -22
  128. package/src/launch/index.ts +0 -2
  129. package/src/launch/job-scheduler.test.ts +0 -122
  130. package/src/launch/job-scheduler.ts +0 -118
  131. package/src/launch/node_modules/.vitest/deps/_metadata.json +0 -8
  132. package/src/launch/node_modules/.vitest/deps/package.json +0 -3
  133. package/src/launch/node_modules/.vitest/results.json +0 -1
  134. package/src/lock/README.md +0 -11
  135. package/src/lock/capability.test.ts +0 -110
  136. package/src/lock/capability.ts +0 -89
  137. package/src/lock/index.ts +0 -15
  138. package/src/lock/node_modules/.vitest/results.json +0 -1
  139. package/src/lock/semaphore.ts +0 -21
  140. package/src/lock/shared-mutex.test.ts +0 -537
  141. package/src/lock/shared-mutex.ts +0 -242
  142. package/src/lock/utils.test.ts +0 -165
  143. package/src/lock/utils.ts +0 -135
  144. package/src/lodash-es/index.ts +0 -1
  145. package/src/math/degree.ts +0 -16
  146. package/src/math/index.ts +0 -7
  147. package/src/math/math.test.ts +0 -40
  148. package/src/math/math.ts +0 -64
  149. package/src/math/node_modules/.vitest/results.json +0 -1
  150. package/src/math/vector.test.ts +0 -73
  151. package/src/math/vector.ts +0 -114
  152. package/src/network/client.interface.ts +0 -104
  153. package/src/network/client.web.ts +0 -24
  154. package/src/network/index.common.ts +0 -10
  155. package/src/network/index.ts +0 -2
  156. package/src/network/plugins/retry.ts +0 -98
  157. package/src/objects/deep-clone.test.ts +0 -40
  158. package/src/objects/deep-clone.ts +0 -13
  159. package/src/objects/deep-equal.test.ts +0 -86
  160. package/src/objects/deep-equal.ts +0 -60
  161. package/src/objects/index.ts +0 -4
  162. package/src/platform/index.ts +0 -64
  163. package/src/promise/index.ts +0 -16
  164. package/src/promise/promise.test.ts +0 -254
  165. package/src/promise/promise.ts +0 -212
  166. package/src/scheduler/callback-token.ts +0 -31
  167. package/src/scheduler/core/actuator-args.test.ts +0 -47
  168. package/src/scheduler/core/actuator.test.ts +0 -82
  169. package/src/scheduler/core/actuator.ts +0 -58
  170. package/src/scheduler/core/chunk-scheduler.test.ts +0 -54
  171. package/src/scheduler/core/chunk-scheduler.ts +0 -28
  172. package/src/scheduler/core/node_modules/.vitest/results.json +0 -1
  173. package/src/scheduler/core/scheduler.test.ts +0 -328
  174. package/src/scheduler/core/scheduler.ts +0 -172
  175. package/src/scheduler/core/task-queue.test.ts +0 -78
  176. package/src/scheduler/core/task-queue.ts +0 -44
  177. package/src/scheduler/core/task.test.ts +0 -34
  178. package/src/scheduler/core/task.ts +0 -52
  179. package/src/scheduler/core/utils.ts +0 -48
  180. package/src/scheduler/executor/abstract-executor.test.ts +0 -44
  181. package/src/scheduler/executor/abstract-executor.ts +0 -38
  182. package/src/scheduler/executor/executor.interface.ts +0 -39
  183. package/src/scheduler/executor/idle-callback-executor.test.ts +0 -70
  184. package/src/scheduler/executor/idle-callback-executor.ts +0 -98
  185. package/src/scheduler/executor/make-executor.ts +0 -18
  186. package/src/scheduler/executor/post-message-executor.test.ts +0 -66
  187. package/src/scheduler/executor/post-message-executor.ts +0 -52
  188. package/src/scheduler/index.ts +0 -15
  189. package/src/scheduler/lv-scheduler-callback.ts +0 -19
  190. package/src/scheduler/lv-scheduler-config.ts +0 -17
  191. package/src/scheduler/type.ts +0 -48
  192. package/src/sprintf/index.ts +0 -2
  193. package/src/sprintf/sprintf.test.ts +0 -95
  194. package/src/sprintf/sprintf.ts +0 -97
  195. package/src/structure/graph.test.ts +0 -181
  196. package/src/structure/graph.ts +0 -105
  197. package/src/structure/index.ts +0 -8
  198. package/src/structure/linked-list.test.ts +0 -74
  199. package/src/structure/linked-list.ts +0 -145
  200. package/src/structure/min-heap.test.ts +0 -71
  201. package/src/structure/min-heap.ts +0 -91
  202. package/src/type/REAME.md +0 -2
  203. package/src/type/distributive-omit.interface.ts +0 -4
  204. package/src/type/index.ts +0 -3
  205. package/src/type/object-key-paths.interface.ts +0 -40
  206. package/src/undo-redo-stack/README.md +0 -61
  207. package/src/undo-redo-stack/action-stack.test.ts +0 -330
  208. package/src/undo-redo-stack/action-stack.ts +0 -150
  209. package/src/undo-redo-stack/element.ts +0 -4
  210. package/src/undo-redo-stack/index.ts +0 -7
  211. package/src/undo-redo-stack/state-stack.test.ts +0 -118
  212. package/src/undo-redo-stack/state-stack.ts +0 -133
  213. package/src/uuid/index.ts +0 -7
  214. package/src/uuid/uuid.ts +0 -86
  215. package/src/worker/cors-worker.ts +0 -38
  216. package/src/worker/index.ts +0 -4
  217. package/src/worker/node_modules/.vitest/results.json +0 -1
  218. package/src/worker/promise-worker-main-thread.test.ts +0 -91
  219. package/src/worker/promise-worker-main-thread.ts +0 -76
  220. package/src/worker/promise-worker-worker-thread.ts +0 -64
  221. package/src/worker/promise-worker.interface.ts +0 -15
@@ -1,17 +0,0 @@
1
- import { makeEntryContext, makeUserInputContext } from './context';
2
-
3
- describe('context', () => {
4
- it('bind', () => {
5
- const context = makeEntryContext();
6
- expect(context.getValue('lvweb')).toBeUndefined();
7
- context.setValue('lvweb', true);
8
- expect(context.getValue('lvweb')).toBeTruthy();
9
- });
10
-
11
- it('background', () => {
12
- const context = makeUserInputContext();
13
- context.setValue('lvweb', true);
14
- const newContext = context.background();
15
- expect(newContext.getValue('lvweb')).toBeUndefined();
16
- });
17
- });
@@ -1,60 +0,0 @@
1
- /**
2
- * Context类型
3
- */
4
- export enum ContextType {
5
- // 入口
6
- Entry,
7
- // 事件
8
- Event,
9
- // 用户
10
- UserInput,
11
- // 自定义任务
12
- Task,
13
- }
14
-
15
- export class Context {
16
- private readonly _store = new Map<string, any>();
17
-
18
- constructor(public readonly type: ContextType = ContextType.Task) {}
19
-
20
- /**
21
- * 获取一个纯粹的上下文
22
- */
23
- background() {
24
- return new Context(this.type);
25
- }
26
-
27
- /**
28
- * 绑定信息
29
- */
30
- setValue<T>(key: string, value: T) {
31
- this._store.set(key, value);
32
- }
33
-
34
- /**
35
- * 获取信息
36
- */
37
- getValue<T>(key: string) {
38
- return this._store.get(key) as T | undefined;
39
- }
40
- }
41
-
42
- export function makeEntryContext() {
43
- return new Context(ContextType.Entry);
44
- }
45
-
46
- export function makeEventContext() {
47
- return new Context(ContextType.Event);
48
- }
49
-
50
- export function makeUserInputContext() {
51
- return new Context(ContextType.UserInput);
52
- }
53
-
54
- export function makeTaskContext() {
55
- return new Context(ContextType.Task);
56
- }
57
-
58
- export function makeContext() {
59
- return new Context();
60
- }
@@ -1,8 +0,0 @@
1
- export { Context, ContextType } from './context';
2
- export {
3
- makeEntryContext,
4
- makeEventContext,
5
- makeUserInputContext,
6
- makeTaskContext,
7
- makeContext,
8
- } from './context';
package/src/di/base.ts DELETED
@@ -1,73 +0,0 @@
1
- // service特征标识
2
- export type BrandedService = { _serviceBrand: undefined };
3
-
4
- //
5
- // 服务唯一标识符(编译时生成)
6
- // 需要DI进行注入的服务必须拥有该标识符
7
- // 本质上是一个参数装饰器
8
- //
9
- export interface ServiceIdentifier<T> {
10
- (...args: any[]): void;
11
- type: T;
12
- }
13
-
14
- // 获取服务的视图接口
15
- export interface ServicesAccessor {
16
- get: <T>(id: ServiceIdentifier<T>) => T;
17
- }
18
-
19
- // 服务唯一标识符存储
20
- const serviceIds = new Map<string, ServiceIdentifier<any>>();
21
-
22
- export const DI_TARGET = '$di$target';
23
- export const DI_DEPENDENCIES = '$di$dependencies';
24
-
25
- // 获取某个服务的依赖
26
- // 因为服务依赖关系会存放在构造函数的属性上
27
- export function getServiceDependencies(ctor: any): { id: ServiceIdentifier<any>; index: number }[] {
28
- return ctor[DI_DEPENDENCIES] || [];
29
- }
30
-
31
- // 更新服务依赖依赖关系
32
- function setServiceDependency(id: ServiceIdentifier<any>, ctor: any, index: number): void {
33
- if (ctor[DI_TARGET] === ctor) {
34
- ctor[DI_DEPENDENCIES].push({ id, index });
35
- } else {
36
- ctor[DI_DEPENDENCIES] = [{ id, index }];
37
- ctor[DI_TARGET] = ctor;
38
- }
39
- }
40
-
41
- //
42
- // 创建服务唯一标识符
43
- // 传入服务ID,返回一个参数装饰器
44
- // 参数装饰器会记录A需要
45
- // const IFooServiceId = createDecorator<FooService>('FooService');
46
- //
47
- // class Bar
48
- // constructor(@IFooServiceId a: IFooService) // IFooService是接口声明
49
- //
50
- export function createDecorator<T>(serviceId: string): ServiceIdentifier<T> {
51
- if (serviceIds.has(serviceId)) {
52
- return serviceIds.get(serviceId)!;
53
- }
54
-
55
- const id = function (target: any, key: string, index: number): any {
56
- if (arguments.length !== 3) {
57
- throw new Error('@IServiceName-decorator can only be used to decorate a parameter');
58
- }
59
- setServiceDependency(id, target, index);
60
- } as any;
61
-
62
- id.toString = () => serviceId;
63
-
64
- serviceIds.set(serviceId, id);
65
- return id;
66
- }
67
-
68
- // TODO(niurouwan): 补一下注释和例子
69
- export function refineServiceDecorator<T1, T extends T1>(
70
- serviceIdentifier: ServiceIdentifier<T1>,
71
- ): ServiceIdentifier<T> {
72
- return serviceIdentifier as ServiceIdentifier<T>;
73
- }
@@ -1,179 +0,0 @@
1
- import { createDecorator } from './base';
2
- import { InstantiationService as ContainerService, InstantiationService } from './instantiation-service';
3
- import { ServiceOwnership } from './service-ownership-collection';
4
- import { ServiceRegistry } from './service-registry';
5
-
6
- /**
7
- * 存在dispose的service1
8
- */
9
- class MockService1 {
10
- readonly _serviceBrand: undefined;
11
-
12
- constructor(private readonly _fn: () => void) {}
13
-
14
- dispose() {
15
- this._fn();
16
- }
17
- }
18
- const IMockService1 = createDecorator<MockService1>('MockService1');
19
-
20
- /**
21
- * 存在dispose的service2
22
- */
23
- class MockService2 {
24
- readonly _serviceBrand: undefined;
25
-
26
- constructor(private readonly _fn: () => void) {}
27
-
28
- dispose() {
29
- this._fn();
30
- }
31
- }
32
- const IMockService2 = createDecorator<MockService2>('MockService2');
33
-
34
- /**
35
- * 不存在dispose的service
36
- */
37
- class MockService3 {
38
- readonly _serviceBrand: undefined;
39
-
40
- constructor(private readonly _fn: () => void) {}
41
- }
42
- const IMockService3 = createDecorator<MockService3>('MockService3');
43
-
44
- /**
45
- * reference service
46
- */
47
- class MockService4 {
48
- readonly _serviceBrand: undefined;
49
-
50
- constructor(private readonly _fn: () => void) {}
51
-
52
- dispose() {
53
- this._fn();
54
- }
55
- }
56
- const IMockService4 = createDecorator<MockService4>('MockService4');
57
-
58
- describe('ContainerService', () => {
59
- // 单层的dispose
60
- it('dispose1', () => {
61
- const fn1 = vi.fn();
62
- const fn2 = vi.fn();
63
- const fn3 = vi.fn();
64
-
65
- const registry = new ServiceRegistry();
66
- registry.registerInstance(IMockService1, new MockService1(fn1));
67
- registry.registerInstance(IMockService2, new MockService2(fn2));
68
- registry.registerInstance(IMockService3, new MockService3(fn3));
69
- const containerService = new ContainerService(registry.makeCollection());
70
- containerService.dispose();
71
-
72
- expect(fn1).toBeCalled();
73
- expect(fn2).toBeCalled();
74
- expect(fn3).not.toBeCalled();
75
- });
76
-
77
- // 双层的dispose,一起销毁
78
- it('dispose2', () => {
79
- const fn1 = vi.fn();
80
- const fn2 = vi.fn();
81
- const fn3 = vi.fn();
82
-
83
- const registry1 = new ServiceRegistry();
84
- registry1.registerInstance(IMockService1, new MockService1(fn1));
85
- const containerService = new ContainerService(registry1.makeCollection());
86
-
87
- const registry2 = new ServiceRegistry();
88
- registry2.registerInstance(IMockService2, new MockService2(fn2));
89
- registry2.registerInstance(IMockService3, new MockService3(fn3));
90
- const childContainerService = new ContainerService(registry2.makeCollection(), containerService);
91
- // eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
92
- expect(containerService['_childs'].has(childContainerService)).toBeTruthy();
93
-
94
- containerService.dispose();
95
-
96
- expect(fn1).toBeCalled();
97
- expect(fn2).toBeCalled();
98
- expect(fn3).not.toBeCalled();
99
- // eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
100
- expect(containerService['_childs'].has(childContainerService)).toBeFalsy();
101
- });
102
-
103
- // 双层的dispose,只销毁下一层
104
- it('dispose3', () => {
105
- const fn1 = vi.fn();
106
- const fn2 = vi.fn();
107
- const fn3 = vi.fn();
108
-
109
- const registry1 = new ServiceRegistry();
110
- registry1.registerInstance(IMockService1, new MockService1(fn1));
111
- const containerService = new ContainerService(registry1.makeCollection());
112
-
113
- const registry2 = new ServiceRegistry();
114
- registry2.registerInstance(IMockService2, new MockService2(fn2));
115
- registry2.registerInstance(IMockService3, new MockService3(fn3));
116
- const childContainerService = new ContainerService(registry2.makeCollection(), containerService);
117
- // eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
118
- expect(containerService['_childs'].has(childContainerService)).toBeTruthy();
119
-
120
- childContainerService.dispose();
121
-
122
- expect(fn1).not.toBeCalled();
123
- expect(fn2).toBeCalled();
124
- expect(fn3).not.toBeCalled();
125
- // eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
126
- expect(containerService['_childs'].has(childContainerService)).toBeFalsy();
127
- });
128
-
129
- // parent是instantiationService,正常dispose
130
- it('dispose4', () => {
131
- const fn1 = vi.fn();
132
- const fn2 = vi.fn();
133
- const fn3 = vi.fn();
134
-
135
- const registry1 = new ServiceRegistry();
136
- registry1.registerInstance(IMockService1, new MockService1(fn1));
137
- const instantiationService = new InstantiationService(registry1.makeCollection());
138
-
139
- const registry2 = new ServiceRegistry();
140
- registry2.registerInstance(IMockService2, new MockService2(fn2));
141
- registry2.registerInstance(IMockService3, new MockService3(fn3));
142
- const containerService = new ContainerService(registry2.makeCollection(), instantiationService);
143
-
144
- containerService.dispose();
145
-
146
- expect(fn1).not.toBeCalled();
147
- expect(fn2).toBeCalled();
148
- expect(fn3).not.toBeCalled();
149
- });
150
-
151
- // reference dispose
152
- it('reference dispose', () => {
153
- const fn1 = vi.fn();
154
- const fn2 = vi.fn();
155
- const fn4 = vi.fn();
156
-
157
- const mock4Instance = new MockService4(fn4);
158
- const registry1 = new ServiceRegistry();
159
- registry1.registerInstance(IMockService1, new MockService1(fn1));
160
- registry1.registerInstance(IMockService4, mock4Instance);
161
- const containerService = new ContainerService(registry1.makeCollection());
162
-
163
- const registry2 = new ServiceRegistry();
164
- registry2.registerInstance(IMockService2, new MockService2(fn2));
165
- registry2.registerInstance(IMockService4, mock4Instance, {
166
- ownership: ServiceOwnership.Reference,
167
- });
168
- const childContainerService = new ContainerService(registry2.makeCollection(), containerService);
169
- childContainerService.dispose();
170
-
171
- expect(fn1).not.toBeCalled();
172
- expect(fn2).toBeCalled();
173
- expect(fn4).not.toBeCalled();
174
-
175
- containerService.dispose();
176
- expect(fn1).toBeCalled();
177
- expect(fn4).toBeCalled();
178
- });
179
- });
@@ -1,41 +0,0 @@
1
- import { createContext, createElement, useContext, useMemo, type ReactElement } from 'react';
2
- import { lvAssertNotNil } from '@/assert';
3
- import type { IInstantiationService } from './instantiation-service.interface';
4
- import type { ServiceIdentifier, ServicesAccessor } from './base';
5
-
6
- interface IProps {
7
- instantiationService: IInstantiationService;
8
- children?: React.ReactNode;
9
- }
10
-
11
- const Context = createContext<IInstantiationService | null>(null);
12
-
13
- /**
14
- * 组件支持依赖注入上下文
15
- */
16
- export const InstantiationContext = (props: IProps) => {
17
- return createElement(
18
- Context.Provider,
19
- { value: props.instantiationService },
20
- props.children,
21
- ) as ReactElement<any, any>;
22
- };
23
-
24
- /**
25
- * 获取服务的hook
26
- * @param identifier 服务标识符
27
- * @returns 对应服务
28
- */
29
- export function useService<T>(identifier: ServiceIdentifier<T>): T {
30
- const instantiationService = useContext(Context);
31
- lvAssertNotNil(instantiationService, 'react components need service context.');
32
- const service = useMemo(
33
- () =>
34
- instantiationService.invokeFunction((servicesAccessor: ServicesAccessor) =>
35
- servicesAccessor.get(identifier),
36
- ),
37
- [instantiationService, identifier],
38
- );
39
-
40
- return service;
41
- }
@@ -1,31 +0,0 @@
1
- //
2
- // DI中服务描述符,本质上是构造函数的包装
3
- //
4
- // 必须提供服务构造函数
5
- // 支持静态参数
6
- // 支持配置是否延迟初始化
7
- //
8
- export class SyncDescriptor<T> {
9
- readonly ctor: new (...args: any[]) => T;
10
- readonly staticArguments: any[];
11
- readonly supportsDelayedInstantiation: boolean;
12
-
13
- constructor(
14
- ctor: new (...args: any[]) => T,
15
- staticArguments: any[] = [],
16
- supportsDelayedInstantiation = false,
17
- ) {
18
- this.ctor = ctor;
19
- this.staticArguments = staticArguments;
20
- this.supportsDelayedInstantiation = supportsDelayedInstantiation;
21
- }
22
- }
23
-
24
- //
25
- // 特化描述符
26
- // 1. 没有静态参数,没有动态参数,只存在注入参数
27
- // 2. 默认延迟初始化
28
- //
29
- export interface SyncDescriptor0<T> {
30
- readonly ctor: new () => T;
31
- }
@@ -1,73 +0,0 @@
1
- import { sleep } from '@/async';
2
- import { IdleValue } from './idle-value';
3
-
4
- class Foo {
5
- value = 'public value.';
6
-
7
- private _data = 100;
8
- private readonly _mockFn: () => void;
9
-
10
- constructor(mockFn: () => void) {
11
- this._mockFn = mockFn;
12
- }
13
-
14
- get data() {
15
- return this._data;
16
- }
17
-
18
- set data(value: number) {
19
- this._data = value;
20
- }
21
-
22
- test() {
23
- this._mockFn();
24
- }
25
- }
26
-
27
- describe('idle value', () => {
28
- it('initializes during idle time', async () => {
29
- const fn = vi.fn();
30
- const wrapper = new IdleValue<Foo>(() => new Foo(fn));
31
- // Not initialized immediately
32
- expect(wrapper.isInitialized).toBe(false);
33
-
34
- expect(fn).not.toBeCalled();
35
- expect(wrapper.isInitialized).toBe(false);
36
-
37
- await sleep(500);
38
-
39
- // Must have been initialized asynchronously
40
- expect(wrapper.isInitialized).toBe(true);
41
-
42
- // Properties work normally
43
- expect(wrapper.value.value).toBe('public value.');
44
- // Setters/getters work normally
45
- expect(wrapper.value.data).toBe(100);
46
- wrapper.value.data = 200;
47
- expect(wrapper.value.data).toBe(200);
48
- // Method calls work normally
49
- wrapper.value.test();
50
- expect(fn).toBeCalled();
51
- });
52
-
53
- it('initializes immediately due to usage', () => {
54
- const fn = vi.fn();
55
- const wrapper = new IdleValue<Foo>(() => new Foo(fn));
56
- // Not initialized immediately
57
- expect(wrapper.isInitialized).toBe(false);
58
-
59
- // Properties work normally
60
- expect(wrapper.value.value).toBe('public value.');
61
- // Setters/getters work normally
62
- expect(wrapper.value.data).toBe(100);
63
- wrapper.value.data = 200;
64
- expect(wrapper.value.data).toBe(200);
65
- // Method calls work normally
66
- wrapper.value.test();
67
- expect(fn).toBeCalled();
68
-
69
- // Initialized because value was accessed
70
- expect(wrapper.isInitialized).toBe(true);
71
- // await sleep(500);
72
- });
73
- });
@@ -1,63 +0,0 @@
1
- import { lvSchedulerCallback, PriorityLevel } from '@/scheduler';
2
- import type { IDisposable } from '@/dispose';
3
- import { Emitter, type Event } from '@/event';
4
-
5
- //
6
- // 容器类型,存放一个可以延迟初始化的值
7
- //
8
- export class IdleValue<T> implements IDisposable {
9
- private readonly _executor: () => void;
10
- private readonly _handle: IDisposable;
11
- private _executorEmitter?: Emitter<[]>;
12
-
13
- private _didRun = false;
14
- private _value?: T;
15
- private _error: unknown;
16
-
17
- constructor(executor: () => T) {
18
- this._executor = () => {
19
- try {
20
- this._value = executor();
21
- } catch (err) {
22
- this._error = err;
23
- throw err;
24
- } finally {
25
- this._didRun = true;
26
- if (this._value && this._executorEmitter) {
27
- this._executorEmitter.fire();
28
- }
29
- }
30
- };
31
- this._handle = lvSchedulerCallback(() => this._executor(), {
32
- priorityLevel: PriorityLevel.IdlePriority,
33
- });
34
- }
35
-
36
- get value(): T {
37
- // 如果没有run过,dispose之后再立刻执行
38
- if (!this._didRun) {
39
- this._handle.dispose();
40
- this._executor();
41
- }
42
- if (this._error) {
43
- // eslint-disable-next-line @typescript-eslint/no-throw-literal
44
- throw this._error;
45
- }
46
- return this._value!;
47
- }
48
-
49
- get isInitialized(): boolean {
50
- return this._didRun;
51
- }
52
-
53
- get onExecutor(): Event<[]> {
54
- if (!this._executorEmitter) {
55
- this._executorEmitter = new Emitter<[]>();
56
- }
57
- return this._executorEmitter.event;
58
- }
59
-
60
- dispose(): void {
61
- this._handle.dispose();
62
- }
63
- }
@@ -1,32 +0,0 @@
1
- export type { BrandedService } from './base';
2
- export type { ServiceIdentifier } from './base';
3
- export type { ServicesAccessor } from './base';
4
- export { createDecorator } from './base';
5
- export { refineServiceDecorator } from './base';
6
-
7
- export { SyncDescriptor } from './descriptor';
8
-
9
- export type { GetLeadingNonServiceArgs } from './instantiation-service.interface';
10
- export { IInstantiationService } from './instantiation-service.interface';
11
- export { InstantiationService } from './instantiation-service';
12
-
13
- // alias进行历史命名兼容
14
- export { InstantiationService as ContainerService } from './instantiation-service';
15
- export { IInstantiationService as IContainerService } from './instantiation-service.interface';
16
-
17
- export { getService } from './instantiation-service';
18
- export { InstantiationErrorType } from './instantiation-service';
19
-
20
- export type { IServiceCollection } from './service-collection';
21
- export { ServiceCollection } from './service-collection';
22
-
23
- export { ServiceOwnership } from './service-ownership-collection';
24
-
25
- export { ServiceRegistry } from './service-registry';
26
-
27
- export type { LazyService } from './lazy/type';
28
-
29
- export type { ILazyServiceLoader } from './lazy/lazy-service';
30
- export { LazyServiceLoader } from './lazy/lazy-service';
31
-
32
- export { makeLazyServiceIdleLoad } from './lazy/idle-load';
package/src/di/index.ts DELETED
@@ -1,2 +0,0 @@
1
- export * from './index.common';
2
- export { InstantiationContext, useService } from './context.web';
@@ -1,46 +0,0 @@
1
- import type { BrandedService, ServicesAccessor } from './base';
2
- import { createDecorator } from './base';
3
- import type { SyncDescriptor0 } from './descriptor';
4
- import type { ServiceCollection } from './service-collection';
5
-
6
- export type GetLeadingNonServiceArgs<TArgs extends any[]> = TArgs extends []
7
- ? []
8
- : TArgs extends [...infer TFirst, BrandedService]
9
- ? GetLeadingNonServiceArgs<TFirst>
10
- : TArgs;
11
-
12
- export interface IInstantiationService {
13
- readonly _serviceBrand: undefined;
14
-
15
- /**
16
- * Synchronously creates an instance that is denoted by the descriptor
17
- */
18
- createInstance: {
19
- <T>(descriptor: SyncDescriptor0<T>): T;
20
- <Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(
21
- ctor: Ctor,
22
- ...args: GetLeadingNonServiceArgs<ConstructorParameters<Ctor>>
23
- ): R;
24
- };
25
-
26
- /**
27
- * Calls a function with a service accessor.
28
- */
29
- invokeFunction: <R, TS extends any[] = []>(
30
- fn: (accessor: ServicesAccessor, ...args: TS) => R,
31
- ...args: TS
32
- ) => R;
33
-
34
- /**
35
- * Creates a child of this service which inherits all current services
36
- * and adds/overwrites the given services.
37
- */
38
- createChild: (services: ServiceCollection) => IInstantiationService;
39
-
40
- /**
41
- * 生命周期归属该DI上下文的服务进行销毁
42
- */
43
- dispose: () => void;
44
- }
45
-
46
- export const IInstantiationService = createDecorator<IInstantiationService>('instantiation');