@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.
Files changed (122) hide show
  1. package/CHANGELOG.md +145 -0
  2. package/README.md +196 -219
  3. package/docs/README.md +69 -11
  4. package/docs/api-reference.md +281 -117
  5. package/docs/container.md +220 -56
  6. package/docs/examples/request-scope-example.mts +2 -2
  7. package/docs/factory.md +3 -8
  8. package/docs/getting-started.md +37 -8
  9. package/docs/migration.md +318 -37
  10. package/docs/request-contexts.md +263 -175
  11. package/docs/scopes.md +79 -42
  12. package/lib/browser/index.d.mts +1577 -0
  13. package/lib/browser/index.d.mts.map +1 -0
  14. package/lib/browser/index.mjs +3013 -0
  15. package/lib/browser/index.mjs.map +1 -0
  16. package/lib/index-7jfWsiG4.d.mts +1211 -0
  17. package/lib/index-7jfWsiG4.d.mts.map +1 -0
  18. package/lib/index-DW3K5sOX.d.cts +1206 -0
  19. package/lib/index-DW3K5sOX.d.cts.map +1 -0
  20. package/lib/index.cjs +389 -0
  21. package/lib/index.cjs.map +1 -0
  22. package/lib/index.d.cts +376 -0
  23. package/lib/index.d.cts.map +1 -0
  24. package/lib/index.d.mts +371 -78
  25. package/lib/index.d.mts.map +1 -0
  26. package/lib/index.mjs +325 -63
  27. package/lib/index.mjs.map +1 -1
  28. package/lib/testing/index.cjs +9 -0
  29. package/lib/testing/index.d.cts +2 -0
  30. package/lib/testing/index.d.mts +2 -2
  31. package/lib/testing/index.mjs +2 -72
  32. package/lib/testing-BG_fa9TJ.mjs +2656 -0
  33. package/lib/testing-BG_fa9TJ.mjs.map +1 -0
  34. package/lib/testing-DIaIRiJz.cjs +2896 -0
  35. package/lib/testing-DIaIRiJz.cjs.map +1 -0
  36. package/package.json +29 -7
  37. package/project.json +2 -2
  38. package/src/__tests__/async-local-storage.browser.spec.mts +240 -0
  39. package/src/__tests__/async-local-storage.spec.mts +333 -0
  40. package/src/__tests__/container.spec.mts +30 -25
  41. package/src/__tests__/e2e.browser.spec.mts +790 -0
  42. package/src/__tests__/e2e.spec.mts +1222 -0
  43. package/src/__tests__/factory.spec.mts +1 -1
  44. package/src/__tests__/get-injectors.spec.mts +1 -1
  45. package/src/__tests__/injectable.spec.mts +1 -1
  46. package/src/__tests__/injection-token.spec.mts +1 -1
  47. package/src/__tests__/library-findings.spec.mts +563 -0
  48. package/src/__tests__/registry.spec.mts +2 -2
  49. package/src/__tests__/request-scope.spec.mts +266 -274
  50. package/src/__tests__/service-instantiator.spec.mts +18 -17
  51. package/src/__tests__/service-locator-event-bus.spec.mts +9 -9
  52. package/src/__tests__/service-locator-manager.spec.mts +15 -15
  53. package/src/__tests__/service-locator.spec.mts +167 -244
  54. package/src/__tests__/unified-api.spec.mts +27 -27
  55. package/src/__type-tests__/factory.spec-d.mts +2 -2
  56. package/src/__type-tests__/inject.spec-d.mts +2 -2
  57. package/src/__type-tests__/injectable.spec-d.mts +1 -1
  58. package/src/browser.mts +16 -0
  59. package/src/container/container.mts +319 -0
  60. package/src/container/index.mts +2 -0
  61. package/src/container/scoped-container.mts +350 -0
  62. package/src/decorators/factory.decorator.mts +4 -4
  63. package/src/decorators/injectable.decorator.mts +5 -5
  64. package/src/errors/di-error.mts +12 -5
  65. package/src/errors/index.mts +0 -8
  66. package/src/index.mts +156 -15
  67. package/src/interfaces/container.interface.mts +82 -0
  68. package/src/interfaces/factory.interface.mts +2 -2
  69. package/src/interfaces/index.mts +1 -0
  70. package/src/internal/context/async-local-storage.mts +120 -0
  71. package/src/internal/context/factory-context.mts +18 -0
  72. package/src/internal/context/index.mts +3 -0
  73. package/src/{request-context-holder.mts → internal/context/request-context.mts} +40 -27
  74. package/src/internal/context/resolution-context.mts +63 -0
  75. package/src/internal/context/sync-local-storage.mts +51 -0
  76. package/src/internal/core/index.mts +5 -0
  77. package/src/internal/core/instance-resolver.mts +641 -0
  78. package/src/{service-instantiator.mts → internal/core/instantiator.mts} +31 -27
  79. package/src/internal/core/invalidator.mts +437 -0
  80. package/src/internal/core/service-locator.mts +202 -0
  81. package/src/{token-processor.mts → internal/core/token-processor.mts} +79 -60
  82. package/src/{base-instance-holder-manager.mts → internal/holder/base-holder-manager.mts} +91 -21
  83. package/src/internal/holder/holder-manager.mts +85 -0
  84. package/src/internal/holder/holder-storage.interface.mts +116 -0
  85. package/src/internal/holder/index.mts +6 -0
  86. package/src/internal/holder/instance-holder.mts +109 -0
  87. package/src/internal/holder/request-storage.mts +134 -0
  88. package/src/internal/holder/singleton-storage.mts +105 -0
  89. package/src/internal/index.mts +4 -0
  90. package/src/internal/lifecycle/circular-detector.mts +77 -0
  91. package/src/internal/lifecycle/index.mts +2 -0
  92. package/src/{service-locator-event-bus.mts → internal/lifecycle/lifecycle-event-bus.mts} +11 -4
  93. package/src/testing/__tests__/test-container.spec.mts +2 -2
  94. package/src/testing/test-container.mts +4 -4
  95. package/src/token/index.mts +2 -0
  96. package/src/{injection-token.mts → token/injection-token.mts} +1 -1
  97. package/src/{registry.mts → token/registry.mts} +1 -1
  98. package/src/utils/get-injectable-token.mts +1 -1
  99. package/src/utils/get-injectors.mts +32 -15
  100. package/src/utils/types.mts +1 -1
  101. package/tsdown.config.mts +67 -0
  102. package/lib/_tsup-dts-rollup.d.mts +0 -1283
  103. package/lib/_tsup-dts-rollup.d.ts +0 -1283
  104. package/lib/chunk-2M576LCC.mjs +0 -2043
  105. package/lib/chunk-2M576LCC.mjs.map +0 -1
  106. package/lib/index.d.ts +0 -78
  107. package/lib/index.js +0 -2127
  108. package/lib/index.js.map +0 -1
  109. package/lib/testing/index.d.ts +0 -2
  110. package/lib/testing/index.js +0 -2060
  111. package/lib/testing/index.js.map +0 -1
  112. package/lib/testing/index.mjs.map +0 -1
  113. package/src/container.mts +0 -227
  114. package/src/factory-context.mts +0 -8
  115. package/src/instance-resolver.mts +0 -559
  116. package/src/request-context-manager.mts +0 -149
  117. package/src/service-invalidator.mts +0 -429
  118. package/src/service-locator-instance-holder.mts +0 -70
  119. package/src/service-locator-manager.mts +0 -85
  120. package/src/service-locator.mts +0 -246
  121. package/tsup.config.mts +0 -12
  122. /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 { InjectionToken } from '../injection-token.mjs'
