katagami 1.1.0 → 2.0.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/README.md +21 -14
- package/dist/container/index.d.ts +8 -24
- package/dist/disposable/index.cjs +76 -0
- package/dist/disposable/index.d.ts +24 -0
- package/dist/disposable/index.js +45 -0
- package/dist/index-g50fxds1.js +34 -0
- package/dist/index-jx8b52m0.js +4 -0
- package/dist/index.cjs +13 -127
- package/dist/index.d.ts +2 -1
- package/dist/index.js +18 -159
- package/dist/internal.d.ts +27 -0
- package/dist/scope/index.cjs +145 -0
- package/dist/scope/index.d.ts +21 -23
- package/dist/scope/index.js +86 -0
- package/package.json +14 -3
- package/README.de.md +0 -438
- package/README.es.md +0 -386
- package/README.fr.md +0 -386
- package/README.ja.md +0 -438
- package/README.ko.md +0 -438
- package/README.zh-CN.md +0 -438
- package/README.zh-TW.md +0 -438
package/README.fr.md
DELETED
|
@@ -1,386 +0,0 @@
|
|
|
1
|
-
[English](./README.md) | [日本語](./README.ja.md) | [한국어](./README.ko.md) | [繁體中文](./README.zh-TW.md) | [简体中文](./README.zh-CN.md) | [Español](./README.es.md) | [Deutsch](./README.de.md) | [Français](./README.fr.md)
|
|
2
|
-
|
|
3
|
-
# Katagami
|
|
4
|
-
|
|
5
|
-
Conteneur DI léger pour TypeScript avec inférence de types complète.
|
|
6
|
-
|
|
7
|
-
[](https://www.npmjs.com/package/katagami)
|
|
8
|
-
[](https://github.com/hiroiku/katagami/blob/master/LICENSE)
|
|
9
|
-
[](https://bundlephobia.com/package/katagami)
|
|
10
|
-
|
|
11
|
-
> Le nom vient de 型紙 _(katagami)_ — un papier pochoir de précision utilisé dans la teinture traditionnelle japonaise pour transférer des motifs exacts sur le tissu. Plusieurs pochoirs sont superposés pour composer des motifs complexes, tout comme les types s'accumulent à chaque appel dans la chaîne de méthodes. Un pochoir ne nécessite que du papier et un pinceau, pas de machinerie élaborée — de même, Katagami ne requiert ni décorateurs ni mécanismes de métadonnées et fonctionne avec n'importe quel outil de build sans configuration. Et comme les pochoirs s'adaptent à différents tissus et techniques, Katagami s'adapte à TypeScript et JavaScript, aux tokens de classe et aux tokens PropertyKey — une approche hybride pour une DI stricte et composable.
|
|
12
|
-
|
|
13
|
-
## Fonctionnalités
|
|
14
|
-
|
|
15
|
-
| Fonctionnalité | Description |
|
|
16
|
-
| ------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
|
|
17
|
-
| Inférence de types complète | Les types s'accumulent par chaînage de méthodes ; les tokens non enregistrés provoquent des erreurs à la compilation |
|
|
18
|
-
| Trois cycles de vie | Singleton, Transient et Scoped avec conteneurs enfants |
|
|
19
|
-
| Factories asynchrones | Les factories retournant des Promise sont automatiquement suivies par le système de types |
|
|
20
|
-
| Détection des dépendances circulaires | Messages d'erreur clairs avec le chemin complet du cycle |
|
|
21
|
-
| Support Disposable | TC39 Explicit Resource Management (`Symbol.dispose` / `Symbol.asyncDispose` / `await using`) |
|
|
22
|
-
| Prévention des dépendances captives | Les factories Singleton/Transient ne peuvent pas accéder aux tokens Scoped ; détecté à la compilation |
|
|
23
|
-
| Résolution optionnelle | `tryResolve` retourne `undefined` pour les tokens non enregistrés au lieu de lever une exception |
|
|
24
|
-
| Stratégie de tokens hybride | Tokens de classe pour une sécurité de types stricte, tokens PropertyKey pour la flexibilité |
|
|
25
|
-
| Carte de types par interface | Passez une interface à `createContainer<T>()` pour un enregistrement indépendant de l'ordre |
|
|
26
|
-
| Zéro dépendance | Pas de décorateurs, pas de reflect-metadata, pas de polyfills |
|
|
27
|
-
|
|
28
|
-
## Installation
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
npm install katagami
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## Démarrage rapide
|
|
35
|
-
|
|
36
|
-
```ts
|
|
37
|
-
import { createContainer } from 'katagami';
|
|
38
|
-
|
|
39
|
-
class Logger {
|
|
40
|
-
log(msg: string) {
|
|
41
|
-
console.log(msg);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
class UserService {
|
|
46
|
-
constructor(private logger: Logger) {}
|
|
47
|
-
greet(name: string) {
|
|
48
|
-
this.logger.log(`Hello, ${name}`);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const container = createContainer()
|
|
53
|
-
.registerSingleton(Logger, () => new Logger())
|
|
54
|
-
.registerSingleton(UserService, r => new UserService(r.resolve(Logger)));
|
|
55
|
-
|
|
56
|
-
const userService = container.resolve(UserService);
|
|
57
|
-
// ^? UserService (entièrement inféré)
|
|
58
|
-
userService.greet('world');
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
## Pourquoi Katagami
|
|
62
|
-
|
|
63
|
-
La plupart des conteneurs DI TypeScript reposent sur des décorateurs, reflect-metadata ou des tokens basés sur des chaînes de caractères — chacun apportant des compromis en matière de compatibilité des outils, de sécurité de types ou de taille du bundle. Katagami adopte une approche différente.
|
|
64
|
-
|
|
65
|
-
### Pas de décorateurs, pas de reflect-metadata
|
|
66
|
-
|
|
67
|
-
La DI basée sur les décorateurs nécessite les options du compilateur `experimentalDecorators` et `emitDecoratorMetadata`. Les outils de build modernes comme esbuild et Vite (configuration par défaut) ne supportent pas `emitDecoratorMetadata`, et la proposition de décorateurs standard TC39 n'inclut pas d'équivalent pour l'émission automatique de métadonnées de types. Katagami ne dépend d'aucun de ces éléments — il fonctionne avec n'importe quel outil de build sans configuration.
|
|
68
|
-
|
|
69
|
-
### Inférence de types complète à partir des tokens de classe
|
|
70
|
-
|
|
71
|
-
La DI avec des tokens de chaîne vous oblige à maintenir des correspondances manuelles entre tokens et types. La correspondance par nom de paramètre casse lors de la minification. Katagami utilise les classes directement comme tokens, donc `resolve` infère automatiquement le type de retour correct — synchrone ou `Promise` — sans annotations supplémentaires.
|
|
72
|
-
|
|
73
|
-
### Accumulation de types par chaîne de méthodes
|
|
74
|
-
|
|
75
|
-
Les types s'accumulent à chaque appel `register`. À l'intérieur d'une factory, le resolver n'accepte que les tokens déjà enregistrés à ce point de la chaîne. Résoudre un token non enregistré est une erreur de compilation, pas une surprise à l'exécution.
|
|
76
|
-
|
|
77
|
-
### Stratégie de tokens hybride
|
|
78
|
-
|
|
79
|
-
Les tokens de classe vous offrent une sécurité de types stricte et dépendante de l'ordre via le chaînage de méthodes. Mais parfois vous voulez définir un ensemble de services à l'avance et les enregistrer dans n'importe quel ordre. Passez une interface à `createContainer<T>()` et utilisez des tokens PropertyKey — la carte de types est fixée au moment de la création, donc l'ordre d'enregistrement n'a pas d'importance.
|
|
80
|
-
|
|
81
|
-
### Zéro dépendance
|
|
82
|
-
|
|
83
|
-
Aucune dépendance à l'exécution, aucun polyfill. Pas besoin d'ajouter reflect-metadata (~50 Ko non minifié) à votre bundle.
|
|
84
|
-
|
|
85
|
-
## Guide
|
|
86
|
-
|
|
87
|
-
### Singleton et Transient
|
|
88
|
-
|
|
89
|
-
Singleton crée l'instance au premier `resolve` et la met en cache. Transient crée une nouvelle instance à chaque fois.
|
|
90
|
-
|
|
91
|
-
```ts
|
|
92
|
-
import { createContainer } from 'katagami';
|
|
93
|
-
|
|
94
|
-
class Database {
|
|
95
|
-
constructor(public id = Math.random()) {}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
class RequestHandler {
|
|
99
|
-
constructor(public id = Math.random()) {}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
const container = createContainer()
|
|
103
|
-
.registerSingleton(Database, () => new Database())
|
|
104
|
-
.registerTransient(RequestHandler, () => new RequestHandler());
|
|
105
|
-
|
|
106
|
-
// Singleton — toujours la même instance
|
|
107
|
-
container.resolve(Database) === container.resolve(Database); // true
|
|
108
|
-
|
|
109
|
-
// Transient — nouvelle instance à chaque fois
|
|
110
|
-
container.resolve(RequestHandler) === container.resolve(RequestHandler); // false
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
### Cycle de vie Scoped et conteneurs enfants
|
|
114
|
-
|
|
115
|
-
Les enregistrements Scoped se comportent comme des singletons au sein d'un scope mais produisent une instance fraîche dans chaque nouveau scope. Utilisez `createScope()` pour créer un conteneur enfant. Les tokens Scoped ne peuvent pas être résolus depuis le conteneur racine.
|
|
116
|
-
|
|
117
|
-
```ts
|
|
118
|
-
import { createContainer } from 'katagami';
|
|
119
|
-
|
|
120
|
-
class DbPool {
|
|
121
|
-
constructor(public name = 'main') {}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
class RequestContext {
|
|
125
|
-
constructor(public id = Math.random()) {}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const root = createContainer()
|
|
129
|
-
.registerSingleton(DbPool, () => new DbPool())
|
|
130
|
-
.registerScoped(RequestContext, () => new RequestContext());
|
|
131
|
-
|
|
132
|
-
// Créer un scope pour chaque requête
|
|
133
|
-
const scope1 = root.createScope();
|
|
134
|
-
const scope2 = root.createScope();
|
|
135
|
-
|
|
136
|
-
// Scoped — identique au sein d'un scope, différent entre les scopes
|
|
137
|
-
scope1.resolve(RequestContext) === scope1.resolve(RequestContext); // true
|
|
138
|
-
scope1.resolve(RequestContext) === scope2.resolve(RequestContext); // false
|
|
139
|
-
|
|
140
|
-
// Singleton — partagé entre tous les scopes
|
|
141
|
-
scope1.resolve(DbPool) === scope2.resolve(DbPool); // true
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
Les scopes peuvent aussi être imbriqués. Chaque scope imbriqué possède son propre cache d'instances Scoped tout en partageant les singletons avec son parent :
|
|
145
|
-
|
|
146
|
-
```ts
|
|
147
|
-
const parentScope = root.createScope();
|
|
148
|
-
const childScope = parentScope.createScope();
|
|
149
|
-
|
|
150
|
-
// Chaque scope imbriqué obtient ses propres instances Scoped
|
|
151
|
-
parentScope.resolve(RequestContext) === childScope.resolve(RequestContext); // false
|
|
152
|
-
|
|
153
|
-
// Les singletons sont toujours partagés
|
|
154
|
-
parentScope.resolve(DbPool) === childScope.resolve(DbPool); // true
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
### Factories asynchrones
|
|
158
|
-
|
|
159
|
-
Les factories qui retournent une `Promise` sont automatiquement suivies par le système de types. Quand vous résolvez un token asynchrone, le type de retour est `Promise<V>` au lieu de `V` :
|
|
160
|
-
|
|
161
|
-
```ts
|
|
162
|
-
import { createContainer } from 'katagami';
|
|
163
|
-
|
|
164
|
-
class Database {
|
|
165
|
-
constructor(public connected: boolean) {}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
class Logger {
|
|
169
|
-
log(msg: string) {
|
|
170
|
-
console.log(msg);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
const container = createContainer()
|
|
175
|
-
.registerSingleton(Logger, () => new Logger())
|
|
176
|
-
.registerSingleton(Database, async () => {
|
|
177
|
-
await new Promise(r => setTimeout(r, 100)); // simuler une initialisation asynchrone
|
|
178
|
-
return new Database(true);
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
const logger = container.resolve(Logger);
|
|
182
|
-
// ^? Logger
|
|
183
|
-
|
|
184
|
-
const db = await container.resolve(Database);
|
|
185
|
-
// ^? Promise<Database> (après await → Database)
|
|
186
|
-
db.connected; // true
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
Les factories asynchrones peuvent dépendre à la fois d'enregistrements synchrones et asynchrones :
|
|
190
|
-
|
|
191
|
-
```ts
|
|
192
|
-
const container = createContainer()
|
|
193
|
-
.registerSingleton(Logger, () => new Logger())
|
|
194
|
-
.registerSingleton(Database, async r => {
|
|
195
|
-
const logger = r.resolve(Logger); // synchrone → Logger
|
|
196
|
-
logger.log('Connexion en cours...');
|
|
197
|
-
return new Database(true);
|
|
198
|
-
});
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
### Détection des dépendances circulaires
|
|
202
|
-
|
|
203
|
-
Katagami suit les tokens en cours de résolution. Si une dépendance circulaire est trouvée, une `ContainerError` est levée avec un message clair montrant le chemin complet du cycle :
|
|
204
|
-
|
|
205
|
-
```ts
|
|
206
|
-
import { createContainer } from 'katagami';
|
|
207
|
-
|
|
208
|
-
class ServiceA {
|
|
209
|
-
constructor(public b: ServiceB) {}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
class ServiceB {
|
|
213
|
-
constructor(public a: ServiceA) {}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
const container = createContainer()
|
|
217
|
-
.registerSingleton(ServiceA, r => new ServiceA(r.resolve(ServiceB)))
|
|
218
|
-
.registerSingleton(ServiceB, r => new ServiceB(r.resolve(ServiceA)));
|
|
219
|
-
|
|
220
|
-
container.resolve(ServiceA);
|
|
221
|
-
// ContainerError: Circular dependency detected: ServiceA -> ServiceB -> ServiceA
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
Les cycles indirects sont également détectés :
|
|
225
|
-
|
|
226
|
-
```
|
|
227
|
-
ContainerError: Circular dependency detected: ServiceX -> ServiceY -> ServiceZ -> ServiceX
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
### Support Disposable
|
|
231
|
-
|
|
232
|
-
`Container` et `Scope` implémentent tous deux `AsyncDisposable`. Lors de la suppression, les instances gérées sont parcourues dans l'ordre inverse de création (LIFO) et leurs méthodes `[Symbol.asyncDispose]()` ou `[Symbol.dispose]()` sont appelées automatiquement.
|
|
233
|
-
|
|
234
|
-
```ts
|
|
235
|
-
import { createContainer } from 'katagami';
|
|
236
|
-
|
|
237
|
-
class Connection {
|
|
238
|
-
async [Symbol.asyncDispose]() {
|
|
239
|
-
console.log('Connection closed');
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
// Suppression manuelle
|
|
244
|
-
const container = createContainer().registerSingleton(Connection, () => new Connection());
|
|
245
|
-
|
|
246
|
-
container.resolve(Connection);
|
|
247
|
-
await container[Symbol.asyncDispose]();
|
|
248
|
-
// => "Connection closed"
|
|
249
|
-
```
|
|
250
|
-
|
|
251
|
-
Avec `await using`, les scopes sont automatiquement supprimés à la fin du bloc :
|
|
252
|
-
|
|
253
|
-
```ts
|
|
254
|
-
const root = createContainer()
|
|
255
|
-
.registerSingleton(DbPool, () => new DbPool())
|
|
256
|
-
.registerScoped(Connection, () => new Connection());
|
|
257
|
-
|
|
258
|
-
{
|
|
259
|
-
await using scope = root.createScope();
|
|
260
|
-
const conn = scope.resolve(Connection);
|
|
261
|
-
// ... utiliser conn ...
|
|
262
|
-
} // le scope est supprimé ici — Connection est nettoyé, DbPool ne l'est pas
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
La suppression du scope n'affecte que les instances Scoped. Les instances Singleton appartiennent au conteneur racine et sont supprimées lorsque le conteneur lui-même est supprimé.
|
|
266
|
-
|
|
267
|
-
### Carte de types par interface
|
|
268
|
-
|
|
269
|
-
Quand vous passez une interface à `createContainer<T>()`, les tokens PropertyKey sont typés depuis l'interface plutôt qu'accumulés par chaînage. Cela signifie que vous pouvez enregistrer et résoudre des tokens dans n'importe quel ordre :
|
|
270
|
-
|
|
271
|
-
```ts
|
|
272
|
-
import { createContainer } from 'katagami';
|
|
273
|
-
|
|
274
|
-
class Logger {
|
|
275
|
-
log(msg: string) {
|
|
276
|
-
console.log(msg);
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
interface Services {
|
|
281
|
-
logger: Logger;
|
|
282
|
-
greeting: string;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
const container = createContainer<Services>()
|
|
286
|
-
// 'greeting' peut référencer 'logger' même s'il est enregistré après
|
|
287
|
-
.registerSingleton('greeting', r => {
|
|
288
|
-
r.resolve('logger').log('Construction du greeting...');
|
|
289
|
-
return 'Hello!';
|
|
290
|
-
})
|
|
291
|
-
.registerSingleton('logger', () => new Logger());
|
|
292
|
-
|
|
293
|
-
const greeting = container.resolve('greeting');
|
|
294
|
-
// ^? string
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
### Stratégie de tokens hybride
|
|
298
|
-
|
|
299
|
-
Vous pouvez mélanger les deux approches — utilisez des tokens de classe pour la sécurité de types dépendante de l'ordre et des tokens PropertyKey pour la flexibilité indépendante de l'ordre :
|
|
300
|
-
|
|
301
|
-
```ts
|
|
302
|
-
const container = createContainer<Services>()
|
|
303
|
-
.registerSingleton(Logger, () => new Logger())
|
|
304
|
-
.registerSingleton('logger', () => new Logger())
|
|
305
|
-
.registerSingleton('greeting', r => {
|
|
306
|
-
r.resolve(Logger).log('Construction du greeting...');
|
|
307
|
-
return 'Hello!';
|
|
308
|
-
});
|
|
309
|
-
```
|
|
310
|
-
|
|
311
|
-
### Prévention des dépendances captives
|
|
312
|
-
|
|
313
|
-
Une « dépendance captive » survient quand un service à longue durée de vie (singleton ou transient) capture un service à courte durée de vie (scoped), le maintenant en vie au-delà de son scope prévu. Katagami empêche cela à la compilation — les factories singleton et transient ne reçoivent qu'un resolver limité aux tokens non Scoped :
|
|
314
|
-
|
|
315
|
-
```ts
|
|
316
|
-
import { createContainer } from 'katagami';
|
|
317
|
-
|
|
318
|
-
class DbPool {}
|
|
319
|
-
class RequestContext {}
|
|
320
|
-
|
|
321
|
-
const container = createContainer()
|
|
322
|
-
.registerScoped(RequestContext, () => new RequestContext())
|
|
323
|
-
// @ts-expect-error — la factory singleton ne peut pas résoudre les tokens Scoped
|
|
324
|
-
.registerSingleton(DbPool, r => new DbPool(r.resolve(RequestContext)));
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
Les factories Scoped, en revanche, peuvent résoudre à la fois les tokens Scoped et non Scoped :
|
|
328
|
-
|
|
329
|
-
```ts
|
|
330
|
-
const container = createContainer()
|
|
331
|
-
.registerSingleton(DbPool, () => new DbPool())
|
|
332
|
-
.registerScoped(RequestContext, r => {
|
|
333
|
-
r.resolve(DbPool); // OK — la factory Scoped peut résoudre les tokens Singleton
|
|
334
|
-
return new RequestContext();
|
|
335
|
-
});
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
## API
|
|
339
|
-
|
|
340
|
-
### `createContainer<T, ScopedT>()`
|
|
341
|
-
|
|
342
|
-
Crée un nouveau conteneur DI. Passez une interface comme `T` pour définir la carte de types pour les tokens PropertyKey. Passez `ScopedT` pour définir une carte de types séparée pour les tokens PropertyKey Scoped (indépendant de l'ordre, comme `T`).
|
|
343
|
-
|
|
344
|
-
### `container.registerSingleton(token, factory)`
|
|
345
|
-
|
|
346
|
-
Enregistre une factory en tant que singleton. L'instance est créée au premier `resolve` et mise en cache ensuite. Retourne le conteneur pour le chaînage de méthodes.
|
|
347
|
-
|
|
348
|
-
### `container.registerTransient(token, factory)`
|
|
349
|
-
|
|
350
|
-
Enregistre une factory en tant que transient. Une nouvelle instance est créée à chaque `resolve`. Retourne le conteneur pour le chaînage de méthodes.
|
|
351
|
-
|
|
352
|
-
### `container.registerScoped(token, factory)`
|
|
353
|
-
|
|
354
|
-
Enregistre une factory en tant que scoped. Au sein d'un scope, l'instance est créée au premier `resolve` et mise en cache pour ce scope. Chaque scope maintient son propre cache. Les tokens Scoped ne peuvent pas être résolus depuis le conteneur racine. Retourne le conteneur pour le chaînage de méthodes.
|
|
355
|
-
|
|
356
|
-
### `container.resolve(token)`
|
|
357
|
-
|
|
358
|
-
Résout et retourne l'instance pour le token donné. Lève une `ContainerError` si le token n'est pas enregistré ou si une dépendance circulaire est détectée.
|
|
359
|
-
|
|
360
|
-
### `container.tryResolve(token)` / `scope.tryResolve(token)`
|
|
361
|
-
|
|
362
|
-
Tente de résoudre l'instance pour le token donné. Retourne `undefined` si le token n'est pas enregistré, au lieu de lever une exception. Lève toujours une `ContainerError` pour les dépendances circulaires ou les opérations sur des conteneurs/scopes supprimés.
|
|
363
|
-
|
|
364
|
-
### `container.createScope()`
|
|
365
|
-
|
|
366
|
-
Crée un nouveau `Scope` (conteneur enfant). Le scope hérite de tous les enregistrements du parent. Les instances Singleton sont partagées avec le parent, tandis que les instances Scoped sont locales au scope.
|
|
367
|
-
|
|
368
|
-
### `Scope`
|
|
369
|
-
|
|
370
|
-
Un conteneur enfant avec scope créé par `createScope()`. Fournit `resolve(token)`, `tryResolve(token)`, `createScope()` (pour les scopes imbriqués) et `[Symbol.asyncDispose]()`.
|
|
371
|
-
|
|
372
|
-
### `container[Symbol.asyncDispose]()` / `scope[Symbol.asyncDispose]()`
|
|
373
|
-
|
|
374
|
-
Supprime toutes les instances gérées dans l'ordre inverse de création (LIFO). Appelle `[Symbol.asyncDispose]()` ou `[Symbol.dispose]()` sur chaque instance qui les implémente. Idempotent — les appels suivants sont sans effet. Après la suppression, `resolve()` et `createScope()` lèveront une `ContainerError`.
|
|
375
|
-
|
|
376
|
-
### `ContainerError`
|
|
377
|
-
|
|
378
|
-
Classe d'erreur levée pour les échecs du conteneur tels que la résolution d'un token non enregistré, les dépendances circulaires ou les opérations sur un conteneur/scope supprimé.
|
|
379
|
-
|
|
380
|
-
### `Resolver`
|
|
381
|
-
|
|
382
|
-
Export de type représentant le resolver passé aux callbacks de factory. Utile quand vous devez typer une fonction qui accepte un paramètre resolver.
|
|
383
|
-
|
|
384
|
-
## Licence
|
|
385
|
-
|
|
386
|
-
MIT
|