@decohere/crucible 0.0.1-dev.10 → 0.0.1-dev.100
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 +351 -0
- package/commonjs/src/const.js +0 -2
- package/commonjs/src/decorators/index.js +0 -2
- package/commonjs/src/decorators/inject.decorator.js +0 -2
- package/commonjs/src/decorators/injectable.dectorator.js +0 -2
- package/commonjs/src/index.js +0 -2
- package/commonjs/src/models/registration-key.model.js +0 -2
- package/commonjs/src/models/service-registration.model.js +1 -6
- package/commonjs/src/services/crucible-builder.js +33 -34
- package/commonjs/src/services/crucible.js +34 -12
- package/commonjs/src/services/index.js +0 -2
- package/commonjs/src/services/service-registry.js +22 -5
- package/commonjs/src/types/errors.js +0 -2
- package/commonjs/src/types/index.js +1 -2
- package/commonjs/src/types/types.js +0 -2
- package/es6/src/const.js +0 -2
- package/es6/src/decorators/index.js +0 -2
- package/es6/src/decorators/inject.decorator.js +5 -3
- package/es6/src/decorators/injectable.dectorator.js +0 -2
- package/es6/src/index.js +0 -2
- package/es6/src/models/registration-key.model.js +0 -2
- package/es6/src/models/service-registration.model.js +1 -6
- package/es6/src/services/crucible-builder.js +33 -34
- package/es6/src/services/crucible.js +34 -12
- package/es6/src/services/index.js +0 -2
- package/es6/src/services/service-registry.js +22 -5
- package/es6/src/types/errors.js +0 -2
- package/es6/src/types/index.js +1 -2
- package/es6/src/types/types.js +0 -2
- package/package.json +3 -3
- package/types/src/decorators/inject.decorator.d.ts +8 -2
- package/types/src/models/service-registration.model.d.ts +1 -0
- package/types/src/services/crucible-builder.d.ts +5 -1
- package/types/src/services/crucible.d.ts +3 -1
- package/types/src/services/service-registry.d.ts +2 -0
- package/types/src/types/index.d.ts +1 -0
- package/types/src/types/types.d.ts +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
# @decohere/crucible
|
|
2
|
+
|
|
3
|
+
Lightweight dependency injection for Decohere. Register classes (or tokens) on a `CrucibleBuilder`, `build()` a container, then `resolve()` graphs of constructor-injected services.
|
|
4
|
+
|
|
5
|
+
Higher layers (for example Cortex `Builder.withServices`) register on a `CrucibleBuilder`. You can also build and resolve from a container yourself.
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
| Use Crucible | Do not use Crucible |
|
|
10
|
+
|---|---|
|
|
11
|
+
| Constructor-injected services and controllers | Replacing Cortex / Protocol / Codex — those compose *on top of* Crucible |
|
|
12
|
+
| Tokens for interfaces, config objects, and “many of this kind” | Auto-scanning folders or Nest-style modules (not in this package) |
|
|
13
|
+
| Request / singleton / transient lifetimes and `using` disposal | Throwing on a missing dependency (unregistered keys resolve to `null`) |
|
|
14
|
+
|
|
15
|
+
## Install
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pnpm add @decohere/crucible
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
import { CrucibleBuilder, LifetimeScopeToken, Scopes } from "@decohere/crucible";
|
|
23
|
+
import { inject, injectable } from "@decohere/crucible/decorators";
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Decorator metadata is required. Enable it in `tsconfig.json` (the Decohere scaffold and this repo already do):
|
|
27
|
+
|
|
28
|
+
```json
|
|
29
|
+
{
|
|
30
|
+
"compilerOptions": {
|
|
31
|
+
"experimentalDecorators": true,
|
|
32
|
+
"emitDecoratorMetadata": true
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
`@decohere/nexus/reflection` loads `reflect-metadata`. Import Crucible (or Nexus) before constructing decorated classes.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Constructor injection — `@inject` is usually unnecessary
|
|
42
|
+
|
|
43
|
+
If the constructor parameter is a **concrete class**, Crucible reads `design:paramtypes` and resolves by the class name. Mark the *consumer* `@injectable()` so TypeScript/SWC emit that metadata. Do **not** add `@inject` for that parameter.
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
import { injectable } from "@decohere/crucible/decorators";
|
|
47
|
+
import { SampleService } from "./sample.service.js";
|
|
48
|
+
|
|
49
|
+
@injectable()
|
|
50
|
+
export class HelloController {
|
|
51
|
+
public constructor(private readonly sample: SampleService) {}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
```ts
|
|
56
|
+
import { CrucibleBuilder } from "@decohere/crucible";
|
|
57
|
+
|
|
58
|
+
const builder = new CrucibleBuilder();
|
|
59
|
+
builder.registerSingleton(SampleService);
|
|
60
|
+
builder.registerRequestScoped(HelloController);
|
|
61
|
+
const container = builder.build();
|
|
62
|
+
|
|
63
|
+
using scope = container.beginScope("req");
|
|
64
|
+
const hello = scope.resolve(HelloController);
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
`@injectable()` is an empty class decorator. Its job is to force `design:paramtypes` onto the constructor. Any other class decorator (`@Controller()`, `@Trace`, …) also does that; `@injectable()` is the one to use when there is nothing else.
|
|
68
|
+
|
|
69
|
+
### Do not `import type` injected classes
|
|
70
|
+
|
|
71
|
+
`import type` is erased at compile time. `emitDecoratorMetadata` then records `Object` (or nothing) instead of the constructor. Crucible looks up `"Object"`, finds no registration, and **returns `null`**. The first method call on that dependency throws (`Cannot read properties of null`).
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
// Wrong — SampleService does not exist at runtime, paramtypes collapse to Object
|
|
75
|
+
import type { SampleService } from "./sample.service.js";
|
|
76
|
+
|
|
77
|
+
// Right — value import keeps the constructor for reflect-metadata
|
|
78
|
+
import { SampleService } from "./sample.service.js";
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
`import type` is correct for **interfaces** and type-only helpers. Those have no runtime constructor; pair them with `@inject(token)` (see below).
|
|
82
|
+
|
|
83
|
+
Linters that prefer type-only imports (`import type` / `import { type X }`) will flag a class that appears unused except as a constructor type. Keep the value import and suppress that rule locally — for example with oxlint (or Biome, or ESLint):
|
|
84
|
+
|
|
85
|
+
```ts
|
|
86
|
+
// oxlint-disable-next-line typescript/consistent-type-imports -- constructor injection needs the class at runtime
|
|
87
|
+
import { Workspace } from "@decohere/mesh";
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
That pattern is used throughout Forge (`Build`, `Clean`, …). Same idea applies to ESLint `consistent-type-imports` or equivalent.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## When you *do* need `@inject`
|
|
95
|
+
|
|
96
|
+
`@inject(key)` overrides the paramtypes lookup with an explicit key: a class constructor, string, or symbol. Use it when there is no useful constructor in `design:paramtypes`.
|
|
97
|
+
|
|
98
|
+
| Situation | Why `@inject` |
|
|
99
|
+
|---|---|
|
|
100
|
+
| Interface or type alias (`ISampleStore`) | No runtime class; paramtypes is `Object` |
|
|
101
|
+
| String / symbol token | Registration key is not the class name |
|
|
102
|
+
| Array of implementations (`Transformer[]`) | Paramtypes is `Array`; without a token, Crucible would `resolveMany("Array")` |
|
|
103
|
+
| Paramtypes collapsed to `Object` (circular import, decorate-before-init) | Explicit token still resolves |
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
import { inject, injectable } from "@decohere/crucible/decorators";
|
|
107
|
+
|
|
108
|
+
export const SampleStoreToken = Symbol("SampleStore");
|
|
109
|
+
|
|
110
|
+
export interface ISampleStore {
|
|
111
|
+
get(id: string): Promise<unknown>;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
@injectable()
|
|
115
|
+
export class SampleService {
|
|
116
|
+
public constructor(
|
|
117
|
+
@inject(SampleStoreToken) private readonly store: ISampleStore,
|
|
118
|
+
) {}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Keep tokens in a `const.ts` (or next to the interface). Register against the same token:
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
builder.registerSingleton(SampleStoreToken, PostgresSampleStore);
|
|
126
|
+
// or an already-built instance:
|
|
127
|
+
builder.registerSingleton(SampleStoreToken, store);
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
`@inject` takes `string | symbol | Constructable`. Prefer `@inject(SampleService)` over `@inject("SampleService")` — the class tracks renames. There is no `@inject({ many, optional })` yet — arrays use `resolveMany` automatically when the reflected type is `Array`, and missing keys are `null` (see [Optional / missing](#optional--missing-dependencies)).
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Registration and lifetimes
|
|
135
|
+
|
|
136
|
+
Keys are the class **name**, a string, or a symbol’s **description**. `resolve(SampleService)`, `resolve("SampleService")`, `@inject(SampleService)`, and `@inject("SampleService")` hit the same registration.
|
|
137
|
+
|
|
138
|
+
Registering the same class (or the same type on a token) twice **throws** `RegistrationError` — silent last-wins hides accidental double-registers. Replace it explicitly:
|
|
139
|
+
|
|
140
|
+
```ts
|
|
141
|
+
builder.override.registerSingleton(SampleService);
|
|
142
|
+
builder.override.registerTransient(SampleService);
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
`builder.override` is a registrar with replace already bound — the builder itself is not mutated. Two different types on one token is still multi-bind: `resolve` throws `ResolveError`, `resolveMany` returns both.
|
|
146
|
+
|
|
147
|
+
| Lifetime | Cached |
|
|
148
|
+
|---|---|
|
|
149
|
+
| Singleton | On the root container — shared with every nested scope |
|
|
150
|
+
| Request | On the current scope — new instance per `beginScope` |
|
|
151
|
+
| Transient | Never — new instance every `resolve` |
|
|
152
|
+
|
|
153
|
+
```ts
|
|
154
|
+
builder.registerSingleton(SampleService);
|
|
155
|
+
builder.registerSingleton(Token, SampleService);
|
|
156
|
+
builder.registerSingleton(Token, existingInstance);
|
|
157
|
+
|
|
158
|
+
builder.registerRequestScoped(HelloController);
|
|
159
|
+
builder.registerRequestScoped(Token, HelloController);
|
|
160
|
+
builder.registerRequestScoped(Token, () => createConnection());
|
|
161
|
+
|
|
162
|
+
builder.registerTransient(Helper);
|
|
163
|
+
builder.registerTransient(Token, Helper);
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
`registerType(type, scope?)` and `registerTypes(...)` are the same registrations without the lifetime in the method name (default **transient**). `Scopes.singleton` is the string `"single-instance"`.
|
|
167
|
+
|
|
168
|
+
Cortex HTTP: controllers are **request-scoped** (one per request). Services are usually **singletons**.
|
|
169
|
+
|
|
170
|
+
`registerSingleton(Class, instance)` binds an existing object under the class name. Terminal does this for the workspace:
|
|
171
|
+
|
|
172
|
+
```ts
|
|
173
|
+
builder.registerSingleton(workspace.constructor, workspace);
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Recipes
|
|
179
|
+
|
|
180
|
+
### Many implementations of one token
|
|
181
|
+
|
|
182
|
+
Register several types under the same token. Inject them as an array with `@inject(Token)`.
|
|
183
|
+
|
|
184
|
+
```ts
|
|
185
|
+
export const TransformerKey = Symbol("TransformerKey");
|
|
186
|
+
|
|
187
|
+
builder.registerSingleton(TransformerKey, SwcTranspiler);
|
|
188
|
+
builder.registerSingleton(TransformerKey, TypeEmitter);
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
```ts
|
|
192
|
+
@injectable()
|
|
193
|
+
export class Build {
|
|
194
|
+
public constructor(
|
|
195
|
+
@inject(TransformerKey) private readonly transformers: Transformer[],
|
|
196
|
+
) {}
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
`resolve(TransformerKey)` **throws** `ResolveError` when more than one registration exists. Use `resolveMany(TransformerKey)` or constructor injection of an array.
|
|
201
|
+
|
|
202
|
+
### Request scopes and disposal
|
|
203
|
+
|
|
204
|
+
```ts
|
|
205
|
+
builder.registerRequestScoped(UnitOfWork);
|
|
206
|
+
builder.registerSingleton(Clock);
|
|
207
|
+
const container = builder.build();
|
|
208
|
+
|
|
209
|
+
{
|
|
210
|
+
using scope = container.beginScope("req-1");
|
|
211
|
+
const uow = scope.resolve(UnitOfWork); // per-scope
|
|
212
|
+
const clock = scope.resolve(Clock); // same singleton as the root
|
|
213
|
+
} // scope[Symbol.dispose]() — request-scoped instances are disposed
|
|
214
|
+
|
|
215
|
+
await using scope = container.beginScope("req-2");
|
|
216
|
+
// async teardown via Symbol.asyncDispose if the instance implements it
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
- Child scopes copy the parent **registry** when created; they do not share the request-instance cache.
|
|
220
|
+
- Nested `beginScope` is allowed; each level has its own request instances.
|
|
221
|
+
- Named scopes: a live duplicate name throws `DuplicateScopeError`. After dispose, the name can be reused. Unnamed scopes do not collide.
|
|
222
|
+
- Disposing a parent does **not** dispose child scopes. Dispose the scope you created.
|
|
223
|
+
- Singletons are cached on the root container and shared with nested scopes. Resolving a singleton after the root is disposed throws.
|
|
224
|
+
|
|
225
|
+
Cortex `App.dispose` (Flux HMR / SIGINT) disposes the **root** container, then Scribe. Implement `Symbol.asyncDispose` (or `Symbol.dispose`) on long-lived services — sockets, pools, timers. Only **constructed** instances are disposed (resolve them at boot; transients are not cached). `export default app` is the composition-root contract; do not wrap it for extra teardown.
|
|
226
|
+
|
|
227
|
+
The current scope is always registered as `LifetimeScopeToken`:
|
|
228
|
+
|
|
229
|
+
```ts
|
|
230
|
+
import { type LifetimeScope, LifetimeScopeToken } from "@decohere/crucible";
|
|
231
|
+
import { inject, injectable } from "@decohere/crucible/decorators";
|
|
232
|
+
|
|
233
|
+
@injectable()
|
|
234
|
+
export class ExceptionFilterHost {
|
|
235
|
+
public constructor(
|
|
236
|
+
@inject(LifetimeScopeToken) private readonly scope: LifetimeScope,
|
|
237
|
+
) {}
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Factories
|
|
242
|
+
|
|
243
|
+
```ts
|
|
244
|
+
builder.registerRequestScoped("connection", () => createConnection());
|
|
245
|
+
const connection = container.resolve("connection");
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
Arrow factories are called as functions (not `new`). Use them when construction needs arguments Crucible should not know about.
|
|
249
|
+
|
|
250
|
+
### Optional / missing dependencies
|
|
251
|
+
|
|
252
|
+
Unregistered keys do **not** throw. `resolve` returns `null` and logs a warning. Optional constructor params (`dep?: Foo`) still go through resolution — you get `null` if nothing is registered.
|
|
253
|
+
|
|
254
|
+
```ts
|
|
255
|
+
@injectable()
|
|
256
|
+
export class App {
|
|
257
|
+
public constructor(
|
|
258
|
+
@inject(HttpProviderToken) private readonly http?: HttpProvider,
|
|
259
|
+
) {}
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
If a concrete class parameter is `null` at runtime, the usual cause is metadata loss (`import type`, missing `@injectable()`, or paramtypes `Object`) — not an optional registration.
|
|
264
|
+
|
|
265
|
+
### Cortex HTTP apps
|
|
266
|
+
|
|
267
|
+
```ts
|
|
268
|
+
import { Builder } from "@decohere/cortex";
|
|
269
|
+
import { FastifyProvider } from "@decohere/cortex/providers";
|
|
270
|
+
import { SampleService } from "./services/sample.service.js";
|
|
271
|
+
import { HelloController } from "./controllers/hello.controller.js";
|
|
272
|
+
|
|
273
|
+
await Builder.create()
|
|
274
|
+
.withHttp(FastifyProvider)
|
|
275
|
+
.withControllers(HelloController)
|
|
276
|
+
.withServices((cb) => {
|
|
277
|
+
cb.registerSingleton(SampleService);
|
|
278
|
+
})
|
|
279
|
+
.buildAndStart();
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
`withHttp` / `withControllers` already register the HTTP stack (router, controllers as request-scoped, …). Application services go in `withServices`.
|
|
283
|
+
|
|
284
|
+
### Tests
|
|
285
|
+
|
|
286
|
+
Prefer constructing the subject with explicit fakes when you do not need the container. Use `CrucibleBuilder` when the test *is* the wiring (scopes, tokens, many-implementations).
|
|
287
|
+
|
|
288
|
+
```ts
|
|
289
|
+
const builder = new CrucibleBuilder();
|
|
290
|
+
builder.registerSingleton(SampleService, fakeSample);
|
|
291
|
+
builder.registerRequestScoped(HelloController);
|
|
292
|
+
const container = builder.build();
|
|
293
|
+
using scope = container.beginScope("test");
|
|
294
|
+
const hello = scope.resolve(HelloController);
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
To assert constructor arguments under DI, use `spyOnConstructor` from `@decohere/nexus/testing` — a bare `vi.spyOn` / `vi.fn` constructor drops `design:paramtypes`. See [Asserting DI constructor arguments](../../docs/testing/how-tos/vitest-constructor-spy-with-crucible-di.md).
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## Public API
|
|
302
|
+
|
|
303
|
+
### `@decohere/crucible`
|
|
304
|
+
|
|
305
|
+
| Export | Role |
|
|
306
|
+
|---|---|
|
|
307
|
+
| `CrucibleBuilder` | Fluent registration; `build()` → `Crucible` |
|
|
308
|
+
| `Crucible` | Container: `resolve`, `resolveMany`, `beginScope`, `Symbol.dispose` / `Symbol.asyncDispose` |
|
|
309
|
+
| `IContainer` / `LifetimeScope` / `ContainerBuilder` / `ServiceProvider` | Composition interfaces |
|
|
310
|
+
| `Scopes` | `{ request, singleton: "single-instance", transient }` |
|
|
311
|
+
| `LifetimeScopeToken` | Symbol for the current scope |
|
|
312
|
+
| `ResolveError` | `resolve` when multiple registrations share a key |
|
|
313
|
+
| `DuplicateScopeError` | `beginScope` with a live duplicate name |
|
|
314
|
+
| `RegistrationError` | Same type registered twice without `builder.override` |
|
|
315
|
+
|
|
316
|
+
### `@decohere/crucible/decorators`
|
|
317
|
+
|
|
318
|
+
| Export | Role |
|
|
319
|
+
|---|---|
|
|
320
|
+
| `injectable()` | Empty class decorator; emit `design:paramtypes` |
|
|
321
|
+
| `inject(key)` | Parameter decorator; resolve by string or symbol instead of the reflected class name |
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
## Pitfalls
|
|
326
|
+
|
|
327
|
+
1. **`import type` on an injected class** — paramtypes become `Object` → `resolve` returns `null`. Use a value import.
|
|
328
|
+
2. **Missing `@injectable()` (or any decorator) on the consumer** — no paramtypes, constructor is called with zero arguments.
|
|
329
|
+
3. **`resolve` of a multi-bound token** — throws; use `resolveMany` or inject `T[]` with `@inject(token)`.
|
|
330
|
+
4. **Same type registered twice** — throws `RegistrationError`. Use `builder.override.registerSingleton(...)` (tests, plugin replacements).
|
|
331
|
+
5. **Missing registration** — `null`, not an exception. Null-deref on first use is the symptom.
|
|
332
|
+
6. **Symbol keys** — the lookup key is `symbol.description`. Keep descriptions unique and stable.
|
|
333
|
+
7. **Renaming a class** without a token — the registration key is `Class.name`. Tokens isolate you from renames.
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
## Non-goals
|
|
338
|
+
|
|
339
|
+
- Folder scanning / “declare a module and everything is registered”
|
|
340
|
+
- Property or setter injection (constructors only)
|
|
341
|
+
- `@inject({ many, optional })` metadata (not implemented; arrays and `null` cover the current cases)
|
|
342
|
+
- Compile-time graph checking
|
|
343
|
+
|
|
344
|
+
## Dependencies
|
|
345
|
+
|
|
346
|
+
| Package | Role |
|
|
347
|
+
|---|---|
|
|
348
|
+
| [`@decohere/nexus`](../nexus) | Reflection helpers for `design:paramtypes` (`getMeta`, `isConstructable`, …) |
|
|
349
|
+
| [`@decohere/scribe`](../scribe/README.md) | Logger facade |
|
|
350
|
+
|
|
351
|
+
Layering: [architecture](../../docs/architecture/).
|
package/commonjs/src/const.js
CHANGED
|
@@ -29,5 +29,3 @@ const Scopes = {
|
|
|
29
29
|
singleton: "single-instance",
|
|
30
30
|
transient: "transient"
|
|
31
31
|
};
|
|
32
|
-
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9jb25zdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFNjb3BlIH0gZnJvbSBcIi4vdHlwZXMvdHlwZXMuanNcIjtcblxuY29uc3QgQ3J1Y2libGUgPSBcIkNydWNpYmxlXCI7XG50eXBlIENydWNpYmxlTWV0YSA9IFwiaW5qZWN0dG9rZW5cIjtcblxuZXhwb3J0IGNvbnN0IExpZmV0aW1lU2NvcGVUb2tlbiA9IFN5bWJvbChcIkxpZmV0aW1lU2NvcGVcIik7XG5cbmV4cG9ydCBjb25zdCBDcnVjaWJsZU1ldGEgPSB7XG5cdGluamVjdHRva2VuOiBgJHtDcnVjaWJsZX06aW5qZWN0dG9rZW5gLFxufSBzYXRpc2ZpZXMgUmVjb3JkPENydWNpYmxlTWV0YSwgc3RyaW5nPjtcblxuZXhwb3J0IGNvbnN0IFNjb3BlcyA9IHtcblx0cmVxdWVzdDogXCJyZXF1ZXN0XCIsXG5cdHNpbmdsZXRvbjogXCJzaW5nbGUtaW5zdGFuY2VcIixcblx0dHJhbnNpZW50OiBcInRyYW5zaWVudFwiLFxufSBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgU2NvcGU+O1xuIl0sIm5hbWVzIjpbIkNydWNpYmxlTWV0YSIsIkxpZmV0aW1lU2NvcGVUb2tlbiIsIlNjb3BlcyIsIkNydWNpYmxlIiwiU3ltYm9sIiwiaW5qZWN0dG9rZW4iLCJyZXF1ZXN0Iiwic2luZ2xldG9uIiwidHJhbnNpZW50Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztRQU9hQTtlQUFBQTs7UUFGQUM7ZUFBQUE7O1FBTUFDO2VBQUFBOzs7QUFUYixNQUFNQyxXQUFXO0FBR1YsTUFBTUYscUJBQXFCRyxPQUFPO0FBRWxDLE1BQU1KLGVBQWU7SUFDM0JLLGFBQWEsR0FBR0YsU0FBUyxZQUFZLENBQUM7QUFDdkM7QUFFTyxNQUFNRCxTQUFTO0lBQ3JCSSxTQUFTO0lBQ1RDLFdBQVc7SUFDWEMsV0FBVztBQUNaIn0=
|
|
@@ -17,5 +17,3 @@ function _export_star(from, to) {
|
|
|
17
17
|
});
|
|
18
18
|
return from;
|
|
19
19
|
}
|
|
20
|
-
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9kZWNvcmF0b3JzL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2luamVjdC5kZWNvcmF0b3IuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2luamVjdGFibGUuZGVjdG9yYXRvci5qc1wiO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQWM7cUJBQ0EifQ==
|
|
@@ -23,5 +23,3 @@ function getExistingMeta(target) {
|
|
|
23
23
|
const meta = (0, _reflection.getMeta)(_const.CrucibleMeta.injecttoken, target) ?? new Map();
|
|
24
24
|
return meta;
|
|
25
25
|
}
|
|
26
|
-
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9kZWNvcmF0b3JzL2luamVjdC5kZWNvcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmaW5lTWV0YSwgZ2V0TWV0YSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgQ3J1Y2libGVNZXRhIH0gZnJvbSBcIi4uL2NvbnN0LmpzXCI7XG5cbmV4cG9ydCB0eXBlIEluamVjdGlvbk1ldGFkYXRhID0gTWFwPG51bWJlciwgSW5qZWN0aW9uVG9rZW4+O1xuXG5leHBvcnQgdHlwZSBJbmplY3Rpb25Ub2tlbiA9IHtcblx0a2V5OiBzdHJpbmcgfCBzeW1ib2w7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KGtleTogc3RyaW5nIHwgc3ltYm9sKSB7XG5cdHJldHVybiAodGFyZ2V0OiBvYmplY3QsIF9wcm9wZXJ0eUtleTogc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkLCBpZHg6IG51bWJlcikgPT4ge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZ2V0RXhpc3RpbmdNZXRhKHRhcmdldCk7XG5cdFx0bWV0YWRhdGEuc2V0KGlkeCwgeyBrZXkgfSk7XG5cdFx0ZGVmaW5lTWV0YShDcnVjaWJsZU1ldGEuaW5qZWN0dG9rZW4sIG1ldGFkYXRhLCB0YXJnZXQpO1xuXHR9O1xufVxuXG5mdW5jdGlvbiBnZXRFeGlzdGluZ01ldGEodGFyZ2V0OiBvYmplY3QpIHtcblx0Y29uc3QgbWV0YSA9XG5cdFx0Z2V0TWV0YTxNYXA8bnVtYmVyLCBJbmplY3Rpb25Ub2tlbj4+KENydWNpYmxlTWV0YS5pbmplY3R0b2tlbiwgdGFyZ2V0KSA/P1xuXHRcdG5ldyBNYXA8bnVtYmVyLCBJbmplY3Rpb25Ub2tlbj4oKTtcblx0cmV0dXJuIG1ldGE7XG59XG4iXSwibmFtZXMiOlsiaW5qZWN0Iiwia2V5IiwidGFyZ2V0IiwiX3Byb3BlcnR5S2V5IiwiaWR4IiwibWV0YWRhdGEiLCJnZXRFeGlzdGluZ01ldGEiLCJzZXQiLCJkZWZpbmVNZXRhIiwiQ3J1Y2libGVNZXRhIiwiaW5qZWN0dG9rZW4iLCJtZXRhIiwiZ2V0TWV0YSIsIk1hcCJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFTZ0JBOzs7ZUFBQUE7Ozs0QkFUb0I7dUJBQ1A7QUFRdEIsU0FBU0EsT0FBT0MsR0FBb0I7SUFDMUMsT0FBTyxDQUFDQyxRQUFnQkMsY0FBMkNDO1FBQ2xFLE1BQU1DLFdBQVdDLGdCQUFnQko7UUFDakNHLFNBQVNFLEdBQUcsQ0FBQ0gsS0FBSztZQUFFSDtRQUFJO1FBQ3hCTyxJQUFBQSxzQkFBVSxFQUFDQyxtQkFBWSxDQUFDQyxXQUFXLEVBQUVMLFVBQVVIO0lBQ2hEO0FBQ0Q7QUFFQSxTQUFTSSxnQkFBZ0JKLE1BQWM7SUFDdEMsTUFBTVMsT0FDTEMsSUFBQUEsbUJBQU8sRUFBOEJILG1CQUFZLENBQUNDLFdBQVcsRUFBRVIsV0FDL0QsSUFBSVc7SUFDTCxPQUFPRjtBQUNSIn0=
|
|
@@ -12,5 +12,3 @@ function injectable() {
|
|
|
12
12
|
// no implementation for now. Just used to ensure reflect metadata is generated
|
|
13
13
|
return ()=>{};
|
|
14
14
|
}
|
|
15
|
-
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9kZWNvcmF0b3JzL2luamVjdGFibGUuZGVjdG9yYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZSgpOiBDbGFzc0RlY29yYXRvciB7XG5cdC8vIG5vIGltcGxlbWVudGF0aW9uIGZvciBub3cuIEp1c3QgdXNlZCB0byBlbnN1cmUgcmVmbGVjdCBtZXRhZGF0YSBpcyBnZW5lcmF0ZWRcblx0cmV0dXJuICgpID0+IHt9O1xufVxuIl0sIm5hbWVzIjpbImluamVjdGFibGUiXSwibWFwcGluZ3MiOiI7Ozs7K0JBQWdCQTs7O2VBQUFBOzs7QUFBVCxTQUFTQTtJQUNmLCtFQUErRTtJQUMvRSxPQUFPLEtBQU87QUFDZiJ9
|
package/commonjs/src/index.js
CHANGED
|
@@ -18,5 +18,3 @@ function _export_star(from, to) {
|
|
|
18
18
|
});
|
|
19
19
|
return from;
|
|
20
20
|
}
|
|
21
|
-
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9jb25zdC5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2VydmljZXMvaW5kZXguanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzL2luZGV4LmpzXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztxQkFBYztxQkFDQTtxQkFDQSJ9
|
|
@@ -27,5 +27,3 @@ class RegistrationKey {
|
|
|
27
27
|
return this.value;
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9tb2RlbHMvcmVnaXN0cmF0aW9uLWtleS5tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdGFibGUgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL3JlZmxlY3Rpb25cIjtcblxuZXhwb3J0IGNsYXNzIFJlZ2lzdHJhdGlvbktleSB7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihrZXk6IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdGFibGUpIHtcblx0XHR0aGlzLnZhbHVlID0gdGhpcy5nZXRWYWx1ZShrZXkpO1xuXHR9XG5cblx0cHVibGljIHZhbHVlOiBzdHJpbmc7XG5cblx0cHJpdmF0ZSBnZXRWYWx1ZShrZXk6IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdGFibGUpOiBzdHJpbmcge1xuXHRcdHN3aXRjaCAodHlwZW9mIGtleSkge1xuXHRcdFx0Y2FzZSBcInN0cmluZ1wiOlxuXHRcdFx0XHRyZXR1cm4ga2V5O1xuXHRcdFx0Y2FzZSBcInN5bWJvbFwiOlxuXHRcdFx0XHRyZXR1cm4ga2V5LnZhbHVlT2YoKS5kZXNjcmlwdGlvbjtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBrZXkubmFtZTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgdG9TdHJpbmcoKSB7XG5cdFx0cmV0dXJuIHRoaXMudmFsdWU7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJSZWdpc3RyYXRpb25LZXkiLCJrZXkiLCJ2YWx1ZSIsImdldFZhbHVlIiwidmFsdWVPZiIsImRlc2NyaXB0aW9uIiwibmFtZSIsInRvU3RyaW5nIl0sIm1hcHBpbmdzIjoiOzs7OytCQUVhQTs7O2VBQUFBOzs7QUFBTixNQUFNQTtJQUNaLFlBQW1CQyxHQUFvQyxDQUFFO1FBQ3hELElBQUksQ0FBQ0MsS0FBSyxHQUFHLElBQUksQ0FBQ0MsUUFBUSxDQUFDRjtJQUM1QjtJQUVPQyxNQUFjO0lBRWJDLFNBQVNGLEdBQW9DLEVBQVU7UUFDOUQsT0FBUSxPQUFPQTtZQUNkLEtBQUs7Z0JBQ0osT0FBT0E7WUFDUixLQUFLO2dCQUNKLE9BQU9BLElBQUlHLE9BQU8sR0FBR0MsV0FBVztZQUNqQztnQkFDQyxPQUFPSixJQUFJSyxJQUFJO1FBQ2pCO0lBQ0Q7SUFFT0MsV0FBVztRQUNqQixPQUFPLElBQUksQ0FBQ0wsS0FBSztJQUNsQjtBQUNEIn0=
|
|
@@ -19,12 +19,7 @@ class ServiceRegistration {
|
|
|
19
19
|
this.scope = scope;
|
|
20
20
|
this.isInstance = isInstance;
|
|
21
21
|
}
|
|
22
|
-
isEqual(other) {
|
|
23
|
-
if (other.isInstance) {
|
|
24
|
-
return false;
|
|
25
|
-
}
|
|
22
|
+
/** Same class, or the same instance object. */ isEqual(other) {
|
|
26
23
|
return this.type === other.type;
|
|
27
24
|
}
|
|
28
25
|
}
|
|
29
|
-
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9tb2RlbHMvc2VydmljZS1yZWdpc3RyYXRpb24ubW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RhYmxlLCBGdW5jdGlvblR5cGUgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgU2NvcGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXMuanNcIjtcbmltcG9ydCB0eXBlIHsgUmVnaXN0cmF0aW9uS2V5IH0gZnJvbSBcIi4vcmVnaXN0cmF0aW9uLWtleS5tb2RlbC5qc1wiO1xuXG5leHBvcnQgY2xhc3MgU2VydmljZVJlZ2lzdHJhdGlvbiB7XG5cdHB1YmxpYyBrZXk6IFJlZ2lzdHJhdGlvbktleTtcblx0cHVibGljIHNjb3BlOiBTY29wZTtcblx0cHVibGljIHR5cGU6IENvbnN0cnVjdGFibGUgfCBGdW5jdGlvblR5cGUgfCBvYmplY3Q7XG5cdHB1YmxpYyBpc0luc3RhbmNlOiBib29sZWFuO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihcblx0XHRrZXk6IFJlZ2lzdHJhdGlvbktleSxcblx0XHR0eXBlOiBDb25zdHJ1Y3RhYmxlIHwgRnVuY3Rpb25UeXBlIHwgb2JqZWN0LFxuXHRcdHNjb3BlOiBTY29wZSxcblx0XHRpc0luc3RhbmNlOiBib29sZWFuLFxuXHQpIHtcblx0XHR0aGlzLmtleSA9IGtleTtcblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xuXHRcdHRoaXMuc2NvcGUgPSBzY29wZTtcblx0XHR0aGlzLmlzSW5zdGFuY2UgPSBpc0luc3RhbmNlO1xuXHR9XG5cblx0cHVibGljIGlzRXF1YWwob3RoZXI6IFNlcnZpY2VSZWdpc3RyYXRpb24pIHtcblx0XHRpZiAob3RoZXIuaXNJbnN0YW5jZSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnR5cGUgPT09IG90aGVyLnR5cGU7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJTZXJ2aWNlUmVnaXN0cmF0aW9uIiwia2V5Iiwic2NvcGUiLCJ0eXBlIiwiaXNJbnN0YW5jZSIsImlzRXF1YWwiLCJvdGhlciJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFJYUE7OztlQUFBQTs7O0FBQU4sTUFBTUE7SUFDTEMsSUFBcUI7SUFDckJDLE1BQWE7SUFDYkMsS0FBNEM7SUFDNUNDLFdBQW9CO0lBRTNCLFlBQ0NILEdBQW9CLEVBQ3BCRSxJQUEyQyxFQUMzQ0QsS0FBWSxFQUNaRSxVQUFtQixDQUNsQjtRQUNELElBQUksQ0FBQ0gsR0FBRyxHQUFHQTtRQUNYLElBQUksQ0FBQ0UsSUFBSSxHQUFHQTtRQUNaLElBQUksQ0FBQ0QsS0FBSyxHQUFHQTtRQUNiLElBQUksQ0FBQ0UsVUFBVSxHQUFHQTtJQUNuQjtJQUVPQyxRQUFRQyxLQUEwQixFQUFFO1FBQzFDLElBQUlBLE1BQU1GLFVBQVUsRUFBRTtZQUNyQixPQUFPO1FBQ1I7UUFFQSxPQUFPLElBQUksQ0FBQ0QsSUFBSSxLQUFLRyxNQUFNSCxJQUFJO0lBQ2hDO0FBQ0QifQ==
|
|
@@ -16,53 +16,52 @@ class CrucibleBuilder {
|
|
|
16
16
|
constructor(options){
|
|
17
17
|
this.serviceRegistry = options?.serviceRegistry ?? new _serviceregistry.ServiceRegistry();
|
|
18
18
|
}
|
|
19
|
+
get override() {
|
|
20
|
+
return this.createRegistrar(true);
|
|
21
|
+
}
|
|
19
22
|
registerType(type, scope = _const.Scopes.transient) {
|
|
20
|
-
|
|
21
|
-
typeOrKey: type.name,
|
|
22
|
-
typeOrInstance: type
|
|
23
|
-
});
|
|
24
|
-
return registration;
|
|
23
|
+
return this.register(false)(scope)(type.name, type);
|
|
25
24
|
}
|
|
26
25
|
registerTypes(scopeOrType, ...types) {
|
|
27
|
-
|
|
28
|
-
const isScope = typeof scopeOrType !== "function";
|
|
29
|
-
const scope = isScope ? scopeOrType : _const.Scopes.transient;
|
|
30
|
-
const allTypes = isScope ? types : [
|
|
31
|
-
scopeOrType,
|
|
32
|
-
...types
|
|
33
|
-
];
|
|
34
|
-
for (const type of allTypes){
|
|
35
|
-
const registration = this.registerType(type, scope);
|
|
36
|
-
registrations.push(registration);
|
|
37
|
-
}
|
|
38
|
-
return registrations;
|
|
26
|
+
return this.registerMany(false, scopeOrType, types);
|
|
39
27
|
}
|
|
40
28
|
registerTransient(typeOrKey, type) {
|
|
41
|
-
|
|
42
|
-
typeOrKey,
|
|
43
|
-
typeOrInstance: type
|
|
44
|
-
});
|
|
45
|
-
return registration;
|
|
29
|
+
return this.register(false)(_const.Scopes.transient)(typeOrKey, type);
|
|
46
30
|
}
|
|
47
31
|
registerSingleton(typeOrKey, typeOrInstance) {
|
|
48
|
-
|
|
49
|
-
typeOrKey,
|
|
50
|
-
typeOrInstance
|
|
51
|
-
});
|
|
52
|
-
return registration;
|
|
32
|
+
return this.register(false)(_const.Scopes.singleton)(typeOrKey, typeOrInstance);
|
|
53
33
|
}
|
|
54
34
|
registerRequestScoped(typeOrKey, type) {
|
|
55
|
-
|
|
56
|
-
typeOrKey,
|
|
57
|
-
typeOrInstance: type
|
|
58
|
-
});
|
|
59
|
-
return registration;
|
|
35
|
+
return this.register(false)(_const.Scopes.request)(typeOrKey, type);
|
|
60
36
|
}
|
|
61
37
|
build() {
|
|
62
38
|
return new _crucible.Crucible({
|
|
63
39
|
serviceRegistry: this.serviceRegistry
|
|
64
40
|
});
|
|
65
41
|
}
|
|
42
|
+
register = (override)=>(scope)=>(typeOrKey, typeOrInstance)=>this.serviceRegistry.registerType(scope, {
|
|
43
|
+
typeOrKey,
|
|
44
|
+
typeOrInstance,
|
|
45
|
+
override
|
|
46
|
+
});
|
|
47
|
+
registerMany(override, scopeOrType, types) {
|
|
48
|
+
const bind = this.register(override);
|
|
49
|
+
const isScope = typeof scopeOrType !== "function";
|
|
50
|
+
const scope = isScope ? scopeOrType : _const.Scopes.transient;
|
|
51
|
+
const allTypes = isScope ? types : [
|
|
52
|
+
scopeOrType,
|
|
53
|
+
...types
|
|
54
|
+
];
|
|
55
|
+
return allTypes.map((type)=>bind(scope)(type.name, type));
|
|
56
|
+
}
|
|
57
|
+
createRegistrar(override) {
|
|
58
|
+
const bind = this.register(override);
|
|
59
|
+
return {
|
|
60
|
+
registerType: (type, scope = _const.Scopes.transient)=>bind(scope)(type.name, type),
|
|
61
|
+
registerTypes: (scopeOrType, ...types)=>this.registerMany(override, scopeOrType, types),
|
|
62
|
+
registerTransient: (typeOrKey, type)=>bind(_const.Scopes.transient)(typeOrKey, type),
|
|
63
|
+
registerSingleton: (typeOrKey, typeOrInstance)=>bind(_const.Scopes.singleton)(typeOrKey, typeOrInstance),
|
|
64
|
+
registerRequestScoped: (typeOrKey, type)=>bind(_const.Scopes.request)(typeOrKey, type)
|
|
65
|
+
};
|
|
66
|
+
}
|
|
66
67
|
}
|
|
67
|
-
|
|
68
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9zZXJ2aWNlcy9jcnVjaWJsZS1idWlsZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29uc3RydWN0YWJsZSwgRnVuY3Rpb25UeXBlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBTY29wZXMgfSBmcm9tIFwiLi4vY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgU2VydmljZVJlZ2lzdHJhdGlvbiB9IGZyb20gXCIuLi9tb2RlbHMvc2VydmljZS1yZWdpc3RyYXRpb24ubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgQ29udGFpbmVyQnVpbGRlciwgU2NvcGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXMuanNcIjtcbmltcG9ydCB7IENydWNpYmxlIH0gZnJvbSBcIi4vY3J1Y2libGUuanNcIjtcbmltcG9ydCB7IFNlcnZpY2VSZWdpc3RyeSB9IGZyb20gXCIuL3NlcnZpY2UtcmVnaXN0cnkuanNcIjtcblxudHlwZSBDb250YWluZXJCdWlsZGVyT3B0aW9ucyA9IHtcblx0c2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnk7XG59O1xuXG5leHBvcnQgY2xhc3MgQ3J1Y2libGVCdWlsZGVyIGltcGxlbWVudHMgQ29udGFpbmVyQnVpbGRlciB7XG5cdHByaXZhdGUgc2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnk7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zPzogQ29udGFpbmVyQnVpbGRlck9wdGlvbnMpIHtcblx0XHR0aGlzLnNlcnZpY2VSZWdpc3RyeSA9IG9wdGlvbnM/LnNlcnZpY2VSZWdpc3RyeSA/PyBuZXcgU2VydmljZVJlZ2lzdHJ5KCk7XG5cdH1cblxuXHRwdWJsaWMgcmVnaXN0ZXJUeXBlKHR5cGU6IENvbnN0cnVjdGFibGUsIHNjb3BlOiBTY29wZSA9IFNjb3Blcy50cmFuc2llbnQpIHtcblx0XHRjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLnNlcnZpY2VSZWdpc3RyeS5yZWdpc3RlclR5cGUoc2NvcGUsIHtcblx0XHRcdHR5cGVPcktleTogdHlwZS5uYW1lLFxuXHRcdFx0dHlwZU9ySW5zdGFuY2U6IHR5cGUsXG5cdFx0fSk7XG5cdFx0cmV0dXJuIHJlZ2lzdHJhdGlvbjtcblx0fVxuXG5cdHB1YmxpYyByZWdpc3RlclR5cGVzKC4uLnR5cGVzOiBDb25zdHJ1Y3RhYmxlW10pOiBTZXJ2aWNlUmVnaXN0cmF0aW9uW107XG5cdHB1YmxpYyByZWdpc3RlclR5cGVzKHNjb3BlOiBTY29wZSwgLi4udHlwZXM6IENvbnN0cnVjdGFibGVbXSk6IFNlcnZpY2VSZWdpc3RyYXRpb25bXTtcblx0cHVibGljIHJlZ2lzdGVyVHlwZXMoXG5cdFx0c2NvcGVPclR5cGU6IFNjb3BlIHwgQ29uc3RydWN0YWJsZSxcblx0XHQuLi50eXBlczogQ29uc3RydWN0YWJsZVtdXG5cdCk6IFNlcnZpY2VSZWdpc3RyYXRpb25bXSB7XG5cdFx0Y29uc3QgcmVnaXN0cmF0aW9ucyA9IEFycmF5Lm9mPFNlcnZpY2VSZWdpc3RyYXRpb24+KCk7XG5cblx0XHRjb25zdCBpc1Njb3BlID0gdHlwZW9mIHNjb3BlT3JUeXBlICE9PSBcImZ1bmN0aW9uXCI7XG5cdFx0Y29uc3Qgc2NvcGUgPSBpc1Njb3BlID8gc2NvcGVPclR5cGUgOiBTY29wZXMudHJhbnNpZW50O1xuXHRcdGNvbnN0IGFsbFR5cGVzID0gaXNTY29wZSA/IHR5cGVzIDogW3Njb3BlT3JUeXBlLCAuLi50eXBlc107XG5cdFx0Zm9yIChjb25zdCB0eXBlIG9mIGFsbFR5cGVzKSB7XG5cdFx0XHRjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLnJlZ2lzdGVyVHlwZSh0eXBlLCBzY29wZSk7XG5cdFx0XHRyZWdpc3RyYXRpb25zLnB1c2gocmVnaXN0cmF0aW9uKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVnaXN0cmF0aW9ucztcblx0fVxuXG5cdHB1YmxpYyByZWdpc3RlclRyYW5zaWVudChcblx0XHRrZXk6IHN0cmluZyB8IHN5bWJvbCxcblx0XHR0eXBlOiBDb25zdHJ1Y3RhYmxlIHwgRnVuY3Rpb25UeXBlLFxuXHQpOiBTZXJ2aWNlUmVnaXN0cmF0aW9uO1xuXHRwdWJsaWMgcmVnaXN0ZXJUcmFuc2llbnQodHlwZTogQ29uc3RydWN0YWJsZSk6IFNlcnZpY2VSZWdpc3RyYXRpb247XG5cdHB1YmxpYyByZWdpc3RlclRyYW5zaWVudCh0eXBlT3JLZXk6IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdGFibGUsIHR5cGU/OiBDb25zdHJ1Y3RhYmxlKSB7XG5cdFx0Y29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5zZXJ2aWNlUmVnaXN0cnkucmVnaXN0ZXJUeXBlKFNjb3Blcy50cmFuc2llbnQsIHtcblx0XHRcdHR5cGVPcktleSxcblx0XHRcdHR5cGVPckluc3RhbmNlOiB0eXBlLFxuXHRcdH0pO1xuXHRcdHJldHVybiByZWdpc3RyYXRpb247XG5cdH1cblxuXHRwdWJsaWMgcmVnaXN0ZXJTaW5nbGV0b24oXG5cdFx0a2V5OiBzdHJpbmcgfCBzeW1ib2wgfCBDb25zdHJ1Y3RhYmxlIHwgb2JqZWN0LFxuXHRcdGluc3RhbmNlOiBvYmplY3QsXG5cdCk6IFNlcnZpY2VSZWdpc3RyYXRpb247XG5cdHB1YmxpYyByZWdpc3RlclNpbmdsZXRvbihrZXk6IHN0cmluZyB8IHN5bWJvbCwgdHlwZTogQ29uc3RydWN0YWJsZSk6IFNlcnZpY2VSZWdpc3RyYXRpb247XG5cdHB1YmxpYyByZWdpc3RlclNpbmdsZXRvbih0eXBlOiBDb25zdHJ1Y3RhYmxlKTogU2VydmljZVJlZ2lzdHJhdGlvbjtcblx0cHVibGljIHJlZ2lzdGVyU2luZ2xldG9uKFxuXHRcdHR5cGVPcktleTogc3RyaW5nIHwgc3ltYm9sIHwgQ29uc3RydWN0YWJsZSxcblx0XHR0eXBlT3JJbnN0YW5jZT86IENvbnN0cnVjdGFibGUgfCBvYmplY3QsXG5cdCkge1xuXHRcdGNvbnN0IHJlZ2lzdHJhdGlvbiA9IHRoaXMuc2VydmljZVJlZ2lzdHJ5LnJlZ2lzdGVyVHlwZShTY29wZXMuc2luZ2xldG9uLCB7XG5cdFx0XHR0eXBlT3JLZXksXG5cdFx0XHR0eXBlT3JJbnN0YW5jZSxcblx0XHR9KTtcblx0XHRyZXR1cm4gcmVnaXN0cmF0aW9uO1xuXHR9XG5cblx0cHVibGljIHJlZ2lzdGVyUmVxdWVzdFNjb3BlZDxUPih0eXBlOiAoKSA9PiBUKTogU2VydmljZVJlZ2lzdHJhdGlvbjtcblx0cHVibGljIHJlZ2lzdGVyUmVxdWVzdFNjb3BlZDxUPihrZXk6IHN0cmluZyB8IHN5bWJvbCwgdHlwZTogKCkgPT4gVCk6IFNlcnZpY2VSZWdpc3RyYXRpb247XG5cdHB1YmxpYyByZWdpc3RlclJlcXVlc3RTY29wZWQoa2V5OiBzdHJpbmcgfCBzeW1ib2wsIHR5cGU6IENvbnN0cnVjdGFibGUpOiBTZXJ2aWNlUmVnaXN0cmF0aW9uO1xuXHRwdWJsaWMgcmVnaXN0ZXJSZXF1ZXN0U2NvcGVkKHR5cGU6IENvbnN0cnVjdGFibGUpOiBTZXJ2aWNlUmVnaXN0cmF0aW9uO1xuXHRwdWJsaWMgcmVnaXN0ZXJSZXF1ZXN0U2NvcGVkKFxuXHRcdHR5cGVPcktleTogc3RyaW5nIHwgc3ltYm9sIHwgQ29uc3RydWN0YWJsZSB8IEZ1bmN0aW9uVHlwZSxcblx0XHR0eXBlPzogQ29uc3RydWN0YWJsZSB8IEZ1bmN0aW9uVHlwZSxcblx0KSB7XG5cdFx0Y29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5zZXJ2aWNlUmVnaXN0cnkucmVnaXN0ZXJUeXBlKFNjb3Blcy5yZXF1ZXN0LCB7XG5cdFx0XHR0eXBlT3JLZXksXG5cdFx0XHR0eXBlT3JJbnN0YW5jZTogdHlwZSxcblx0XHR9KTtcblx0XHRyZXR1cm4gcmVnaXN0cmF0aW9uO1xuXHR9XG5cblx0cHVibGljIGJ1aWxkKCk6IENydWNpYmxlIHtcblx0XHRyZXR1cm4gbmV3IENydWNpYmxlKHsgc2VydmljZVJlZ2lzdHJ5OiB0aGlzLnNlcnZpY2VSZWdpc3RyeSB9KTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkNydWNpYmxlQnVpbGRlciIsInNlcnZpY2VSZWdpc3RyeSIsIm9wdGlvbnMiLCJTZXJ2aWNlUmVnaXN0cnkiLCJyZWdpc3RlclR5cGUiLCJ0eXBlIiwic2NvcGUiLCJTY29wZXMiLCJ0cmFuc2llbnQiLCJyZWdpc3RyYXRpb24iLCJ0eXBlT3JLZXkiLCJuYW1lIiwidHlwZU9ySW5zdGFuY2UiLCJyZWdpc3RlclR5cGVzIiwic2NvcGVPclR5cGUiLCJ0eXBlcyIsInJlZ2lzdHJhdGlvbnMiLCJBcnJheSIsIm9mIiwiaXNTY29wZSIsImFsbFR5cGVzIiwicHVzaCIsInJlZ2lzdGVyVHJhbnNpZW50IiwicmVnaXN0ZXJTaW5nbGV0b24iLCJzaW5nbGV0b24iLCJyZWdpc3RlclJlcXVlc3RTY29wZWQiLCJyZXF1ZXN0IiwiYnVpbGQiLCJDcnVjaWJsZSJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFXYUE7OztlQUFBQTs7O3VCQVZVOzBCQUdFO2lDQUNPO0FBTXpCLE1BQU1BO0lBQ0pDLGdCQUFpQztJQUN6QyxZQUFtQkMsT0FBaUMsQ0FBRTtRQUNyRCxJQUFJLENBQUNELGVBQWUsR0FBR0MsU0FBU0QsbUJBQW1CLElBQUlFLGdDQUFlO0lBQ3ZFO0lBRU9DLGFBQWFDLElBQW1CLEVBQUVDLFFBQWVDLGFBQU0sQ0FBQ0MsU0FBUyxFQUFFO1FBQ3pFLE1BQU1DLGVBQWUsSUFBSSxDQUFDUixlQUFlLENBQUNHLFlBQVksQ0FBQ0UsT0FBTztZQUM3REksV0FBV0wsS0FBS00sSUFBSTtZQUNwQkMsZ0JBQWdCUDtRQUNqQjtRQUNBLE9BQU9JO0lBQ1I7SUFJT0ksY0FDTkMsV0FBa0MsRUFDbEMsR0FBR0MsS0FBc0IsRUFDRDtRQUN4QixNQUFNQyxnQkFBZ0JDLE1BQU1DLEVBQUU7UUFFOUIsTUFBTUMsVUFBVSxPQUFPTCxnQkFBZ0I7UUFDdkMsTUFBTVIsUUFBUWEsVUFBVUwsY0FBY1AsYUFBTSxDQUFDQyxTQUFTO1FBQ3RELE1BQU1ZLFdBQVdELFVBQVVKLFFBQVE7WUFBQ0Q7ZUFBZ0JDO1NBQU07UUFDMUQsS0FBSyxNQUFNVixRQUFRZSxTQUFVO1lBQzVCLE1BQU1YLGVBQWUsSUFBSSxDQUFDTCxZQUFZLENBQUNDLE1BQU1DO1lBQzdDVSxjQUFjSyxJQUFJLENBQUNaO1FBQ3BCO1FBRUEsT0FBT087SUFDUjtJQU9PTSxrQkFBa0JaLFNBQTBDLEVBQUVMLElBQW9CLEVBQUU7UUFDMUYsTUFBTUksZUFBZSxJQUFJLENBQUNSLGVBQWUsQ0FBQ0csWUFBWSxDQUFDRyxhQUFNLENBQUNDLFNBQVMsRUFBRTtZQUN4RUU7WUFDQUUsZ0JBQWdCUDtRQUNqQjtRQUNBLE9BQU9JO0lBQ1I7SUFRT2Msa0JBQ05iLFNBQTBDLEVBQzFDRSxjQUF1QyxFQUN0QztRQUNELE1BQU1ILGVBQWUsSUFBSSxDQUFDUixlQUFlLENBQUNHLFlBQVksQ0FBQ0csYUFBTSxDQUFDaUIsU0FBUyxFQUFFO1lBQ3hFZDtZQUNBRTtRQUNEO1FBQ0EsT0FBT0g7SUFDUjtJQU1PZ0Isc0JBQ05mLFNBQXlELEVBQ3pETCxJQUFtQyxFQUNsQztRQUNELE1BQU1JLGVBQWUsSUFBSSxDQUFDUixlQUFlLENBQUNHLFlBQVksQ0FBQ0csYUFBTSxDQUFDbUIsT0FBTyxFQUFFO1lBQ3RFaEI7WUFDQUUsZ0JBQWdCUDtRQUNqQjtRQUNBLE9BQU9JO0lBQ1I7SUFFT2tCLFFBQWtCO1FBQ3hCLE9BQU8sSUFBSUMsa0JBQVEsQ0FBQztZQUFFM0IsaUJBQWlCLElBQUksQ0FBQ0EsZUFBZTtRQUFDO0lBQzdEO0FBQ0QifQ==
|
|
@@ -18,6 +18,7 @@ class Crucible {
|
|
|
18
18
|
key;
|
|
19
19
|
instances = new Map();
|
|
20
20
|
serviceRegistry;
|
|
21
|
+
parent;
|
|
21
22
|
rootScope;
|
|
22
23
|
scopes = new Map();
|
|
23
24
|
logger = _scribe.scribe.logger(Crucible.name);
|
|
@@ -26,7 +27,8 @@ class Crucible {
|
|
|
26
27
|
this.key = options?.key;
|
|
27
28
|
this.serviceRegistry = new _serviceregistry.ServiceRegistry(options?.serviceRegistry);
|
|
28
29
|
this.registerLifetimeScope();
|
|
29
|
-
this.
|
|
30
|
+
this.parent = options?.parent;
|
|
31
|
+
this.rootScope = options?.parent?.rootScope ?? this;
|
|
30
32
|
}
|
|
31
33
|
resolveMany(resolveRequest) {
|
|
32
34
|
const key = new _registrationkeymodel.RegistrationKey(resolveRequest);
|
|
@@ -52,15 +54,20 @@ class Crucible {
|
|
|
52
54
|
return service;
|
|
53
55
|
}
|
|
54
56
|
beginScope(name) {
|
|
55
|
-
if (this.
|
|
57
|
+
if (this.isDisposed) {
|
|
58
|
+
throw new Error("This container has been disposed");
|
|
59
|
+
}
|
|
60
|
+
if (name != null && this.scopes.has(name)) {
|
|
56
61
|
throw new _errors.DuplicateScopeError(`Cannot create duplicate scope. Scope with ${name} is already created and has not been disposed.`);
|
|
57
62
|
}
|
|
58
63
|
const scope = new Crucible({
|
|
59
64
|
key: name,
|
|
60
65
|
serviceRegistry: this.serviceRegistry,
|
|
61
|
-
|
|
66
|
+
parent: this
|
|
62
67
|
});
|
|
63
|
-
|
|
68
|
+
if (name != null) {
|
|
69
|
+
this.scopes.set(name, scope);
|
|
70
|
+
}
|
|
64
71
|
return scope;
|
|
65
72
|
}
|
|
66
73
|
[Symbol.dispose]() {
|
|
@@ -80,7 +87,12 @@ class Crucible {
|
|
|
80
87
|
return;
|
|
81
88
|
}
|
|
82
89
|
this.isDisposed = true;
|
|
83
|
-
|
|
90
|
+
this.parent?.releaseScope(this.key);
|
|
91
|
+
this.scopes.clear();
|
|
92
|
+
// Reverse creation order: dependents are cleaned up before what they depend on.
|
|
93
|
+
for (const inst of [
|
|
94
|
+
...this.instances.values()
|
|
95
|
+
].reverse()){
|
|
84
96
|
if (inst === this) {
|
|
85
97
|
continue;
|
|
86
98
|
}
|
|
@@ -92,7 +104,12 @@ class Crucible {
|
|
|
92
104
|
return;
|
|
93
105
|
}
|
|
94
106
|
this.isDisposed = true;
|
|
95
|
-
|
|
107
|
+
this.parent?.releaseScope(this.key);
|
|
108
|
+
this.scopes.clear();
|
|
109
|
+
// Reverse creation order: dependents are cleaned up before what they depend on.
|
|
110
|
+
for (const inst of [
|
|
111
|
+
...this.instances.values()
|
|
112
|
+
].reverse()){
|
|
96
113
|
if (inst === this) {
|
|
97
114
|
continue;
|
|
98
115
|
}
|
|
@@ -120,10 +137,11 @@ class Crucible {
|
|
|
120
137
|
}
|
|
121
138
|
getOrCreateInstance(registration) {
|
|
122
139
|
if (this.isDisposed) {
|
|
123
|
-
throw new Error("This
|
|
140
|
+
throw new Error("This container has been disposed");
|
|
124
141
|
}
|
|
125
|
-
const {
|
|
126
|
-
|
|
142
|
+
const { type, isInstance } = registration;
|
|
143
|
+
// One cache entry per registration: an instance registration is its own entry.
|
|
144
|
+
const cacheKey = type;
|
|
127
145
|
const existingInstance = this.instances.get(cacheKey);
|
|
128
146
|
if (existingInstance != null) {
|
|
129
147
|
return existingInstance;
|
|
@@ -154,12 +172,16 @@ class Crucible {
|
|
|
154
172
|
}
|
|
155
173
|
return resolved;
|
|
156
174
|
}
|
|
175
|
+
releaseScope(name) {
|
|
176
|
+
if (name == null) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
this.scopes.delete(name);
|
|
180
|
+
}
|
|
157
181
|
registerLifetimeScope() {
|
|
158
|
-
this.serviceRegistry.
|
|
182
|
+
this.serviceRegistry.replaceType(_const.Scopes.request, {
|
|
159
183
|
typeOrKey: _const.LifetimeScopeToken,
|
|
160
184
|
typeOrInstance: this
|
|
161
185
|
});
|
|
162
186
|
}
|
|
163
187
|
}
|
|
164
|
-
|
|
165
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9zZXJ2aWNlcy9jcnVjaWJsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHR0eXBlIENvbnN0cnVjdGFibGUsXG5cdHR5cGUgRnVuY3Rpb25UeXBlLFxuXHRnZXRNZXRhLFxuXHRpc0FycmF5VHlwZSxcblx0aXNDb25zdHJ1Y3RhYmxlLFxuXHRSZWZsZWN0aW9uTWV0YSxcbn0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHsgQ3J1Y2libGVNZXRhLCBMaWZldGltZVNjb3BlVG9rZW4sIFNjb3BlcyB9IGZyb20gXCIuLi9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmplY3Rpb25NZXRhZGF0YSB9IGZyb20gXCIuLi9kZWNvcmF0b3JzL2luamVjdC5kZWNvcmF0b3IuanNcIjtcbmltcG9ydCB7IFJlZ2lzdHJhdGlvbktleSB9IGZyb20gXCIuLi9tb2RlbHMvcmVnaXN0cmF0aW9uLWtleS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlUmVnaXN0cmF0aW9uIH0gZnJvbSBcIi4uL21vZGVscy9zZXJ2aWNlLXJlZ2lzdHJhdGlvbi5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgRHVwbGljYXRlU2NvcGVFcnJvciwgUmVzb2x2ZUVycm9yIH0gZnJvbSBcIi4uL3R5cGVzL2Vycm9ycy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJQ29udGFpbmVyLCBMaWZldGltZVNjb3BlLCBSZXNvbHZlUmVxdWVzdCB9IGZyb20gXCIuLi90eXBlcy90eXBlcy5qc1wiO1xuaW1wb3J0IHsgU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSBcIi4vc2VydmljZS1yZWdpc3RyeS5qc1wiO1xuXG50eXBlIENydWNpYmxlT3B0aW9ucyA9IHtcblx0a2V5Pzogc3RyaW5nO1xuXHRyb290U2NvcGU/OiBDcnVjaWJsZTtcblx0c2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnk7XG59O1xuXG5leHBvcnQgY2xhc3MgQ3J1Y2libGUgaW1wbGVtZW50cyBJQ29udGFpbmVyIHtcblx0cHVibGljIGtleTogc3RyaW5nO1xuXHRwcm90ZWN0ZWQgaW5zdGFuY2VzID0gbmV3IE1hcDx1bmtub3duLCBvYmplY3Q+KCk7XG5cdHByaXZhdGUgc2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnk7XG5cdHByaXZhdGUgcm9vdFNjb3BlOiBDcnVjaWJsZTtcblx0cHJpdmF0ZSBzY29wZXMgPSBuZXcgTWFwPHN0cmluZywgTGlmZXRpbWVTY29wZT4oKTtcblx0cHJpdmF0ZSBsb2dnZXIgPSBzY3JpYmUubG9nZ2VyKENydWNpYmxlLm5hbWUpO1xuXHRwcml2YXRlIGlzRGlzcG9zZWQgPSBmYWxzZTtcblx0cHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBDcnVjaWJsZU9wdGlvbnMpIHtcblx0XHR0aGlzLmtleSA9IG9wdGlvbnM/LmtleTtcblx0XHR0aGlzLnNlcnZpY2VSZWdpc3RyeSA9IG5ldyBTZXJ2aWNlUmVnaXN0cnkob3B0aW9ucz8uc2VydmljZVJlZ2lzdHJ5KTtcblx0XHR0aGlzLnJlZ2lzdGVyTGlmZXRpbWVTY29wZSgpO1xuXHRcdHRoaXMucm9vdFNjb3BlID0gb3B0aW9ucz8ucm9vdFNjb3BlID8/IHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgcmVzb2x2ZU1hbnk8VCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ocmVzb2x2ZVJlcXVlc3Q6IFJlc29sdmVSZXF1ZXN0PFQ+KTogVFtdIHtcblx0XHRjb25zdCBrZXkgPSBuZXcgUmVnaXN0cmF0aW9uS2V5KHJlc29sdmVSZXF1ZXN0KTtcblx0XHRjb25zdCByZWdpc3RyYXRpb25zID0gdGhpcy5nZXRSZWdpc3RyYXRpb25Gcm9tKGtleSkgPz8gW107XG5cblx0XHRjb25zdCBzZXJ2aWNlcyA9IEFycmF5Lm9mPFQ+KCk7XG5cdFx0Zm9yIChjb25zdCByZWdpc3RyYXRpb24gb2YgcmVnaXN0cmF0aW9ucykge1xuXHRcdFx0Y29uc3Qgc2VydmljZSA9IHRoaXMucmVzb2x2ZVJlZ2lzdHJhdGlvbjxUPihyZWdpc3RyYXRpb24pO1xuXHRcdFx0c2VydmljZXMucHVzaChzZXJ2aWNlKTtcblx0XHR9XG5cdFx0cmV0dXJuIHNlcnZpY2VzO1xuXHR9XG5cblx0cHVibGljIHJlc29sdmU8VCBleHRlbmRzIG9iamVjdCB8IG9iamVjdFtdPihyZXNvbHZlUmVxdWVzdDogUmVzb2x2ZVJlcXVlc3Q8VD4pOiBUIHtcblx0XHRjb25zdCBrZXkgPSBuZXcgUmVnaXN0cmF0aW9uS2V5KHJlc29sdmVSZXF1ZXN0KTtcblx0XHRjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLmdldFJlZ2lzdHJhdGlvbkZyb20oa2V5KTtcblx0XHRpZiAocmVnaXN0cmF0aW9uID09IG51bGwpIHtcblx0XHRcdHRoaXMubG9nZ2VyLndhcm4oYENhbm5vdCByZXNvbHZlIGRlcGVuZGVuY3kgJHtrZXkudG9TdHJpbmcoKX1gKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChyZWdpc3RyYXRpb24ubGVuZ3RoID4gMSkge1xuXHRcdFx0dGhyb3cgbmV3IFJlc29sdmVFcnJvcihcblx0XHRcdFx0YFRoZXJlIGFyZSBtdWx0aXBsZSBzZXJ2aWNlcyByZWdpc3RlcmVkIHdpdGgga2V5ICR7a2V5LnRvU3RyaW5nKCl9LiBVc2UgcmVzb2x2ZU1hbnkgdG8gcmVzb2x2ZSBhbGwgaW1wbGVtZW50YXRpb25zLmAsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNlcnZpY2UgPSB0aGlzLnJlc29sdmVSZWdpc3RyYXRpb248VD4ocmVnaXN0cmF0aW9uWzBdKTtcblx0XHRyZXR1cm4gc2VydmljZTtcblx0fVxuXG5cdHB1YmxpYyBiZWdpblNjb3BlKG5hbWU/OiBzdHJpbmcpIHtcblx0XHRpZiAodGhpcy5zY29wZXMuaGFzKG5hbWUpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRHVwbGljYXRlU2NvcGVFcnJvcihcblx0XHRcdFx0YENhbm5vdCBjcmVhdGUgZHVwbGljYXRlIHNjb3BlLiBTY29wZSB3aXRoICR7bmFtZX0gaXMgYWxyZWFkeSBjcmVhdGVkIGFuZCBoYXMgbm90IGJlZW4gZGlzcG9zZWQuYCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc2NvcGUgPSBuZXcgQ3J1Y2libGUoe1xuXHRcdFx0a2V5OiBuYW1lLFxuXHRcdFx0c2VydmljZVJlZ2lzdHJ5OiB0aGlzLnNlcnZpY2VSZWdpc3RyeSxcblx0XHRcdHJvb3RTY29wZTogdGhpcyxcblx0XHR9KTtcblxuXHRcdHRoaXMuc2NvcGVzLnNldChuYW1lLCBzY29wZSk7XG5cdFx0cmV0dXJuIHNjb3BlO1xuXHR9XG5cblx0cHVibGljIFtTeW1ib2wuZGlzcG9zZV0oKSB7XG5cdFx0aWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLmRpc3Bvc2VTeW5jKCk7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkge1xuXHRcdGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0YXdhaXQgdGhpcy5kaXNwb3NlQXN5bmMoKTtcblx0fVxuXG5cdHByaXZhdGUgZGlzcG9zZVN5bmMoKSB7XG5cdFx0aWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG5cdFx0Zm9yIChjb25zdCBbLCBpbnN0XSBvZiB0aGlzLmluc3RhbmNlcykge1xuXHRcdFx0aWYgKGluc3QgPT09IHRoaXMpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRpbnN0W1N5bWJvbC5kaXNwb3NlXT8uKCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwb3NlQXN5bmMoKSB7XG5cdFx0aWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG5cdFx0Zm9yIChjb25zdCBbLCBpbnN0XSBvZiB0aGlzLmluc3RhbmNlcykge1xuXHRcdFx0aWYgKGluc3QgPT09IHRoaXMpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoU3ltYm9sLmFzeW5jRGlzcG9zZSBpbiBpbnN0KSB7XG5cdFx0XHRcdGF3YWl0IChpbnN0IGFzIEFzeW5jRGlzcG9zYWJsZSlbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdChpbnN0IGFzIFBhcnRpYWw8RGlzcG9zYWJsZT4pW1N5bWJvbC5kaXNwb3NlXT8uKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRSZWdpc3RyYXRpb25Gcm9tKGtleTogUmVnaXN0cmF0aW9uS2V5KSB7XG5cdFx0Y29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5zZXJ2aWNlUmVnaXN0cnkuZ2V0UmVnaXN0cmF0aW9uKGtleS52YWx1ZSk7XG5cdFx0cmV0dXJuIHJlZ2lzdHJhdGlvbjtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZVJlZ2lzdHJhdGlvbjxUIGV4dGVuZHMgb2JqZWN0PihyZWdpc3RyYXRpb246IFNlcnZpY2VSZWdpc3RyYXRpb24pOiBUIHtcblx0XHRjb25zdCB7IHNjb3BlIH0gPSByZWdpc3RyYXRpb247XG5cdFx0c3dpdGNoIChzY29wZSkge1xuXHRcdFx0Y2FzZSBTY29wZXMudHJhbnNpZW50OlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVJbnN0YW5jZShyZWdpc3RyYXRpb24pO1xuXHRcdFx0Y2FzZSBTY29wZXMuc2luZ2xldG9uOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5yb290U2NvcGUuZ2V0T3JDcmVhdGVJbnN0YW5jZShyZWdpc3RyYXRpb24pO1xuXHRcdFx0Y2FzZSBTY29wZXMucmVxdWVzdDpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0T3JDcmVhdGVJbnN0YW5jZShyZWdpc3RyYXRpb24pO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0T3JDcmVhdGVJbnN0YW5jZTxUIGV4dGVuZHMgb2JqZWN0PihyZWdpc3RyYXRpb246IFNlcnZpY2VSZWdpc3RyYXRpb24pOiBUIHtcblx0XHRpZiAodGhpcy5pc0Rpc3Bvc2VkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGNvbnRpbmVyIGhhcyBiZWVuIGRpc3Bvc2VkXCIpO1xuXHRcdH1cblx0XHRjb25zdCB7IGtleSwgdHlwZSwgaXNJbnN0YW5jZSB9ID0gcmVnaXN0cmF0aW9uO1xuXHRcdGNvbnN0IGNhY2hlS2V5ID0gaXNJbnN0YW5jZSA/IGtleS52YWx1ZSA6IHR5cGU7XG5cdFx0Y29uc3QgZXhpc3RpbmdJbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2VzLmdldChjYWNoZUtleSk7XG5cdFx0aWYgKGV4aXN0aW5nSW5zdGFuY2UgIT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGV4aXN0aW5nSW5zdGFuY2UgYXMgVDtcblx0XHR9XG5cblx0XHRjb25zdCBpbnN0YW5jZSA9IGlzSW5zdGFuY2UgPyAodHlwZSBhcyBUKSA6IHRoaXMuY3JlYXRlSW5zdGFuY2U8VD4ocmVnaXN0cmF0aW9uKTtcblx0XHR0aGlzLmluc3RhbmNlcy5zZXQoY2FjaGVLZXksIGluc3RhbmNlKTtcblx0XHRyZXR1cm4gaW5zdGFuY2U7XG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZUluc3RhbmNlPFQgZXh0ZW5kcyBvYmplY3Q+KHJlZ2lzdHJhdGlvbjogU2VydmljZVJlZ2lzdHJhdGlvbik6IFQge1xuXHRcdGNvbnN0IHR5cGUgPSByZWdpc3RyYXRpb24udHlwZSBhcyBDb25zdHJ1Y3RhYmxlIHwgRnVuY3Rpb25UeXBlO1xuXHRcdGNvbnN0IGNhbkNvbnN0cnVjdCA9IGlzQ29uc3RydWN0YWJsZSh0eXBlKTtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5yZXNvbHZlRGVwZW5kZW5jaWVzKHR5cGUpO1xuXHRcdGNvbnN0IGluc3QgPSAoY2FuQ29uc3RydWN0ID8gbmV3IHR5cGUoLi4uZGVwcykgOiB0eXBlKCkpIGFzIFQ7XG5cdFx0cmV0dXJuIGluc3Q7XG5cdH1cblxuXHRwcml2YXRlIHJlc29sdmVEZXBlbmRlbmNpZXModHlwZTogQ29uc3RydWN0YWJsZSB8IEZ1bmN0aW9uVHlwZSk6IHVua25vd25bXSB7XG5cdFx0Y29uc3QgcGFyYW1zID0gZ2V0TWV0YTxBcnJheTxDb25zdHJ1Y3RhYmxlPj4oUmVmbGVjdGlvbk1ldGEucGFyYW10eXBlcywgdHlwZSkgPz8gW107XG5cblx0XHRjb25zdCBpbmplY3RUb2tlbnMgPVxuXHRcdFx0Z2V0TWV0YTxJbmplY3Rpb25NZXRhZGF0YT4oQ3J1Y2libGVNZXRhLmluamVjdHRva2VuLCB0eXBlKSA/PyBuZXcgTWFwKCk7XG5cblx0XHQvL1RPRE86IHB1dCBhIHRyeSBjYXRjaCBoZXJlIHNvIHdlIGNhbiB0aHJvdyB0aGUgbmFtZSBvZiB0aGUgc2VydmljZVxuXHRcdGxldCByZXNvbHZlZCA9IFtdO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCB0b2tlbiA9IGluamVjdFRva2Vucy5nZXQoaSk/LmtleSA/PyBwYXJhbXNbaV0ubmFtZTtcblx0XHRcdGNvbnN0IGRlcCA9IGlzQXJyYXlUeXBlKHBhcmFtc1tpXSkgPyB0aGlzLnJlc29sdmVNYW55KHRva2VuKSA6IHRoaXMucmVzb2x2ZSh0b2tlbik7XG5cdFx0XHRyZXNvbHZlZCA9IFsuLi5yZXNvbHZlZCwgZGVwXTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc29sdmVkO1xuXHR9XG5cblx0cHJpdmF0ZSByZWdpc3RlckxpZmV0aW1lU2NvcGUoKSB7XG5cdFx0dGhpcy5zZXJ2aWNlUmVnaXN0cnkucmVnaXN0ZXJUeXBlKFNjb3Blcy5yZXF1ZXN0LCB7XG5cdFx0XHR0eXBlT3JLZXk6IExpZmV0aW1lU2NvcGVUb2tlbixcblx0XHRcdHR5cGVPckluc3RhbmNlOiB0aGlzLFxuXHRcdH0pO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiQ3J1Y2libGUiLCJrZXkiLCJpbnN0YW5jZXMiLCJNYXAiLCJzZXJ2aWNlUmVnaXN0cnkiLCJyb290U2NvcGUiLCJzY29wZXMiLCJsb2dnZXIiLCJzY3JpYmUiLCJuYW1lIiwiaXNEaXNwb3NlZCIsIm9wdGlvbnMiLCJTZXJ2aWNlUmVnaXN0cnkiLCJyZWdpc3RlckxpZmV0aW1lU2NvcGUiLCJyZXNvbHZlTWFueSIsInJlc29sdmVSZXF1ZXN0IiwiUmVnaXN0cmF0aW9uS2V5IiwicmVnaXN0cmF0aW9ucyIsImdldFJlZ2lzdHJhdGlvbkZyb20iLCJzZXJ2aWNlcyIsIkFycmF5Iiwib2YiLCJyZWdpc3RyYXRpb24iLCJzZXJ2aWNlIiwicmVzb2x2ZVJlZ2lzdHJhdGlvbiIsInB1c2giLCJyZXNvbHZlIiwid2FybiIsInRvU3RyaW5nIiwibGVuZ3RoIiwiUmVzb2x2ZUVycm9yIiwiYmVnaW5TY29wZSIsImhhcyIsIkR1cGxpY2F0ZVNjb3BlRXJyb3IiLCJzY29wZSIsInNldCIsIlN5bWJvbCIsImRpc3Bvc2UiLCJkaXNwb3NlU3luYyIsImFzeW5jRGlzcG9zZSIsImRpc3Bvc2VBc3luYyIsImluc3QiLCJnZXRSZWdpc3RyYXRpb24iLCJ2YWx1ZSIsIlNjb3BlcyIsInRyYW5zaWVudCIsImNyZWF0ZUluc3RhbmNlIiwic2luZ2xldG9uIiwiZ2V0T3JDcmVhdGVJbnN0YW5jZSIsInJlcXVlc3QiLCJFcnJvciIsInR5cGUiLCJpc0luc3RhbmNlIiwiY2FjaGVLZXkiLCJleGlzdGluZ0luc3RhbmNlIiwiZ2V0IiwiaW5zdGFuY2UiLCJjYW5Db25zdHJ1Y3QiLCJpc0NvbnN0cnVjdGFibGUiLCJkZXBzIiwicmVzb2x2ZURlcGVuZGVuY2llcyIsInBhcmFtcyIsImdldE1ldGEiLCJSZWZsZWN0aW9uTWV0YSIsInBhcmFtdHlwZXMiLCJpbmplY3RUb2tlbnMiLCJDcnVjaWJsZU1ldGEiLCJpbmplY3R0b2tlbiIsInJlc29sdmVkIiwiaSIsInRva2VuIiwiZGVwIiwiaXNBcnJheVR5cGUiLCJyZWdpc3RlclR5cGUiLCJ0eXBlT3JLZXkiLCJMaWZldGltZVNjb3BlVG9rZW4iLCJ0eXBlT3JJbnN0YW5jZSJdLCJtYXBwaW5ncyI6Ijs7OzsrQkF1QmFBOzs7ZUFBQUE7Ozs0QkFoQk47d0JBQ2dCO3VCQUNrQztzQ0FFekI7d0JBRWtCO2lDQUVsQjtBQVF6QixNQUFNQTtJQUNMQyxJQUFZO0lBQ1RDLFlBQVksSUFBSUMsTUFBdUI7SUFDekNDLGdCQUFpQztJQUNqQ0MsVUFBb0I7SUFDcEJDLFNBQVMsSUFBSUgsTUFBNkI7SUFDMUNJLFNBQVNDLGNBQU0sQ0FBQ0QsTUFBTSxDQUFDUCxTQUFTUyxJQUFJLEVBQUU7SUFDdENDLGFBQWEsTUFBTTtJQUMzQixZQUFtQkMsT0FBeUIsQ0FBRTtRQUM3QyxJQUFJLENBQUNWLEdBQUcsR0FBR1UsU0FBU1Y7UUFDcEIsSUFBSSxDQUFDRyxlQUFlLEdBQUcsSUFBSVEsZ0NBQWUsQ0FBQ0QsU0FBU1A7UUFDcEQsSUFBSSxDQUFDUyxxQkFBcUI7UUFDMUIsSUFBSSxDQUFDUixTQUFTLEdBQUdNLFNBQVNOLGFBQWEsSUFBSTtJQUM1QztJQUVPUyxZQUF1Q0MsY0FBaUMsRUFBTztRQUNyRixNQUFNZCxNQUFNLElBQUllLHFDQUFlLENBQUNEO1FBQ2hDLE1BQU1FLGdCQUFnQixJQUFJLENBQUNDLG1CQUFtQixDQUFDakIsUUFBUSxFQUFFO1FBRXpELE1BQU1rQixXQUFXQyxNQUFNQyxFQUFFO1FBQ3pCLEtBQUssTUFBTUMsZ0JBQWdCTCxjQUFlO1lBQ3pDLE1BQU1NLFVBQVUsSUFBSSxDQUFDQyxtQkFBbUIsQ0FBSUY7WUFDNUNILFNBQVNNLElBQUksQ0FBQ0Y7UUFDZjtRQUNBLE9BQU9KO0lBQ1I7SUFFT08sUUFBcUNYLGNBQWlDLEVBQUs7UUFDakYsTUFBTWQsTUFBTSxJQUFJZSxxQ0FBZSxDQUFDRDtRQUNoQyxNQUFNTyxlQUFlLElBQUksQ0FBQ0osbUJBQW1CLENBQUNqQjtR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
|
|
@@ -17,5 +17,3 @@ function _export_star(from, to) {
|
|
|
17
17
|
});
|
|
18
18
|
return from;
|
|
19
19
|
}
|
|
20
|
-
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9zZXJ2aWNlcy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9jcnVjaWJsZS5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY3J1Y2libGUtYnVpbGRlci5qc1wiO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQWM7cUJBQ0EifQ==
|