9
- import { ServiceInstantiator } from '../service-instantiator.mjs'
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('ServiceInstantiator', () => {
40
- let instantiator: ServiceInstantiator
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 ServiceInstantiator(mockInjectors)
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(Error)
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(Error)
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(Error)
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(Error)
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(Error)
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(Error)
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(Error)
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(Error)
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 { ServiceLocatorEventBus } from '../service-locator-event-bus.mjs'
3
+ import { LifecycleEventBus } from '../internal/lifecycle/lifecycle-event-bus.mjs'
4
4
 
5
- describe('ServiceLocatorEventBus', () => {
6
- let eventBus: ServiceLocatorEventBus
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 ServiceLocatorEventBus(mockLogger)
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 ServiceLocatorEventBus()
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
- '[ServiceLocatorEventBus]#on(): ns:test-ns event:create',
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
- '[ServiceLocatorEventBus]#on(): ns:test-ns event:create',
57
+ '[LifecycleEventBus]#on(): ns:test-ns event:create',
58
58
  )
59
59
  expect(mockLogger.debug).toHaveBeenCalledWith(
60
- '[ServiceLocatorEventBus]#on(): ns:test-ns event:destroy',
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
- '[ServiceLocatorEventBus]#emit(): test-ns:create',
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 { ServiceLocatorInstanceHolderStatus } from '../service-locator-instance-holder.mjs'
6
- import { ServiceLocatorManager } from '../service-locator-manager.mjs'
5
+ import { HolderManager } from '../internal/holder/holder-manager.mjs'
6
+ import { InstanceStatus } from '../internal/holder/instance-holder.mjs'
7
7
 
8
- describe('ServiceLocatorManager', () => {
9
- let manager: ServiceLocatorManager
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 ServiceLocatorManager(mockLogger)
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 ServiceLocatorManager()
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
- '[ServiceLocatorManager]#getInstanceHolder() Instance non-existent not found',
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 = ServiceLocatorInstanceHolderStatus.Destroying
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
- '[ServiceLocatorManager]#getInstanceHolder() Instance destroying-instance is destroying',
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 = ServiceLocatorInstanceHolderStatus.Error
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
- '[ServiceLocatorManager]#getInstanceHolder() Instance error-instance is in error state',
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 = ServiceLocatorInstanceHolderStatus.Destroying
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(ServiceLocatorInstanceHolderStatus.Creating)
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(ServiceLocatorInstanceHolderStatus.Created)
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()