@navios/di 0.5.0 → 0.6.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/CHANGELOG.md +146 -0
- package/README.md +196 -219
- package/docs/README.md +69 -11
- package/docs/api-reference.md +281 -117
- package/docs/container.md +220 -56
- package/docs/examples/request-scope-example.mts +2 -2
- package/docs/factory.md +3 -8
- package/docs/getting-started.md +37 -8
- package/docs/migration.md +318 -37
- package/docs/request-contexts.md +263 -175
- package/docs/scopes.md +79 -42
- package/lib/browser/index.d.mts +1577 -0
- package/lib/browser/index.d.mts.map +1 -0
- package/lib/browser/index.mjs +3012 -0
- package/lib/browser/index.mjs.map +1 -0
- package/lib/index-S_qX2VLI.d.mts +1211 -0
- package/lib/index-S_qX2VLI.d.mts.map +1 -0
- package/lib/index-fKPuT65j.d.cts +1206 -0
- package/lib/index-fKPuT65j.d.cts.map +1 -0
- package/lib/index.cjs +389 -0
- package/lib/index.cjs.map +1 -0
- package/lib/index.d.cts +376 -0
- package/lib/index.d.cts.map +1 -0
- package/lib/index.d.mts +371 -78
- package/lib/index.d.mts.map +1 -0
- package/lib/index.mjs +325 -63
- package/lib/index.mjs.map +1 -1
- package/lib/testing/index.cjs +9 -0
- package/lib/testing/index.d.cts +2 -0
- package/lib/testing/index.d.mts +2 -2
- package/lib/testing/index.mjs +2 -72
- package/lib/testing-BMGmmxH7.cjs +2895 -0
- package/lib/testing-BMGmmxH7.cjs.map +1 -0
- package/lib/testing-DCXz8AJD.mjs +2655 -0
- package/lib/testing-DCXz8AJD.mjs.map +1 -0
- package/package.json +26 -4
- package/project.json +2 -2
- package/src/__tests__/async-local-storage.browser.spec.mts +240 -0
- package/src/__tests__/async-local-storage.spec.mts +333 -0
- package/src/__tests__/container.spec.mts +30 -25
- package/src/__tests__/e2e.browser.spec.mts +790 -0
- package/src/__tests__/e2e.spec.mts +1222 -0
- package/src/__tests__/errors.spec.mts +6 -6
- package/src/__tests__/factory.spec.mts +1 -1
- package/src/__tests__/get-injectors.spec.mts +1 -1
- package/src/__tests__/injectable.spec.mts +1 -1
- package/src/__tests__/injection-token.spec.mts +1 -1
- package/src/__tests__/library-findings.spec.mts +563 -0
- package/src/__tests__/registry.spec.mts +2 -2
- package/src/__tests__/request-scope.spec.mts +266 -274
- package/src/__tests__/service-instantiator.spec.mts +19 -17
- package/src/__tests__/service-locator-event-bus.spec.mts +9 -9
- package/src/__tests__/service-locator-manager.spec.mts +15 -15
- package/src/__tests__/service-locator.spec.mts +167 -244
- package/src/__tests__/unified-api.spec.mts +27 -27
- package/src/__type-tests__/factory.spec-d.mts +2 -2
- package/src/__type-tests__/inject.spec-d.mts +2 -2
- package/src/__type-tests__/injectable.spec-d.mts +1 -1
- package/src/browser.mts +16 -0
- package/src/container/container.mts +319 -0
- package/src/container/index.mts +2 -0
- package/src/container/scoped-container.mts +350 -0
- package/src/decorators/factory.decorator.mts +4 -4
- package/src/decorators/injectable.decorator.mts +5 -5
- package/src/errors/di-error.mts +13 -7
- package/src/errors/index.mts +0 -8
- package/src/index.mts +156 -15
- package/src/interfaces/container.interface.mts +82 -0
- package/src/interfaces/factory.interface.mts +2 -2
- package/src/interfaces/index.mts +1 -0
- package/src/internal/context/async-local-storage.mts +120 -0
- package/src/internal/context/factory-context.mts +18 -0
- package/src/internal/context/index.mts +3 -0
- package/src/{request-context-holder.mts → internal/context/request-context.mts} +40 -27
- package/src/internal/context/resolution-context.mts +63 -0
- package/src/internal/context/sync-local-storage.mts +51 -0
- package/src/internal/core/index.mts +5 -0
- package/src/internal/core/instance-resolver.mts +641 -0
- package/src/{service-instantiator.mts → internal/core/instantiator.mts} +31 -27
- package/src/internal/core/invalidator.mts +437 -0
- package/src/internal/core/service-locator.mts +202 -0
- package/src/{token-processor.mts → internal/core/token-processor.mts} +79 -60
- package/src/{base-instance-holder-manager.mts → internal/holder/base-holder-manager.mts} +91 -21
- package/src/internal/holder/holder-manager.mts +85 -0
- package/src/internal/holder/holder-storage.interface.mts +116 -0
- package/src/internal/holder/index.mts +6 -0
- package/src/internal/holder/instance-holder.mts +109 -0
- package/src/internal/holder/request-storage.mts +134 -0
- package/src/internal/holder/singleton-storage.mts +105 -0
- package/src/internal/index.mts +4 -0
- package/src/internal/lifecycle/circular-detector.mts +77 -0
- package/src/internal/lifecycle/index.mts +2 -0
- package/src/{service-locator-event-bus.mts → internal/lifecycle/lifecycle-event-bus.mts} +12 -5
- package/src/testing/__tests__/test-container.spec.mts +2 -2
- package/src/testing/test-container.mts +4 -4
- package/src/token/index.mts +2 -0
- package/src/{injection-token.mts → token/injection-token.mts} +1 -1
- package/src/{registry.mts → token/registry.mts} +1 -1
- package/src/utils/get-injectable-token.mts +1 -1
- package/src/utils/get-injectors.mts +32 -15
- package/src/utils/types.mts +1 -1
- package/tsdown.config.mts +67 -0
- package/lib/_tsup-dts-rollup.d.mts +0 -1283
- package/lib/_tsup-dts-rollup.d.ts +0 -1283
- package/lib/chunk-44F3LXW5.mjs +0 -2043
- package/lib/chunk-44F3LXW5.mjs.map +0 -1
- package/lib/index.d.ts +0 -78
- package/lib/index.js +0 -2127
- package/lib/index.js.map +0 -1
- package/lib/testing/index.d.ts +0 -2
- package/lib/testing/index.js +0 -2060
- package/lib/testing/index.js.map +0 -1
- package/lib/testing/index.mjs.map +0 -1
- package/src/container.mts +0 -227
- package/src/factory-context.mts +0 -8
- package/src/instance-resolver.mts +0 -559
- package/src/request-context-manager.mts +0 -149
- package/src/service-invalidator.mts +0 -429
- package/src/service-locator-instance-holder.mts +0 -70
- package/src/service-locator-manager.mts +0 -85
- package/src/service-locator.mts +0 -246
- package/tsup.config.mts +0 -12
- /package/src/{injector.mts → injectors.mts} +0 -0
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
2
2
|
|
|
3
|
-
import type { FactoryContext } from '../factory-context.mjs'
|
|
4
|
-
import type { FactoryRecord } from '../registry.mjs'
|
|
3
|
+
import type { FactoryContext } from '../internal/context/factory-context.mjs'
|
|
4
|
+
import type { FactoryRecord } from '../token/registry.mjs'
|
|
5
5
|
import type { Injectors } from '../utils/get-injectors.mjs'
|
|
6
6
|
|
|
7
7
|
import { InjectableScope, InjectableType } from '../enums/index.mjs'
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { DIError } from '../errors/index.mjs'
|
|
9
|
+
import { Instantiator } from '../internal/core/instantiator.mjs'
|
|
10
|
+
import { InjectionToken } from '../token/injection-token.mjs'
|
|
10
11
|
|
|
11
12
|
// Mock classes for testing
|
|
12
13
|
class TestService {
|
|
@@ -36,8 +37,8 @@ class TestFactoryWithoutCreate {
|
|
|
36
37
|
// Missing create method
|
|
37
38
|
}
|
|
38
39
|
|
|
39
|
-
describe('
|
|
40
|
-
let instantiator:
|
|
40
|
+
describe('Instantiator', () => {
|
|
41
|
+
let instantiator: Instantiator
|
|
41
42
|
let mockInjectors: Injectors
|
|
42
43
|
let mockContext: FactoryContext
|
|
43
44
|
let mockAddDestroyListener: ReturnType<typeof vi.fn>
|
|
@@ -56,10 +57,11 @@ describe('ServiceInstantiator', () => {
|
|
|
56
57
|
mockContext = {
|
|
57
58
|
inject: vi.fn(),
|
|
58
59
|
locator: {} as any,
|
|
60
|
+
// @ts-expect-error Test
|
|
59
61
|
addDestroyListener: mockAddDestroyListener,
|
|
60
62
|
}
|
|
61
63
|
|
|
62
|
-
instantiator = new
|
|
64
|
+
instantiator = new Instantiator(mockInjectors)
|
|
63
65
|
})
|
|
64
66
|
|
|
65
67
|
function createFactoryRecord<T>(
|
|
@@ -125,7 +127,7 @@ describe('ServiceInstantiator', () => {
|
|
|
125
127
|
const result = await instantiator.instantiateService(mockContext, record)
|
|
126
128
|
|
|
127
129
|
expect(result).toHaveLength(1)
|
|
128
|
-
expect(result[0]).toBeInstanceOf(
|
|
130
|
+
expect(result[0]).toBeInstanceOf(DIError)
|
|
129
131
|
expect(result[0]!.message).toContain('Unknown service type: Unknown')
|
|
130
132
|
})
|
|
131
133
|
|
|
@@ -146,8 +148,8 @@ describe('ServiceInstantiator', () => {
|
|
|
146
148
|
const result = await instantiator.instantiateService(mockContext, record)
|
|
147
149
|
|
|
148
150
|
expect(result).toHaveLength(1)
|
|
149
|
-
expect(result[0]).toBeInstanceOf(
|
|
150
|
-
expect(result[0]!.message).toBe('Constructor error')
|
|
151
|
+
expect(result[0]).toBeInstanceOf(DIError)
|
|
152
|
+
expect(result[0]!.message).toBe('Error: Constructor error')
|
|
151
153
|
})
|
|
152
154
|
})
|
|
153
155
|
|
|
@@ -236,7 +238,7 @@ describe('ServiceInstantiator', () => {
|
|
|
236
238
|
const result = await instantiator.instantiateService(mockContext, record)
|
|
237
239
|
|
|
238
240
|
expect(result).toHaveLength(1)
|
|
239
|
-
expect(result[0]).toBeInstanceOf(
|
|
241
|
+
expect(result[0]).toBeInstanceOf(DIError)
|
|
240
242
|
expect(result[0]!.message).toContain('cannot be instantiated')
|
|
241
243
|
})
|
|
242
244
|
|
|
@@ -265,7 +267,7 @@ describe('ServiceInstantiator', () => {
|
|
|
265
267
|
const result = await instantiator.instantiateService(mockContext, record)
|
|
266
268
|
|
|
267
269
|
expect(result).toHaveLength(1)
|
|
268
|
-
expect(result[0]).toBeInstanceOf(
|
|
270
|
+
expect(result[0]).toBeInstanceOf(DIError)
|
|
269
271
|
expect(result[0]!.message).toContain('cannot be instantiated')
|
|
270
272
|
expect(consoleSpy).toHaveBeenCalledWith(
|
|
271
273
|
expect.stringContaining("has problem with it's definition"),
|
|
@@ -302,7 +304,7 @@ describe('ServiceInstantiator', () => {
|
|
|
302
304
|
const result = await instantiator.instantiateService(mockContext, record)
|
|
303
305
|
|
|
304
306
|
expect(result).toHaveLength(1)
|
|
305
|
-
expect(result[0]).toBeInstanceOf(
|
|
307
|
+
expect(result[0]).toBeInstanceOf(DIError)
|
|
306
308
|
expect(result[0]!.message).toContain(
|
|
307
309
|
'does not implement the create method',
|
|
308
310
|
)
|
|
@@ -354,7 +356,7 @@ describe('ServiceInstantiator', () => {
|
|
|
354
356
|
const result = await instantiator.instantiateService(mockContext, record)
|
|
355
357
|
|
|
356
358
|
expect(result).toHaveLength(1)
|
|
357
|
-
expect(result[0]).toBeInstanceOf(
|
|
359
|
+
expect(result[0]).toBeInstanceOf(DIError)
|
|
358
360
|
expect(result[0]!.message).toContain('cannot be instantiated')
|
|
359
361
|
})
|
|
360
362
|
|
|
@@ -376,7 +378,7 @@ describe('ServiceInstantiator', () => {
|
|
|
376
378
|
const result = await instantiator.instantiateService(mockContext, record)
|
|
377
379
|
|
|
378
380
|
expect(result).toHaveLength(1)
|
|
379
|
-
expect(result[0]).toBeInstanceOf(
|
|
381
|
+
expect(result[0]).toBeInstanceOf(DIError)
|
|
380
382
|
expect(consoleSpy).toHaveBeenCalledWith(
|
|
381
383
|
expect.stringContaining('asyncInject instead of inject'),
|
|
382
384
|
)
|
|
@@ -401,8 +403,8 @@ describe('ServiceInstantiator', () => {
|
|
|
401
403
|
const result = await instantiator.instantiateService(mockContext, record)
|
|
402
404
|
|
|
403
405
|
expect(result).toHaveLength(1)
|
|
404
|
-
expect(result[0]).toBeInstanceOf(
|
|
405
|
-
expect(result[0]!.message).toBe('Factory create error')
|
|
406
|
+
expect(result[0]).toBeInstanceOf(DIError)
|
|
407
|
+
expect(result[0]!.message).toBe('Error: Factory create error')
|
|
406
408
|
})
|
|
407
409
|
})
|
|
408
410
|
})
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { LifecycleEventBus } from '../internal/lifecycle/lifecycle-event-bus.mjs'
|
|
4
4
|
|
|
5
|
-
describe('
|
|
6
|
-
let eventBus:
|
|
5
|
+
describe('LifecycleEventBus', () => {
|
|
6
|
+
let eventBus: LifecycleEventBus
|
|
7
7
|
let mockLogger: Console
|
|
8
8
|
|
|
9
9
|
beforeEach(() => {
|
|
@@ -11,12 +11,12 @@ describe('ServiceLocatorEventBus', () => {
|
|
|
11
11
|
debug: vi.fn(),
|
|
12
12
|
warn: vi.fn(),
|
|
13
13
|
} as any as Console
|
|
14
|
-
eventBus = new
|
|
14
|
+
eventBus = new LifecycleEventBus(mockLogger)
|
|
15
15
|
})
|
|
16
16
|
|
|
17
17
|
describe('constructor', () => {
|
|
18
18
|
it('should create event bus without logger', () => {
|
|
19
|
-
const eventBusWithoutLogger = new
|
|
19
|
+
const eventBusWithoutLogger = new LifecycleEventBus()
|
|
20
20
|
expect(eventBusWithoutLogger).toBeDefined()
|
|
21
21
|
})
|
|
22
22
|
|
|
@@ -32,7 +32,7 @@ describe('ServiceLocatorEventBus', () => {
|
|
|
32
32
|
eventBus.on('test-ns', 'create', listener)
|
|
33
33
|
|
|
34
34
|
expect(mockLogger.debug).toHaveBeenCalledWith(
|
|
35
|
-
'[
|
|
35
|
+
'[LifecycleEventBus]#on(): ns:test-ns event:create',
|
|
36
36
|
)
|
|
37
37
|
})
|
|
38
38
|
|
|
@@ -54,10 +54,10 @@ describe('ServiceLocatorEventBus', () => {
|
|
|
54
54
|
eventBus.on('test-ns', 'destroy', listener2)
|
|
55
55
|
|
|
56
56
|
expect(mockLogger.debug).toHaveBeenCalledWith(
|
|
57
|
-
'[
|
|
57
|
+
'[LifecycleEventBus]#on(): ns:test-ns event:create',
|
|
58
58
|
)
|
|
59
59
|
expect(mockLogger.debug).toHaveBeenCalledWith(
|
|
60
|
-
'[
|
|
60
|
+
'[LifecycleEventBus]#on(): ns:test-ns event:destroy',
|
|
61
61
|
)
|
|
62
62
|
})
|
|
63
63
|
|
|
@@ -86,7 +86,7 @@ describe('ServiceLocatorEventBus', () => {
|
|
|
86
86
|
|
|
87
87
|
expect(listener).toHaveBeenCalledWith('create')
|
|
88
88
|
expect(mockLogger.debug).toHaveBeenCalledWith(
|
|
89
|
-
'[
|
|
89
|
+
'[LifecycleEventBus]#emit(): test-ns:create',
|
|
90
90
|
)
|
|
91
91
|
})
|
|
92
92
|
|
|
@@ -2,23 +2,23 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
|
2
2
|
|
|
3
3
|
import { InjectableScope, InjectableType } from '../enums/index.mjs'
|
|
4
4
|
import { DIError } from '../errors/index.mjs'
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { HolderManager } from '../internal/holder/holder-manager.mjs'
|
|
6
|
+
import { InstanceStatus } from '../internal/holder/instance-holder.mjs'
|
|
7
7
|
|
|
8
|
-
describe('
|
|
9
|
-
let manager:
|
|
8
|
+
describe('HolderManager', () => {
|
|
9
|
+
let manager: HolderManager
|
|
10
10
|
let mockLogger: Console
|
|
11
11
|
|
|
12
12
|
beforeEach(() => {
|
|
13
13
|
mockLogger = {
|
|
14
14
|
log: vi.fn(),
|
|
15
15
|
} as any as Console
|
|
16
|
-
manager = new
|
|
16
|
+
manager = new HolderManager(mockLogger)
|
|
17
17
|
})
|
|
18
18
|
|
|
19
19
|
describe('constructor', () => {
|
|
20
20
|
it('should create manager without logger', () => {
|
|
21
|
-
const managerWithoutLogger = new
|
|
21
|
+
const managerWithoutLogger = new HolderManager()
|
|
22
22
|
expect(managerWithoutLogger).toBeDefined()
|
|
23
23
|
})
|
|
24
24
|
|
|
@@ -34,7 +34,7 @@ describe('ServiceLocatorManager', () => {
|
|
|
34
34
|
expect(result).toHaveLength(1)
|
|
35
35
|
expect(result[0]).toBeInstanceOf(DIError)
|
|
36
36
|
expect(mockLogger.log).toHaveBeenCalledWith(
|
|
37
|
-
'[
|
|
37
|
+
'[HolderManager]#get() Instance non-existent not found',
|
|
38
38
|
)
|
|
39
39
|
})
|
|
40
40
|
|
|
@@ -62,7 +62,7 @@ describe('ServiceLocatorManager', () => {
|
|
|
62
62
|
)
|
|
63
63
|
|
|
64
64
|
// Manually set status to destroying
|
|
65
|
-
holder.status =
|
|
65
|
+
holder.status = InstanceStatus.Destroying
|
|
66
66
|
|
|
67
67
|
const result = manager.get('destroying-instance')
|
|
68
68
|
|
|
@@ -70,7 +70,7 @@ describe('ServiceLocatorManager', () => {
|
|
|
70
70
|
expect(result[0]).toBeInstanceOf(DIError)
|
|
71
71
|
expect(result[1]).toBe(holder)
|
|
72
72
|
expect(mockLogger.log).toHaveBeenCalledWith(
|
|
73
|
-
'[
|
|
73
|
+
'[HolderManager]#get() Instance destroying-instance is destroying',
|
|
74
74
|
)
|
|
75
75
|
})
|
|
76
76
|
|
|
@@ -83,9 +83,9 @@ describe('ServiceLocatorManager', () => {
|
|
|
83
83
|
)
|
|
84
84
|
|
|
85
85
|
// Manually set status to error with an error instance
|
|
86
|
-
holder.status =
|
|
86
|
+
holder.status = InstanceStatus.Error
|
|
87
87
|
const errorInstance = DIError.instanceNotFound('error-instance')
|
|
88
|
-
holder.instance = errorInstance
|
|
88
|
+
holder.instance = errorInstance as unknown as Error
|
|
89
89
|
|
|
90
90
|
const result = manager.get('error-instance')
|
|
91
91
|
|
|
@@ -93,7 +93,7 @@ describe('ServiceLocatorManager', () => {
|
|
|
93
93
|
expect(result[0]).toBeInstanceOf(DIError)
|
|
94
94
|
expect(result[1]).toBe(holder)
|
|
95
95
|
expect(mockLogger.log).toHaveBeenCalledWith(
|
|
96
|
-
'[
|
|
96
|
+
'[HolderManager]#get() Instance error-instance is in error state',
|
|
97
97
|
)
|
|
98
98
|
})
|
|
99
99
|
})
|
|
@@ -148,7 +148,7 @@ describe('ServiceLocatorManager', () => {
|
|
|
148
148
|
InjectableScope.Singleton,
|
|
149
149
|
)
|
|
150
150
|
|
|
151
|
-
holder.status =
|
|
151
|
+
holder.status = InstanceStatus.Destroying
|
|
152
152
|
|
|
153
153
|
const result = manager.has('destroying-instance')
|
|
154
154
|
|
|
@@ -230,7 +230,7 @@ describe('ServiceLocatorManager', () => {
|
|
|
230
230
|
|
|
231
231
|
expect(deferred).toBeDefined()
|
|
232
232
|
expect(deferred.promise).toBeInstanceOf(Promise)
|
|
233
|
-
expect(holder.status).toBe(
|
|
233
|
+
expect(holder.status).toBe(InstanceStatus.Creating)
|
|
234
234
|
expect(holder.name).toBe('test-instance')
|
|
235
235
|
expect(holder.instance).toBeNull()
|
|
236
236
|
expect(holder.creationPromise).toBe(deferred.promise)
|
|
@@ -265,7 +265,7 @@ describe('ServiceLocatorManager', () => {
|
|
|
265
265
|
InjectableScope.Singleton,
|
|
266
266
|
)
|
|
267
267
|
|
|
268
|
-
expect(holder.status).toBe(
|
|
268
|
+
expect(holder.status).toBe(InstanceStatus.Created)
|
|
269
269
|
expect(holder.name).toBe('test-instance')
|
|
270
270
|
expect(holder.instance).toBe(instance)
|
|
271
271
|
expect(holder.creationPromise).toBeNull()
|