@fluojs/di 1.0.0-beta.6 → 1.0.0-beta.8
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/README.ko.md +26 -2
- package/README.md +27 -3
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +30 -9
- package/dist/types.d.ts +6 -12
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
package/README.ko.md
CHANGED
|
@@ -78,6 +78,10 @@ const service = await container.resolve(UserService);
|
|
|
78
78
|
|
|
79
79
|
dispose 중에는 루트 컨테이너가 먼저 살아 있는 request scope 자식을 정리한 뒤, 자식 dispose 중 하나 이상이 실패하더라도 루트가 소유한 singleton 정리를 계속 수행합니다. 자식/루트 dispose 실패가 여러 개 발생하면 `dispose()`는 모든 shutdown 실패를 확인할 수 있도록 `AggregateError`로 보고합니다.
|
|
80
80
|
|
|
81
|
+
### provider override
|
|
82
|
+
|
|
83
|
+
테스트나 request-local 경계에서 기존 등록을 의도적으로 교체해야 할 때는 `override(...providers)`를 사용합니다. override는 각 토큰의 현재 provider set을 교체하고 cached instance를 무효화하며, 오래된 instance를 즉시 dispose합니다. multi provider override는 해당 토큰의 전체 multi-provider set을 교체하므로 필요한 replacement provider를 한 번에 모두 전달하세요. 같은 토큰에 single replacement와 multi replacement를 한 override 호출에서 섞으면 모호한 교체로 보고 거부합니다.
|
|
84
|
+
|
|
81
85
|
### request scope 분리
|
|
82
86
|
|
|
83
87
|
```ts
|
|
@@ -111,6 +115,18 @@ class ServiceB {
|
|
|
111
115
|
}
|
|
112
116
|
```
|
|
113
117
|
|
|
118
|
+
`forwardRef(...)`와 `optional(...)`은 클래스 수준 `@Inject(...)` 토큰 목록이나 provider 수준 `inject` 배열 안에서 쓰는 토큰 래퍼입니다. 이들은 데코레이터가 아니며 constructor parameter에 붙이지 않습니다.
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
import { optional } from '@fluojs/di';
|
|
122
|
+
import { Inject } from '@fluojs/core';
|
|
123
|
+
|
|
124
|
+
@Inject(optional(AuditLogger))
|
|
125
|
+
class ServiceWithOptionalLogger {
|
|
126
|
+
constructor(private readonly auditLogger: AuditLogger | undefined) {}
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
114
130
|
## 테스트 및 모킹
|
|
115
131
|
|
|
116
132
|
`useValue`를 사용하면 단위 테스트 중에 컨테이너의 provider를 모의 객체(mock)나 스텁(stub)으로 쉽게 교체할 수 있습니다.
|
|
@@ -119,7 +135,7 @@ class ServiceB {
|
|
|
119
135
|
import { Container } from '@fluojs/di';
|
|
120
136
|
|
|
121
137
|
const container = new Container();
|
|
122
|
-
const mockDb = { query:
|
|
138
|
+
const mockDb = { query: vi.fn() };
|
|
123
139
|
|
|
124
140
|
// 실제 Database 클래스를 모의 객체 값으로 교체
|
|
125
141
|
container.register({
|
|
@@ -128,7 +144,7 @@ container.register({
|
|
|
128
144
|
});
|
|
129
145
|
|
|
130
146
|
const service = await container.resolve(DataService);
|
|
131
|
-
//
|
|
147
|
+
// service는 실제 Database 인스턴스 대신 mockDb를 사용합니다.
|
|
132
148
|
```
|
|
133
149
|
|
|
134
150
|
## 문제 해결
|
|
@@ -145,10 +161,18 @@ const service = await container.resolve(DataService);
|
|
|
145
161
|
|---|---|
|
|
146
162
|
| `Container` | 메인 DI 컨테이너 클래스입니다. |
|
|
147
163
|
| `register(...providers)` | 하나 이상의 프로바이더를 등록합니다. |
|
|
164
|
+
| `override(...providers)` | 기존 provider를 교체하고 cached instance를 무효화하며 오래된 instance를 dispose합니다. |
|
|
148
165
|
| `resolve<T>(token)` | 토큰을 인스턴스로 비동기 해석합니다. |
|
|
149
166
|
| `createRequestScope()` | 요청 스코프 의존성을 위한 자식 컨테이너를 생성합니다. |
|
|
150
167
|
| `has(token)` | 컨테이너나 부모에 토큰이 등록되어 있는지 확인합니다. |
|
|
151
168
|
| `hasRequestScopedDependency(token)` | 토큰 해석 시 provider 그래프에 request-scoped 의존성이나 순환이 있어 request-scope 컨테이너가 필요할 수 있는지 확인합니다. |
|
|
169
|
+
| `dispose()` | request child와 루트가 소유한 singleton instance를 정리합니다. |
|
|
170
|
+
| `forwardRef(fn)` | 선언 순서 문제를 위해 조회를 지연하는 토큰 래퍼를 반환합니다. 실제 생성자 순환을 해석 가능하게 만들지는 않습니다. |
|
|
171
|
+
| `optional(token)` | 하나의 의존성을 optional로 표시하는 토큰 래퍼를 반환합니다. 누락된 optional dependency는 `undefined`로 해석됩니다. |
|
|
172
|
+
| `Scope` | `DEFAULT`, `REQUEST`, `TRANSIENT` scope 상수를 제공합니다. |
|
|
173
|
+
| 에러 클래스 | `InvalidProviderError`, `ContainerResolutionError`, `RequestScopeResolutionError`, `ScopeMismatchError`, `CircularDependencyError`, `DuplicateProviderError`. |
|
|
174
|
+
|
|
175
|
+
multi-provider 토큰을 resolve하면 등록 순서대로 해석된 값의 배열이 반환됩니다.
|
|
152
176
|
|
|
153
177
|
## 관련 패키지
|
|
154
178
|
|
package/README.md
CHANGED
|
@@ -64,7 +64,7 @@ const result = await service.getStatus();
|
|
|
64
64
|
## Key Capabilities
|
|
65
65
|
|
|
66
66
|
### Provider Types
|
|
67
|
-
fluo DI supports
|
|
67
|
+
fluo DI supports four provider shapes:
|
|
68
68
|
- **Class Providers**: `container.register(MyService)` or `{ provide: MyToken, useClass: MyService }`.
|
|
69
69
|
- **Value Providers**: `{ provide: 'API_URL', useValue: 'https://api.example.com' }`.
|
|
70
70
|
- **Factory Providers**: `{ provide: 'ASYNC_CONFIG', useFactory: async (db) => await db.load(), inject: [Database] }`.
|
|
@@ -77,6 +77,10 @@ fluo DI supports three main provider shapes:
|
|
|
77
77
|
|
|
78
78
|
During disposal, the root container first tears down live request-scope children and then continues with root-owned singleton cleanup even if one or more child disposals fail. When multiple child/root disposals fail, `dispose()` reports an `AggregateError` so callers can inspect every shutdown failure without losing cleanup progress.
|
|
79
79
|
|
|
80
|
+
### Provider Overrides
|
|
81
|
+
|
|
82
|
+
Use `override(...providers)` when a test or request-local boundary needs to replace existing registrations deliberately. Overrides replace the current provider set for each token, invalidate cached instances, and dispose stale instances immediately. Multi-provider overrides replace the full multi-provider set for that token, so pass every replacement provider together; mixing single and multi replacements for the same token in one override call is rejected as ambiguous.
|
|
83
|
+
|
|
80
84
|
### Request Scoping
|
|
81
85
|
Isolated containers can be created to handle per-request state without polluting the root container.
|
|
82
86
|
|
|
@@ -111,6 +115,18 @@ class ServiceB {
|
|
|
111
115
|
}
|
|
112
116
|
```
|
|
113
117
|
|
|
118
|
+
`forwardRef(...)` and `optional(...)` are token wrappers used inside the class-level `@Inject(...)` token list or provider-level `inject` arrays. They are not decorators and do not attach to constructor parameters.
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
import { optional } from '@fluojs/di';
|
|
122
|
+
import { Inject } from '@fluojs/core';
|
|
123
|
+
|
|
124
|
+
@Inject(optional(AuditLogger))
|
|
125
|
+
class ServiceWithOptionalLogger {
|
|
126
|
+
constructor(private readonly auditLogger: AuditLogger | undefined) {}
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
114
130
|
## Testing and Mocking
|
|
115
131
|
|
|
116
132
|
You can easily override providers in the container to use mocks or stubs during unit testing by using `useValue`.
|
|
@@ -119,7 +135,7 @@ You can easily override providers in the container to use mocks or stubs during
|
|
|
119
135
|
import { Container } from '@fluojs/di';
|
|
120
136
|
|
|
121
137
|
const container = new Container();
|
|
122
|
-
const mockDb = { query:
|
|
138
|
+
const mockDb = { query: vi.fn() };
|
|
123
139
|
|
|
124
140
|
// Override the real Database class with a mock value
|
|
125
141
|
container.register({
|
|
@@ -128,7 +144,7 @@ container.register({
|
|
|
128
144
|
});
|
|
129
145
|
|
|
130
146
|
const service = await container.resolve(DataService);
|
|
131
|
-
// service
|
|
147
|
+
// service uses mockDb instead of the real Database instance
|
|
132
148
|
```
|
|
133
149
|
|
|
134
150
|
## Troubleshooting
|
|
@@ -145,10 +161,18 @@ Ensure all required providers are registered in the container. If you use `creat
|
|
|
145
161
|
|---|---|
|
|
146
162
|
| `Container` | The main DI container class. |
|
|
147
163
|
| `register(...providers)` | Registers one or more providers. |
|
|
164
|
+
| `override(...providers)` | Replaces existing providers, invalidates cached instances, and disposes stale instances. |
|
|
148
165
|
| `resolve<T>(token)` | Asynchronously resolves a token to an instance. |
|
|
149
166
|
| `createRequestScope()` | Creates a child container for request-scoped dependencies. |
|
|
150
167
|
| `has(token)` | Checks if a token is registered in the container or its parents. |
|
|
151
168
|
| `hasRequestScopedDependency(token)` | Checks whether resolving a token may require a request-scope container because its provider graph contains request-scoped dependencies or is cyclic. |
|
|
169
|
+
| `dispose()` | Disposes request children and root-owned singleton instances. |
|
|
170
|
+
| `forwardRef(fn)` | Returns a token wrapper that defers lookup for declaration-order issues; it does not make constructor dependency cycles resolvable. |
|
|
171
|
+
| `optional(token)` | Returns a token wrapper that marks one dependency as optional; missing optional dependencies resolve to `undefined`. |
|
|
172
|
+
| `Scope` | Exposes `DEFAULT`, `REQUEST`, and `TRANSIENT` scope constants. |
|
|
173
|
+
| Error classes | `InvalidProviderError`, `ContainerResolutionError`, `RequestScopeResolutionError`, `ScopeMismatchError`, `CircularDependencyError`, `DuplicateProviderError`. |
|
|
174
|
+
|
|
175
|
+
Resolving a multi-provider token returns an array of resolved values in registration order.
|
|
152
176
|
|
|
153
177
|
## Related Packages
|
|
154
178
|
|
package/dist/container.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmC,KAAK,KAAK,EAAE,MAAM,cAAc,CAAC;AAW3E,OAAO,KAAK,EASV,QAAQ,EAET,MAAM,YAAY,CAAC;AA4IpB;;GAEG;AACH,qBAAa,SAAS;IAsBlB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IAtBtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwC;IACtE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA0C;IAC7E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAoB;IAC1D,OAAO,CAAC,YAAY,CAA2C;IAC/D,OAAO,CAAC,iBAAiB,CAAwD;IACjF,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAmD;IACvF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA4B;IAC/D,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAiB;IACrD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA+B;IAC9D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAsC;IAC3E,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA0E;IAClH,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAyE;IAChH,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAmD;IAChG,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAA0E;IACrH,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,aAAa,CAAK;gBAGP,MAAM,CAAC,EAAE,SAAS,YAAA,EAClB,mBAAmB,UAAQ,EAC5C,cAAc,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAK/C;;;;;;;;;OASG;IACH,QAAQ,CAAC,GAAG,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI;IA4CxC;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,GAAG,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"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"}
|
package/dist/container.js
CHANGED
|
@@ -203,20 +203,41 @@ export class Container {
|
|
|
203
203
|
hint: 'Ensure overrides are applied before calling container.dispose().'
|
|
204
204
|
});
|
|
205
205
|
}
|
|
206
|
+
const normalizedByToken = new Map();
|
|
206
207
|
for (const provider of providers) {
|
|
207
208
|
const normalized = normalizeProvider(provider);
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
209
|
+
const normalizedProviders = normalizedByToken.get(normalized.provide);
|
|
210
|
+
if (normalizedProviders) {
|
|
211
|
+
normalizedProviders.push(normalized);
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
normalizedByToken.set(normalized.provide, [normalized]);
|
|
215
|
+
}
|
|
216
|
+
for (const [token, normalizedProviders] of normalizedByToken) {
|
|
217
|
+
const firstProvider = normalizedProviders[0];
|
|
218
|
+
if (!firstProvider) {
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
const containsMultiProvider = normalizedProviders.some(normalized => normalized.multi === true);
|
|
222
|
+
if (containsMultiProvider && normalizedProviders.some(normalized => normalized.multi !== true)) {
|
|
223
|
+
throw new DuplicateProviderError(token);
|
|
224
|
+
}
|
|
225
|
+
if (!containsMultiProvider && normalizedProviders.length > 1) {
|
|
226
|
+
throw new DuplicateProviderError(token);
|
|
227
|
+
}
|
|
228
|
+
const existing = this.lookupProvider(token);
|
|
229
|
+
const existingMultiProviders = this.collectMultiProviders(token);
|
|
230
|
+
this.registrations.delete(token);
|
|
231
|
+
this.multiRegistrations.delete(token);
|
|
232
|
+
this.invalidateCachedEntry(token, existing?.scope ?? existingMultiProviders[0]?.scope ?? firstProvider.scope);
|
|
233
|
+
if (containsMultiProvider) {
|
|
234
|
+
this.multiRegistrations.set(token, normalizedProviders);
|
|
235
|
+
this.multiOverriddenTokens.add(token);
|
|
215
236
|
this.advanceGraphRevision();
|
|
216
237
|
continue;
|
|
217
238
|
}
|
|
218
|
-
this.multiOverriddenTokens.add(
|
|
219
|
-
this.registrations.set(
|
|
239
|
+
this.multiOverriddenTokens.add(token);
|
|
240
|
+
this.registrations.set(token, firstProvider);
|
|
220
241
|
this.advanceGraphRevision();
|
|
221
242
|
}
|
|
222
243
|
return this;
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Constructor, MaybePromise, Token } from '@fluojs/core';
|
|
1
|
+
import type { Constructor, ForwardRefToken, InjectionToken, MaybePromise, OptionalInjectToken, Token } from '@fluojs/core';
|
|
2
2
|
/**
|
|
3
3
|
* Lifetime policy understood by the DI container.
|
|
4
4
|
*/
|
|
@@ -30,7 +30,7 @@ export type ClassType<T = unknown> = Constructor<T> & Function;
|
|
|
30
30
|
export interface ClassProvider<T = unknown> {
|
|
31
31
|
provide: Token<T>;
|
|
32
32
|
useClass: ClassType<T>;
|
|
33
|
-
inject?:
|
|
33
|
+
inject?: InjectionToken[];
|
|
34
34
|
scope?: Scope;
|
|
35
35
|
multi?: boolean;
|
|
36
36
|
}
|
|
@@ -40,7 +40,7 @@ export interface ClassProvider<T = unknown> {
|
|
|
40
40
|
export interface FactoryProvider<T = unknown> {
|
|
41
41
|
provide: Token<T>;
|
|
42
42
|
useFactory: (...deps: unknown[]) => MaybePromise<T>;
|
|
43
|
-
inject?:
|
|
43
|
+
inject?: InjectionToken[];
|
|
44
44
|
scope?: Scope;
|
|
45
45
|
multi?: boolean;
|
|
46
46
|
resolverClass?: ClassType;
|
|
@@ -63,17 +63,11 @@ export interface ExistingProvider<T = unknown> {
|
|
|
63
63
|
/**
|
|
64
64
|
* Deferred token resolver used to break declaration-time cycles between providers.
|
|
65
65
|
*/
|
|
66
|
-
export type ForwardRefFn<T = unknown> =
|
|
67
|
-
__forwardRef__: true;
|
|
68
|
-
forwardRef: () => Token<T>;
|
|
69
|
-
};
|
|
66
|
+
export type ForwardRefFn<T = unknown> = ForwardRefToken<T>;
|
|
70
67
|
/**
|
|
71
68
|
* Wrapper token that marks a dependency as optional during resolution.
|
|
72
69
|
*/
|
|
73
|
-
export type OptionalToken<T = unknown> =
|
|
74
|
-
__optional__: true;
|
|
75
|
-
token: Token<T>;
|
|
76
|
-
};
|
|
70
|
+
export type OptionalToken<T = unknown> = OptionalInjectToken<T>;
|
|
77
71
|
/**
|
|
78
72
|
* Public provider shape accepted by container registration and override APIs.
|
|
79
73
|
*/
|
|
@@ -95,7 +89,7 @@ export interface RequestScopeContainer {
|
|
|
95
89
|
* Internal normalized provider representation used after the container validates public provider inputs.
|
|
96
90
|
*/
|
|
97
91
|
export interface NormalizedProvider<T = unknown> {
|
|
98
|
-
inject:
|
|
92
|
+
inject: InjectionToken[];
|
|
99
93
|
provide: Token<T>;
|
|
100
94
|
scope: Scope;
|
|
101
95
|
type: 'class' | 'factory' | 'value' | 'existing';
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"container",
|
|
10
10
|
"provider"
|
|
11
11
|
],
|
|
12
|
-
"version": "1.0.0-beta.
|
|
12
|
+
"version": "1.0.0-beta.8",
|
|
13
13
|
"private": false,
|
|
14
14
|
"license": "MIT",
|
|
15
15
|
"repository": {
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"dist"
|
|
37
37
|
],
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@fluojs/core": "^1.0.0-beta.
|
|
39
|
+
"@fluojs/core": "^1.0.0-beta.6"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"vitest": "^3.2.4"
|