@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.
- package/dist/async/index.cjs.map +1 -1
- package/dist/async/index.d.cts +2 -2
- package/dist/async/index.d.ts +2 -2
- package/dist/async/index.js.map +1 -1
- package/dist/error/index.cjs.map +1 -1
- package/dist/error/index.d.cts +19 -19
- package/dist/error/index.d.ts +19 -19
- package/dist/error/index.js.map +1 -1
- package/dist/{error-base-B4zaiJ5m.d.cts → error-base-DOFtBFla.d.cts} +8 -8
- package/dist/{error-base-B4zaiJ5m.d.ts → error-base-DOFtBFla.d.ts} +8 -8
- package/dist/promise/index.cjs.map +1 -1
- package/dist/promise/index.d.cts +4 -4
- package/dist/promise/index.d.ts +4 -4
- package/dist/promise/index.js.map +1 -1
- package/dist/worker/index.cjs.map +1 -1
- package/dist/worker/index.d.cts +2 -2
- package/dist/worker/index.d.ts +2 -2
- package/dist/worker/index.js.map +1 -1
- package/package.json +1 -2
- package/src/_internal/logger.ts +0 -59
- package/src/array/array.test.ts +0 -35
- package/src/array/array.ts +0 -25
- package/src/array/index.ts +0 -1
- package/src/assert/assert.test.ts +0 -86
- package/src/assert/assert.ts +0 -42
- package/src/assert/index.ts +0 -2
- package/src/async/barrier.test.ts +0 -90
- package/src/async/barrier.ts +0 -58
- package/src/async/cancellation.test.ts +0 -85
- package/src/async/cancellation.ts +0 -193
- package/src/async/index.ts +0 -18
- package/src/async/queue/queue.test.ts +0 -70
- package/src/async/queue/queue.ts +0 -56
- package/src/async/queue/task.test.ts +0 -155
- package/src/async/queue/task.ts +0 -67
- package/src/async/utils.test.ts +0 -28
- package/src/async/utils.ts +0 -8
- package/src/async/wait.ts +0 -9
- package/src/byte/format.test.ts +0 -64
- package/src/byte/format.ts +0 -44
- package/src/byte/index.ts +0 -2
- package/src/byte/node_modules/.vitest/results.json +0 -1
- package/src/byte/var.ts +0 -11
- package/src/cache/index.ts +0 -2
- package/src/cache/lru-with-timeout.test.ts +0 -88
- package/src/cache/lru-with-timeout.ts +0 -85
- package/src/cache/lru.test.ts +0 -56
- package/src/cache/lru.ts +0 -59
- package/src/context/context.test.ts +0 -17
- package/src/context/context.ts +0 -60
- package/src/context/index.ts +0 -8
- package/src/di/base.ts +0 -73
- package/src/di/container-service.test.ts +0 -179
- package/src/di/context.web.tsx +0 -41
- package/src/di/descriptor.ts +0 -31
- package/src/di/idle-value.test.ts +0 -73
- package/src/di/idle-value.ts +0 -63
- package/src/di/index.common.ts +0 -32
- package/src/di/index.ts +0 -2
- package/src/di/instantiation-service.interface.ts +0 -46
- package/src/di/instantiation-service.test.ts +0 -337
- package/src/di/instantiation-service.ts +0 -468
- package/src/di/lazy/foo.mock.ts +0 -28
- package/src/di/lazy/idle-load.ts +0 -39
- package/src/di/lazy/index.ts +0 -4
- package/src/di/lazy/lazy-service.test.ts +0 -65
- package/src/di/lazy/lazy-service.ts +0 -71
- package/src/di/lazy/type.ts +0 -5
- package/src/di/node_modules/.vitest/results.json +0 -1
- package/src/di/proxy-builder.test.ts +0 -45
- package/src/di/proxy-builder.ts +0 -38
- package/src/di/service-collection.test.ts +0 -27
- package/src/di/service-collection.ts +0 -46
- package/src/di/service-ownership-collection.test.ts +0 -39
- package/src/di/service-ownership-collection.ts +0 -38
- package/src/di/service-registry.test.ts +0 -66
- package/src/di/service-registry.ts +0 -99
- package/src/di/trace.ts +0 -85
- package/src/dispose/disposable-store.test.ts +0 -57
- package/src/dispose/disposable-store.ts +0 -80
- package/src/dispose/disposable-t.test.ts +0 -123
- package/src/dispose/disposable-t.ts +0 -238
- package/src/dispose/disposable-utils.test.ts +0 -15
- package/src/dispose/disposable-utils.ts +0 -28
- package/src/dispose/dispose-base.ts +0 -9
- package/src/dispose/index.ts +0 -34
- package/src/dispose/logger.test.ts +0 -65
- package/src/dispose/logger.ts +0 -39
- package/src/dispose/timer.test.ts +0 -30
- package/src/dispose/timer.ts +0 -16
- package/src/dispose/tracker.test.ts +0 -51
- package/src/dispose/tracker.ts +0 -105
- package/src/error/error-base.ts +0 -45
- package/src/error/error-code.ts +0 -39
- package/src/error/error-const.test.ts +0 -30
- package/src/error/error-const.ts +0 -16
- package/src/error/error-or.test.ts +0 -44
- package/src/error/error-or.ts +0 -2
- package/src/error/error-t.test.ts +0 -116
- package/src/error/error-t.ts +0 -100
- package/src/error/index.ts +0 -24
- package/src/error/node_modules/.vitest/results.json +0 -1
- package/src/event/disposable-linked-list.ts +0 -29
- package/src/event/emitter.test.ts +0 -191
- package/src/event/emitter.ts +0 -162
- package/src/event/error-handler.ts +0 -22
- package/src/event/index.ts +0 -34
- package/src/event/once.ts +0 -29
- package/src/event/phase-emitter.test.ts +0 -212
- package/src/event/phase-emitter.ts +0 -209
- package/src/event/shortcut-event-utils.ts +0 -33
- package/src/event/utils.ts +0 -6
- package/src/event/when.ts +0 -40
- package/src/function/debounce.test.ts +0 -274
- package/src/function/debounce.ts +0 -168
- package/src/function/index.ts +0 -2
- package/src/function/node_modules/.vitest/results.json +0 -1
- package/src/function/throttle.test.ts +0 -179
- package/src/function/throttle.ts +0 -26
- package/src/hash/hash-t.test.ts +0 -100
- package/src/hash/hash-t.ts +0 -51
- package/src/hash/index.ts +0 -3
- package/src/json/index.ts +0 -1
- package/src/json/node_modules/.vitest/results.json +0 -1
- package/src/json/parse.ts +0 -19
- package/src/launch/abstract-job.ts +0 -45
- package/src/launch/cost-recorder.ts +0 -22
- package/src/launch/index.ts +0 -2
- package/src/launch/job-scheduler.test.ts +0 -122
- package/src/launch/job-scheduler.ts +0 -118
- package/src/launch/node_modules/.vitest/deps/_metadata.json +0 -8
- package/src/launch/node_modules/.vitest/deps/package.json +0 -3
- package/src/launch/node_modules/.vitest/results.json +0 -1
- package/src/lock/README.md +0 -11
- package/src/lock/capability.test.ts +0 -110
- package/src/lock/capability.ts +0 -89
- package/src/lock/index.ts +0 -15
- package/src/lock/node_modules/.vitest/results.json +0 -1
- package/src/lock/semaphore.ts +0 -21
- package/src/lock/shared-mutex.test.ts +0 -537
- package/src/lock/shared-mutex.ts +0 -242
- package/src/lock/utils.test.ts +0 -165
- package/src/lock/utils.ts +0 -135
- package/src/lodash-es/index.ts +0 -1
- package/src/math/degree.ts +0 -16
- package/src/math/index.ts +0 -7
- package/src/math/math.test.ts +0 -40
- package/src/math/math.ts +0 -64
- package/src/math/node_modules/.vitest/results.json +0 -1
- package/src/math/vector.test.ts +0 -73
- package/src/math/vector.ts +0 -114
- package/src/network/client.interface.ts +0 -104
- package/src/network/client.web.ts +0 -24
- package/src/network/index.common.ts +0 -10
- package/src/network/index.ts +0 -2
- package/src/network/plugins/retry.ts +0 -98
- package/src/objects/deep-clone.test.ts +0 -40
- package/src/objects/deep-clone.ts +0 -13
- package/src/objects/deep-equal.test.ts +0 -86
- package/src/objects/deep-equal.ts +0 -60
- package/src/objects/index.ts +0 -4
- package/src/platform/index.ts +0 -64
- package/src/promise/index.ts +0 -16
- package/src/promise/promise.test.ts +0 -254
- package/src/promise/promise.ts +0 -212
- package/src/scheduler/callback-token.ts +0 -31
- package/src/scheduler/core/actuator-args.test.ts +0 -47
- package/src/scheduler/core/actuator.test.ts +0 -82
- package/src/scheduler/core/actuator.ts +0 -58
- package/src/scheduler/core/chunk-scheduler.test.ts +0 -54
- package/src/scheduler/core/chunk-scheduler.ts +0 -28
- package/src/scheduler/core/node_modules/.vitest/results.json +0 -1
- package/src/scheduler/core/scheduler.test.ts +0 -328
- package/src/scheduler/core/scheduler.ts +0 -172
- package/src/scheduler/core/task-queue.test.ts +0 -78
- package/src/scheduler/core/task-queue.ts +0 -44
- package/src/scheduler/core/task.test.ts +0 -34
- package/src/scheduler/core/task.ts +0 -52
- package/src/scheduler/core/utils.ts +0 -48
- package/src/scheduler/executor/abstract-executor.test.ts +0 -44
- package/src/scheduler/executor/abstract-executor.ts +0 -38
- package/src/scheduler/executor/executor.interface.ts +0 -39
- package/src/scheduler/executor/idle-callback-executor.test.ts +0 -70
- package/src/scheduler/executor/idle-callback-executor.ts +0 -98
- package/src/scheduler/executor/make-executor.ts +0 -18
- package/src/scheduler/executor/post-message-executor.test.ts +0 -66
- package/src/scheduler/executor/post-message-executor.ts +0 -52
- package/src/scheduler/index.ts +0 -15
- package/src/scheduler/lv-scheduler-callback.ts +0 -19
- package/src/scheduler/lv-scheduler-config.ts +0 -17
- package/src/scheduler/type.ts +0 -48
- package/src/sprintf/index.ts +0 -2
- package/src/sprintf/sprintf.test.ts +0 -95
- package/src/sprintf/sprintf.ts +0 -97
- package/src/structure/graph.test.ts +0 -181
- package/src/structure/graph.ts +0 -105
- package/src/structure/index.ts +0 -8
- package/src/structure/linked-list.test.ts +0 -74
- package/src/structure/linked-list.ts +0 -145
- package/src/structure/min-heap.test.ts +0 -71
- package/src/structure/min-heap.ts +0 -91
- package/src/type/REAME.md +0 -2
- package/src/type/distributive-omit.interface.ts +0 -4
- package/src/type/index.ts +0 -3
- package/src/type/object-key-paths.interface.ts +0 -40
- package/src/undo-redo-stack/README.md +0 -61
- package/src/undo-redo-stack/action-stack.test.ts +0 -330
- package/src/undo-redo-stack/action-stack.ts +0 -150
- package/src/undo-redo-stack/element.ts +0 -4
- package/src/undo-redo-stack/index.ts +0 -7
- package/src/undo-redo-stack/state-stack.test.ts +0 -118
- package/src/undo-redo-stack/state-stack.ts +0 -133
- package/src/uuid/index.ts +0 -7
- package/src/uuid/uuid.ts +0 -86
- package/src/worker/cors-worker.ts +0 -38
- package/src/worker/index.ts +0 -4
- package/src/worker/node_modules/.vitest/results.json +0 -1
- package/src/worker/promise-worker-main-thread.test.ts +0 -91
- package/src/worker/promise-worker-main-thread.ts +0 -76
- package/src/worker/promise-worker-worker-thread.ts +0 -64
- 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
|
-
});
|
package/src/context/context.ts
DELETED
|
@@ -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
|
-
}
|
package/src/context/index.ts
DELETED
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
|
-
});
|
package/src/di/context.web.tsx
DELETED
|
@@ -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
|
-
}
|
package/src/di/descriptor.ts
DELETED
|
@@ -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
|
-
});
|
package/src/di/idle-value.ts
DELETED
|
@@ -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
|
-
}
|
package/src/di/index.common.ts
DELETED
|
@@ -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,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');
|