@navios/di 0.5.1 → 0.6.1
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 +145 -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 +3013 -0
- package/lib/browser/index.mjs.map +1 -0
- package/lib/index-7jfWsiG4.d.mts +1211 -0
- package/lib/index-7jfWsiG4.d.mts.map +1 -0
- package/lib/index-DW3K5sOX.d.cts +1206 -0
- package/lib/index-DW3K5sOX.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-BG_fa9TJ.mjs +2656 -0
- package/lib/testing-BG_fa9TJ.mjs.map +1 -0
- package/lib/testing-DIaIRiJz.cjs +2896 -0
- package/lib/testing-DIaIRiJz.cjs.map +1 -0
- package/package.json +29 -7
- 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__/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 +18 -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 +12 -5
- 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} +11 -4
- 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-2M576LCC.mjs +0 -2043
- package/lib/chunk-2M576LCC.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>
|
|
@@ -60,7 +61,7 @@ describe('ServiceInstantiator', () => {
|
|
|
60
61
|
addDestroyListener: mockAddDestroyListener,
|
|
61
62
|
}
|
|
62
63
|
|
|
63
|
-
instantiator = new
|
|
64
|
+
instantiator = new Instantiator(mockInjectors)
|
|
64
65
|
})
|
|
65
66
|
|
|
66
67
|
function createFactoryRecord<T>(
|
|
@@ -126,7 +127,7 @@ describe('ServiceInstantiator', () => {
|
|
|
126
127
|
const result = await instantiator.instantiateService(mockContext, record)
|
|
127
128
|
|
|
128
129
|
expect(result).toHaveLength(1)
|
|
129
|
-
expect(result[0]).toBeInstanceOf(
|
|
130
|
+
expect(result[0]).toBeInstanceOf(DIError)
|
|
130
131
|
expect(result[0]!.message).toContain('Unknown service type: Unknown')
|
|
131
132
|
})
|
|
132
133
|
|
|
@@ -147,8 +148,8 @@ describe('ServiceInstantiator', () => {
|
|
|
147
148
|
const result = await instantiator.instantiateService(mockContext, record)
|
|
148
149
|
|
|
149
150
|
expect(result).toHaveLength(1)
|
|
150
|
-
expect(result[0]).toBeInstanceOf(
|
|
151
|
-
expect(result[0]!.message).toBe('Constructor error')
|
|
151
|
+
expect(result[0]).toBeInstanceOf(DIError)
|
|
152
|
+
expect(result[0]!.message).toBe('Error: Constructor error')
|
|
152
153
|
})
|
|
153
154
|
})
|
|
154
155
|
|
|
@@ -237,7 +238,7 @@ describe('ServiceInstantiator', () => {
|
|
|
237
238
|
const result = await instantiator.instantiateService(mockContext, record)
|
|
238
239
|
|
|
239
240
|
expect(result).toHaveLength(1)
|
|
240
|
-
expect(result[0]).toBeInstanceOf(
|
|
241
|
+
expect(result[0]).toBeInstanceOf(DIError)
|
|
241
242
|
expect(result[0]!.message).toContain('cannot be instantiated')
|
|
242
243
|
})
|
|
243
244
|
|
|
@@ -266,7 +267,7 @@ describe('ServiceInstantiator', () => {
|
|
|
266
267
|
const result = await instantiator.instantiateService(mockContext, record)
|
|
267
268
|
|
|
268
269
|
expect(result).toHaveLength(1)
|
|
269
|
-
expect(result[0]).toBeInstanceOf(
|
|
270
|
+
expect(result[0]).toBeInstanceOf(DIError)
|
|
270
271
|
expect(result[0]!.message).toContain('cannot be instantiated')
|
|
271
272
|
expect(consoleSpy).toHaveBeenCalledWith(
|
|
272
273
|
expect.stringContaining("has problem with it's definition"),
|
|
@@ -303,7 +304,7 @@ describe('ServiceInstantiator', () => {
|
|
|
303
304
|
const result = await instantiator.instantiateService(mockContext, record)
|
|
304
305
|
|
|
305
306
|
expect(result).toHaveLength(1)
|
|
306
|
-
expect(result[0]).toBeInstanceOf(
|
|
307
|
+
expect(result[0]).toBeInstanceOf(DIError)
|
|
307
308
|
expect(result[0]!.message).toContain(
|
|
308
309
|
'does not implement the create method',
|
|
309
310
|
)
|
|
@@ -355,7 +356,7 @@ describe('ServiceInstantiator', () => {
|
|
|
355
356
|
const result = await instantiator.instantiateService(mockContext, record)
|
|
356
357
|
|
|
357
358
|
expect(result).toHaveLength(1)
|
|
358
|
-
expect(result[0]).toBeInstanceOf(
|
|
359
|
+
expect(result[0]).toBeInstanceOf(DIError)
|
|
359
360
|
expect(result[0]!.message).toContain('cannot be instantiated')
|
|
360
361
|
})
|
|
361
362
|
|
|
@@ -377,7 +378,7 @@ describe('ServiceInstantiator', () => {
|
|
|
377
378
|
const result = await instantiator.instantiateService(mockContext, record)
|
|
378
379
|
|
|
379
380
|
expect(result).toHaveLength(1)
|
|
380
|
-
expect(result[0]).toBeInstanceOf(
|
|
381
|
+
expect(result[0]).toBeInstanceOf(DIError)
|
|
381
382
|
expect(consoleSpy).toHaveBeenCalledWith(
|
|
382
383
|
expect.stringContaining('asyncInject instead of inject'),
|
|
383
384
|
)
|
|
@@ -402,8 +403,8 @@ describe('ServiceInstantiator', () => {
|
|
|
402
403
|
const result = await instantiator.instantiateService(mockContext, record)
|
|
403
404
|
|
|
404
405
|
expect(result).toHaveLength(1)
|
|
405
|
-
expect(result[0]).toBeInstanceOf(
|
|
406
|
-
expect(result[0]!.message).toBe('Factory create error')
|
|
406
|
+
expect(result[0]).toBeInstanceOf(DIError)
|
|
407
|
+
expect(result[0]!.message).toBe('Error: Factory create error')
|
|
407
408
|
})
|
|
408
409
|
})
|
|
409
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()
|