@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,45 +0,0 @@
|
|
|
1
|
-
import { makeProxy } from './proxy-builder';
|
|
2
|
-
import { IdleValue } from './idle-value';
|
|
3
|
-
|
|
4
|
-
vi.useFakeTimers();
|
|
5
|
-
vi.spyOn(global, 'setTimeout');
|
|
6
|
-
vi.spyOn(global, 'clearTimeout');
|
|
7
|
-
|
|
8
|
-
class Foo {
|
|
9
|
-
private _data = 100;
|
|
10
|
-
private readonly _mockFn: () => void;
|
|
11
|
-
value = 'public value.';
|
|
12
|
-
|
|
13
|
-
constructor(mockFn: () => void) {
|
|
14
|
-
this._mockFn = mockFn;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
get data() {
|
|
18
|
-
return this._data;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
set data(value: number) {
|
|
22
|
-
this._data = value;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
test() {
|
|
26
|
-
this._mockFn();
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
describe('proxy builder', () => {
|
|
31
|
-
it('proxy success', () => {
|
|
32
|
-
const fn = vi.fn();
|
|
33
|
-
const wrapper = new IdleValue<Foo>(() => new Foo(fn));
|
|
34
|
-
const proxy = makeProxy<Foo>(wrapper, Foo);
|
|
35
|
-
// 属性正常
|
|
36
|
-
expect(proxy.value).toBe('public value.');
|
|
37
|
-
// setter/getter 正常
|
|
38
|
-
expect(proxy.data).toBe(100);
|
|
39
|
-
proxy.data = 200;
|
|
40
|
-
expect(proxy.data).toBe(200);
|
|
41
|
-
// 调用方法正常
|
|
42
|
-
proxy.test();
|
|
43
|
-
expect(fn).toBeCalled();
|
|
44
|
-
});
|
|
45
|
-
});
|
package/src/di/proxy-builder.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { listenOnce } from '@/event';
|
|
2
|
-
import type { IdleValue } from './idle-value';
|
|
3
|
-
|
|
4
|
-
//
|
|
5
|
-
// 快速生成一个di proxy对象,用于di中的延迟初始化能力
|
|
6
|
-
// 依赖idleValue容器
|
|
7
|
-
//
|
|
8
|
-
export function makeProxy<T>(valueWrapper: IdleValue<T>, ctor: any) {
|
|
9
|
-
const wrapper = Object.create(null);
|
|
10
|
-
const result = new Proxy(wrapper, {
|
|
11
|
-
get(target: any, key: PropertyKey): any {
|
|
12
|
-
if (key in target) {
|
|
13
|
-
return target[key];
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const obj = valueWrapper.value as any;
|
|
17
|
-
let prop = obj[key];
|
|
18
|
-
if (typeof prop !== 'function') {
|
|
19
|
-
return prop;
|
|
20
|
-
}
|
|
21
|
-
prop = prop.bind(obj);
|
|
22
|
-
target[key] = prop;
|
|
23
|
-
return prop;
|
|
24
|
-
},
|
|
25
|
-
set(_target: T, p: PropertyKey, value: any): boolean {
|
|
26
|
-
const obj = valueWrapper.value as any;
|
|
27
|
-
obj[p] = value;
|
|
28
|
-
return true;
|
|
29
|
-
},
|
|
30
|
-
}) as T;
|
|
31
|
-
// @ts-ignore
|
|
32
|
-
wrapper.__originClass__ = ctor;
|
|
33
|
-
listenOnce(valueWrapper.onExecutor)(() => {
|
|
34
|
-
// @ts-ignore
|
|
35
|
-
wrapper.__origin__ = valueWrapper.value;
|
|
36
|
-
});
|
|
37
|
-
return result as T;
|
|
38
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { createDecorator } from './base';
|
|
2
|
-
import { SyncDescriptor } from './descriptor';
|
|
3
|
-
import { ServiceCollection } from './service-collection';
|
|
4
|
-
|
|
5
|
-
class Foo {}
|
|
6
|
-
class Bar {}
|
|
7
|
-
|
|
8
|
-
const IFoo = createDecorator<Foo>('foo');
|
|
9
|
-
const IBar = createDecorator<Bar>('bar');
|
|
10
|
-
|
|
11
|
-
describe('service collection', () => {
|
|
12
|
-
it('success', () => {
|
|
13
|
-
const collection = new ServiceCollection();
|
|
14
|
-
expect(collection.has(IFoo)).toBe(false);
|
|
15
|
-
// 设置SyncDescriptor
|
|
16
|
-
const descriptor = new SyncDescriptor<Foo>(Foo);
|
|
17
|
-
collection.set(IFoo, descriptor);
|
|
18
|
-
expect(collection.has(IFoo)).toBe(true);
|
|
19
|
-
expect(collection.get(IFoo)).toBe(descriptor);
|
|
20
|
-
|
|
21
|
-
expect(collection.has(IBar)).toBe(false);
|
|
22
|
-
// 设置instance
|
|
23
|
-
const bar = new Bar();
|
|
24
|
-
collection.set(IBar, bar);
|
|
25
|
-
expect(collection.has(IBar)).toBe(true);
|
|
26
|
-
});
|
|
27
|
-
});
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import type { ServiceIdentifier } from './base';
|
|
2
|
-
import { SyncDescriptor } from './descriptor';
|
|
3
|
-
import { ServiceOwnershipCollection } from './service-ownership-collection';
|
|
4
|
-
//
|
|
5
|
-
// 服务的集合
|
|
6
|
-
// key 服务ID
|
|
7
|
-
// value 服务的描述符或者是实例
|
|
8
|
-
//
|
|
9
|
-
export type IServiceCollection = {
|
|
10
|
-
entries?: [ServiceIdentifier<any>, any][];
|
|
11
|
-
ownership?: ServiceOwnershipCollection;
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
export class ServiceCollection {
|
|
15
|
-
private readonly _entries = new Map<ServiceIdentifier<any>, any>();
|
|
16
|
-
private readonly _ownership: ServiceOwnershipCollection | undefined;
|
|
17
|
-
|
|
18
|
-
constructor(options?: IServiceCollection) {
|
|
19
|
-
for (const [id, service] of options?.entries || []) {
|
|
20
|
-
this.set(id, service);
|
|
21
|
-
}
|
|
22
|
-
if (options?.ownership) {
|
|
23
|
-
this._ownership = options.ownership;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
get entries() {
|
|
28
|
-
return this._entries;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
get ownerships() {
|
|
32
|
-
return this._ownership?.entries;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
set<T>(id: ServiceIdentifier<T>, instanceOrDescriptor: T | SyncDescriptor<T>) {
|
|
36
|
-
this._entries.set(id, instanceOrDescriptor);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
has(id: ServiceIdentifier<any>): boolean {
|
|
40
|
-
return this._entries.has(id);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
get<T>(id: ServiceIdentifier<T>): T | SyncDescriptor<T> {
|
|
44
|
-
return this._entries.get(id);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { createDecorator } from './base';
|
|
2
|
-
import { ServiceOwnershipCollection, ServiceOwnership } from './service-ownership-collection';
|
|
3
|
-
|
|
4
|
-
class Foo {}
|
|
5
|
-
class Bar {}
|
|
6
|
-
|
|
7
|
-
const IFoo = createDecorator<Foo>('foo');
|
|
8
|
-
const IBar = createDecorator<Bar>('bar');
|
|
9
|
-
|
|
10
|
-
describe('service collection', () => {
|
|
11
|
-
it('success', () => {
|
|
12
|
-
const collection = new ServiceOwnershipCollection();
|
|
13
|
-
expect(collection.has(IFoo)).toBe(false);
|
|
14
|
-
|
|
15
|
-
collection.set(IFoo, ServiceOwnership.Owned);
|
|
16
|
-
expect(collection.has(IFoo)).toBe(true);
|
|
17
|
-
expect(collection.get(IFoo)).toBe(ServiceOwnership.Owned);
|
|
18
|
-
|
|
19
|
-
collection.set(IFoo, ServiceOwnership.Reference);
|
|
20
|
-
expect(collection.get(IFoo)).toBe(ServiceOwnership.Reference);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('base', () => {
|
|
24
|
-
const collection = new ServiceOwnershipCollection(
|
|
25
|
-
[IFoo, ServiceOwnership.Owned],
|
|
26
|
-
[IBar, ServiceOwnership.Reference],
|
|
27
|
-
);
|
|
28
|
-
|
|
29
|
-
expect(collection.has(IFoo)).toBe(true);
|
|
30
|
-
expect(collection.has(IBar)).toBe(true);
|
|
31
|
-
expect(collection.get(IFoo)).toBe(ServiceOwnership.Owned);
|
|
32
|
-
expect(collection.get(IBar)).toBe(ServiceOwnership.Reference);
|
|
33
|
-
|
|
34
|
-
const ownership = collection.entries;
|
|
35
|
-
expect(ownership.size).toBe(2);
|
|
36
|
-
expect(ownership.get(IFoo)).toBe(ServiceOwnership.Owned);
|
|
37
|
-
expect(ownership.get(IBar)).toBe(ServiceOwnership.Reference);
|
|
38
|
-
});
|
|
39
|
-
});
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import type { ServiceIdentifier } from './base';
|
|
2
|
-
|
|
3
|
-
export enum ServiceOwnership {
|
|
4
|
-
Owned = 1, // 单独持有
|
|
5
|
-
Reference = 2, // 引用子父级类型
|
|
6
|
-
// Shared = 3, // 与兄弟节点共同持有
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
//
|
|
10
|
-
// 服务的集合
|
|
11
|
-
// key 服务ID
|
|
12
|
-
// value 服务的描述符或者是实例
|
|
13
|
-
//
|
|
14
|
-
export class ServiceOwnershipCollection {
|
|
15
|
-
private readonly _entries = new Map<ServiceIdentifier<any>, ServiceOwnership>();
|
|
16
|
-
|
|
17
|
-
constructor(...entries: [ServiceIdentifier<any>, ServiceOwnership][]) {
|
|
18
|
-
for (const [id, service] of entries) {
|
|
19
|
-
this.set(id, service);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
get entries() {
|
|
24
|
-
return this._entries;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
set(id: ServiceIdentifier<any>, ownership: ServiceOwnership) {
|
|
28
|
-
this._entries.set(id, ownership);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
has(id: ServiceIdentifier<any>): boolean {
|
|
32
|
-
return this._entries.has(id);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
get(id: ServiceIdentifier<any>): ServiceOwnership | undefined {
|
|
36
|
-
return this._entries.get(id);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { createDecorator } from './base';
|
|
2
|
-
import { SyncDescriptor } from './descriptor';
|
|
3
|
-
import { ServiceOwnership } from './service-ownership-collection';
|
|
4
|
-
import { InstantiationType, ServiceRegistry } from './service-registry';
|
|
5
|
-
|
|
6
|
-
class Foo {
|
|
7
|
-
_serviceBrand: undefined;
|
|
8
|
-
}
|
|
9
|
-
class Bar {
|
|
10
|
-
_serviceBrand: undefined;
|
|
11
|
-
option1: number;
|
|
12
|
-
option2: string;
|
|
13
|
-
|
|
14
|
-
constructor(option1: number, option2: string) {
|
|
15
|
-
this.option1 = option1;
|
|
16
|
-
this.option2 = option2;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
class Test {
|
|
21
|
-
_serviceBrand: undefined;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
class ReferenceTest {
|
|
25
|
-
_serviceBrand: undefined;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const IFoo = createDecorator<Foo>('foo');
|
|
29
|
-
const IBar = createDecorator<Bar>('bar');
|
|
30
|
-
const ITest = createDecorator<Test>('test');
|
|
31
|
-
const IReferenceTest = createDecorator<ReferenceTest>('reference-test');
|
|
32
|
-
|
|
33
|
-
describe('registry', () => {
|
|
34
|
-
it('register success', () => {
|
|
35
|
-
const serviceRegistry = new ServiceRegistry();
|
|
36
|
-
serviceRegistry.register(IFoo, Foo, InstantiationType.Eager);
|
|
37
|
-
serviceRegistry.register(IBar, new SyncDescriptor(Bar, [100, 'Hello'], true));
|
|
38
|
-
serviceRegistry.registerInstance(ITest, new Test());
|
|
39
|
-
|
|
40
|
-
expect(serviceRegistry.registry.length).toBe(3);
|
|
41
|
-
|
|
42
|
-
expect(serviceRegistry.registry[0][0]).toBe(IFoo);
|
|
43
|
-
expect(serviceRegistry.registry[0][1] instanceof SyncDescriptor).toBeTruthy();
|
|
44
|
-
expect((serviceRegistry.registry[0][1] as SyncDescriptor<Foo>).ctor).toBe(Foo);
|
|
45
|
-
expect((serviceRegistry.registry[0][1] as SyncDescriptor<Foo>).staticArguments.length).toBe(0);
|
|
46
|
-
expect((serviceRegistry.registry[0][1] as SyncDescriptor<Foo>).supportsDelayedInstantiation).toBe(false);
|
|
47
|
-
|
|
48
|
-
expect(serviceRegistry.registry[1][0]).toBe(IBar);
|
|
49
|
-
expect(serviceRegistry.registry[1][1] instanceof SyncDescriptor).toBeTruthy();
|
|
50
|
-
expect((serviceRegistry.registry[1][1] as SyncDescriptor<Bar>).ctor).toBe(Bar);
|
|
51
|
-
expect((serviceRegistry.registry[1][1] as SyncDescriptor<Bar>).staticArguments.length).toBe(2);
|
|
52
|
-
expect((serviceRegistry.registry[1][1] as SyncDescriptor<Bar>).staticArguments[0]).toBe(100);
|
|
53
|
-
expect((serviceRegistry.registry[1][1] as SyncDescriptor<Bar>).staticArguments[1]).toBe('Hello');
|
|
54
|
-
expect((serviceRegistry.registry[1][1] as SyncDescriptor<Bar>).supportsDelayedInstantiation).toBe(true);
|
|
55
|
-
|
|
56
|
-
expect(serviceRegistry.registry[2][0]).toBe(ITest);
|
|
57
|
-
expect(serviceRegistry.registry[2][1] instanceof Test).toBeTruthy();
|
|
58
|
-
expect(serviceRegistry.makeCollection().ownerships!.get(ITest)).toBe(ServiceOwnership.Owned);
|
|
59
|
-
|
|
60
|
-
serviceRegistry.registerInstance(IReferenceTest, new ReferenceTest(), {
|
|
61
|
-
ownership: ServiceOwnership.Reference,
|
|
62
|
-
});
|
|
63
|
-
expect(serviceRegistry.registry[3][0]).toBe(IReferenceTest);
|
|
64
|
-
expect(serviceRegistry.makeCollection().ownerships!.get(IReferenceTest)).toBe(ServiceOwnership.Reference);
|
|
65
|
-
});
|
|
66
|
-
});
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { lvAssert } from '../assert';
|
|
2
|
-
import type { BrandedService, ServiceIdentifier } from './base';
|
|
3
|
-
import { SyncDescriptor } from './descriptor';
|
|
4
|
-
import { ServiceCollection } from './service-collection';
|
|
5
|
-
import { ServiceOwnershipCollection, ServiceOwnership } from './service-ownership-collection';
|
|
6
|
-
|
|
7
|
-
export enum InstantiationType {
|
|
8
|
-
Eager = 0,
|
|
9
|
-
Delayed = 1,
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
interface IServiceRegistryConfig {
|
|
13
|
-
checkDuplicate?: boolean;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export class ServiceRegistry {
|
|
17
|
-
protected readonly _registry: [ServiceIdentifier<any>, SyncDescriptor<any> | BrandedService][] = [];
|
|
18
|
-
protected readonly _serviceOwnership: ServiceOwnershipCollection = new ServiceOwnershipCollection();
|
|
19
|
-
// 重复检测的id记录
|
|
20
|
-
private readonly _ids: Set<string> = new Set<string>();
|
|
21
|
-
// 是否进行相同id服务注册的冲突检测
|
|
22
|
-
private readonly _checkDuplicate: boolean;
|
|
23
|
-
|
|
24
|
-
constructor(config: IServiceRegistryConfig = {}) {
|
|
25
|
-
this._checkDuplicate = config.checkDuplicate ?? false;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
get registry() {
|
|
29
|
-
return this._registry;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* 注册服务,通过传入构造函数或者描述符
|
|
34
|
-
*/
|
|
35
|
-
register<T, Services extends BrandedService[]>(
|
|
36
|
-
id: ServiceIdentifier<T>,
|
|
37
|
-
ctor: new (...services: Services) => T,
|
|
38
|
-
supportsDelayedInstantiation?: boolean | InstantiationType,
|
|
39
|
-
): void;
|
|
40
|
-
register<T, Services extends BrandedService[]>(
|
|
41
|
-
id: ServiceIdentifier<T>,
|
|
42
|
-
descriptor: SyncDescriptor<any>,
|
|
43
|
-
): void;
|
|
44
|
-
register<T, Services extends BrandedService[]>(
|
|
45
|
-
id: ServiceIdentifier<T>,
|
|
46
|
-
ctorOrDescriptor: { new (...services: Services): T } | SyncDescriptor<any>,
|
|
47
|
-
supportsDelayedInstantiation?: boolean | InstantiationType,
|
|
48
|
-
) {
|
|
49
|
-
// 无论是构造函数还是描述符,最终加入到registry中的都会转为描述符
|
|
50
|
-
if (!(ctorOrDescriptor instanceof SyncDescriptor)) {
|
|
51
|
-
ctorOrDescriptor = new SyncDescriptor<T>(
|
|
52
|
-
ctorOrDescriptor as new (...args: any[]) => T,
|
|
53
|
-
[],
|
|
54
|
-
Boolean(supportsDelayedInstantiation),
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// 如果开启了检测,判断是否有id重复
|
|
59
|
-
if (this._checkDuplicate) {
|
|
60
|
-
lvAssert(!this._ids.has(id.toString()), `service: ${id.toString()} duplicate register.`);
|
|
61
|
-
this._ids.add(id.toString());
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
this._registry.push([id, ctorOrDescriptor]);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* 直接注册一个服务的实例
|
|
69
|
-
*
|
|
70
|
-
* 注意:谨慎使用,优先使用register
|
|
71
|
-
* 一般用于特殊场景:需要先于DI之前就构造了某个service
|
|
72
|
-
*/
|
|
73
|
-
registerInstance<T extends BrandedService>(
|
|
74
|
-
id: ServiceIdentifier<T>,
|
|
75
|
-
instance: T,
|
|
76
|
-
options?: {
|
|
77
|
-
ownership: ServiceOwnership;
|
|
78
|
-
},
|
|
79
|
-
) {
|
|
80
|
-
// 如果开启了检测,判断是否有id重复
|
|
81
|
-
if (this._checkDuplicate) {
|
|
82
|
-
lvAssert(!this._ids.has(id.toString()), `service: ${id.toString()} duplicate register.`);
|
|
83
|
-
this._ids.add(id.toString());
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
this._registry.push([id, instance]);
|
|
87
|
-
this._serviceOwnership.set(id, options?.ownership ?? ServiceOwnership.Owned);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
makeCollection(): ServiceCollection {
|
|
91
|
-
const serviceCollection = new ServiceCollection({
|
|
92
|
-
ownership: this._serviceOwnership,
|
|
93
|
-
});
|
|
94
|
-
for (const [id, instanceOrDescriptor] of this.registry) {
|
|
95
|
-
serviceCollection.set(id, instanceOrDescriptor);
|
|
96
|
-
}
|
|
97
|
-
return serviceCollection;
|
|
98
|
-
}
|
|
99
|
-
}
|
package/src/di/trace.ts
DELETED
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import type { ServiceIdentifier } from './base';
|
|
2
|
-
|
|
3
|
-
enum TraceType {
|
|
4
|
-
None = 0,
|
|
5
|
-
Creation = 1,
|
|
6
|
-
Invocation = 2,
|
|
7
|
-
Branch = 3,
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export class Trace {
|
|
11
|
-
static all = new Set<string>();
|
|
12
|
-
|
|
13
|
-
private static readonly _None = new (class extends Trace {
|
|
14
|
-
constructor() {
|
|
15
|
-
super(TraceType.None, null);
|
|
16
|
-
}
|
|
17
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
18
|
-
override stop() {}
|
|
19
|
-
override branch() {
|
|
20
|
-
return this;
|
|
21
|
-
}
|
|
22
|
-
})();
|
|
23
|
-
|
|
24
|
-
static traceInvocation(_enableTracing: boolean, ctor: any): Trace {
|
|
25
|
-
return !_enableTracing
|
|
26
|
-
? Trace._None
|
|
27
|
-
: new Trace(TraceType.Invocation, ctor.name || new Error().stack!.split('\n').slice(3, 4).join('\n'));
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
static traceCreation(_enableTracing: boolean, ctor: any): Trace {
|
|
31
|
-
return !_enableTracing ? Trace._None : new Trace(TraceType.Creation, ctor.name);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
private static _totals = 0;
|
|
35
|
-
private readonly _start: number = Date.now();
|
|
36
|
-
private readonly _dep: [ServiceIdentifier<any>, boolean, Trace?][] = [];
|
|
37
|
-
private readonly _type: TraceType;
|
|
38
|
-
private readonly _name: string | null;
|
|
39
|
-
|
|
40
|
-
private constructor(type: TraceType, name: string | null) {
|
|
41
|
-
this._type = type;
|
|
42
|
-
this._name = name;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
branch(id: ServiceIdentifier<any>, first: boolean): Trace {
|
|
46
|
-
const child = new Trace(TraceType.Branch, id.toString());
|
|
47
|
-
this._dep.push([id, first, child]);
|
|
48
|
-
return child;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
stop() {
|
|
52
|
-
const dur = Date.now() - this._start;
|
|
53
|
-
Trace._totals += dur;
|
|
54
|
-
|
|
55
|
-
let causedCreation = false;
|
|
56
|
-
|
|
57
|
-
function printChild(n: number, trace: Trace) {
|
|
58
|
-
const res: string[] = [];
|
|
59
|
-
const prefix = new Array(n + 1).join('\t');
|
|
60
|
-
for (const [id, first, child] of trace._dep) {
|
|
61
|
-
if (first && child) {
|
|
62
|
-
causedCreation = true;
|
|
63
|
-
res.push(`${prefix}CREATES -> ${id}`);
|
|
64
|
-
const nested = printChild(n + 1, child);
|
|
65
|
-
if (nested) {
|
|
66
|
-
res.push(nested);
|
|
67
|
-
}
|
|
68
|
-
} else {
|
|
69
|
-
res.push(`${prefix}uses -> ${id}`);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
return res.join('\n');
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const lines = [
|
|
76
|
-
`${this._type === TraceType.Creation ? 'CREATE' : 'CALL'} ${this._name}`,
|
|
77
|
-
`${printChild(1, this)}`,
|
|
78
|
-
`DONE, took ${dur.toFixed(2)}ms (grand total ${Trace._totals.toFixed(2)}ms)`,
|
|
79
|
-
];
|
|
80
|
-
|
|
81
|
-
if (dur > 2 || causedCreation) {
|
|
82
|
-
Trace.all.add(lines.join('\n'));
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { DisposableStore } from './disposable-store';
|
|
2
|
-
import { Disposable } from './disposable-t';
|
|
3
|
-
|
|
4
|
-
class Foo extends Disposable {
|
|
5
|
-
private readonly _mockFunc: () => void;
|
|
6
|
-
|
|
7
|
-
constructor(mockFunc: () => void) {
|
|
8
|
-
super();
|
|
9
|
-
this._mockFunc = mockFunc;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
dispose() {
|
|
13
|
-
this._mockFunc();
|
|
14
|
-
super.dispose();
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
describe('dispose store', () => {
|
|
19
|
-
it('dispose success', () => {
|
|
20
|
-
const mockDispose1 = vi.fn();
|
|
21
|
-
const mockDispose2 = vi.fn();
|
|
22
|
-
|
|
23
|
-
const instance = new DisposableStore();
|
|
24
|
-
expect(instance.isDisposed).toBe(false);
|
|
25
|
-
|
|
26
|
-
instance.add(new Foo(mockDispose1));
|
|
27
|
-
instance.add(new Foo(mockDispose2));
|
|
28
|
-
instance.dispose();
|
|
29
|
-
|
|
30
|
-
expect(mockDispose1).toBeCalled();
|
|
31
|
-
expect(mockDispose2).toBeCalled();
|
|
32
|
-
expect(instance.isDisposed).toBe(true);
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
it('clear success', () => {
|
|
36
|
-
const mockDispose1 = vi.fn();
|
|
37
|
-
const mockDispose2 = vi.fn();
|
|
38
|
-
|
|
39
|
-
const instance = new DisposableStore();
|
|
40
|
-
expect(instance.isDisposed).toBe(false);
|
|
41
|
-
|
|
42
|
-
instance.add(new Foo(mockDispose1));
|
|
43
|
-
instance.add(new Foo(mockDispose2));
|
|
44
|
-
instance.clear();
|
|
45
|
-
|
|
46
|
-
expect(mockDispose1).toBeCalled();
|
|
47
|
-
expect(mockDispose2).toBeCalled();
|
|
48
|
-
expect(instance.isDisposed).toBe(false);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it('add self error', () => {
|
|
52
|
-
const instance = new DisposableStore();
|
|
53
|
-
expect(() => {
|
|
54
|
-
instance.add(instance);
|
|
55
|
-
}).toThrow('Cannot register a disposable on itself.');
|
|
56
|
-
});
|
|
57
|
-
});
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { Logger } from '@/_internal/logger';
|
|
2
|
-
import type { IDisposable } from './dispose-base';
|
|
3
|
-
import { BRANCH_DISPOSE } from './logger';
|
|
4
|
-
import { MARK_AS_DISPOSED, SET_PARENT_OF_DISPOSABLE, TRACK_DISPOSABLE } from './tracker';
|
|
5
|
-
|
|
6
|
-
export class DisposableStore implements IDisposable {
|
|
7
|
-
static DISABLE_DISPOSED_WARNING = false;
|
|
8
|
-
|
|
9
|
-
private readonly _toDispose = new Set<IDisposable>();
|
|
10
|
-
private _isDisposed = false;
|
|
11
|
-
|
|
12
|
-
constructor() {
|
|
13
|
-
TRACK_DISPOSABLE(this);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
get isDisposed(): boolean {
|
|
17
|
-
return this._isDisposed;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
dispose(): void {
|
|
21
|
-
if (this._isDisposed) {
|
|
22
|
-
// 不应该出现重复dispose
|
|
23
|
-
Logger.warn(new Error('DisposableStore has disposed.').stack);
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
MARK_AS_DISPOSED(this);
|
|
28
|
-
this._isDisposed = true;
|
|
29
|
-
this.clear();
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
clear(): void {
|
|
33
|
-
if (this._toDispose.size === 0) {
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
for (const disposable of this._toDispose) {
|
|
38
|
-
BRANCH_DISPOSE(this.constructor.name, disposable.constructor.name);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
42
|
-
const errors: any[] = [];
|
|
43
|
-
for (const disposable of this._toDispose) {
|
|
44
|
-
try {
|
|
45
|
-
disposable.dispose();
|
|
46
|
-
} catch (e) {
|
|
47
|
-
errors.push(e);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
this._toDispose.clear();
|
|
52
|
-
if (errors.length > 0) {
|
|
53
|
-
throw new AggregateError(errors, 'find error when dispose store.');
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
add<T extends IDisposable>(o: T): T {
|
|
58
|
-
if (!o) {
|
|
59
|
-
return o;
|
|
60
|
-
}
|
|
61
|
-
if ((o as unknown as DisposableStore) === this) {
|
|
62
|
-
throw new Error('Cannot register a disposable on itself.');
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
SET_PARENT_OF_DISPOSABLE(o, this);
|
|
66
|
-
if (this._isDisposed) {
|
|
67
|
-
if (!DisposableStore.DISABLE_DISPOSED_WARNING) {
|
|
68
|
-
Logger.warn(
|
|
69
|
-
new Error(
|
|
70
|
-
'Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!',
|
|
71
|
-
).stack,
|
|
72
|
-
);
|
|
73
|
-
}
|
|
74
|
-
} else {
|
|
75
|
-
this._toDispose.add(o);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
return o;
|
|
79
|
-
}
|
|
80
|
-
}
|