@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.
Files changed (123) hide show
  1. package/CHANGELOG.md +146 -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 +3012 -0
  15. package/lib/browser/index.mjs.map +1 -0
  16. package/lib/index-S_qX2VLI.d.mts +1211 -0
  17. package/lib/index-S_qX2VLI.d.mts.map +1 -0
  18. package/lib/index-fKPuT65j.d.cts +1206 -0
  19. package/lib/index-fKPuT65j.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-BMGmmxH7.cjs +2895 -0
  33. package/lib/testing-BMGmmxH7.cjs.map +1 -0
  34. package/lib/testing-DCXz8AJD.mjs +2655 -0
  35. package/lib/testing-DCXz8AJD.mjs.map +1 -0
  36. package/package.json +26 -4
  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__/errors.spec.mts +6 -6
  44. package/src/__tests__/factory.spec.mts +1 -1
  45. package/src/__tests__/get-injectors.spec.mts +1 -1
  46. package/src/__tests__/injectable.spec.mts +1 -1
  47. package/src/__tests__/injection-token.spec.mts +1 -1
  48. package/src/__tests__/library-findings.spec.mts +563 -0
  49. package/src/__tests__/registry.spec.mts +2 -2
  50. package/src/__tests__/request-scope.spec.mts +266 -274
  51. package/src/__tests__/service-instantiator.spec.mts +19 -17
  52. package/src/__tests__/service-locator-event-bus.spec.mts +9 -9
  53. package/src/__tests__/service-locator-manager.spec.mts +15 -15
  54. package/src/__tests__/service-locator.spec.mts +167 -244
  55. package/src/__tests__/unified-api.spec.mts +27 -27
  56. package/src/__type-tests__/factory.spec-d.mts +2 -2
  57. package/src/__type-tests__/inject.spec-d.mts +2 -2
  58. package/src/__type-tests__/injectable.spec-d.mts +1 -1
  59. package/src/browser.mts +16 -0
  60. package/src/container/container.mts +319 -0
  61. package/src/container/index.mts +2 -0
  62. package/src/container/scoped-container.mts +350 -0
  63. package/src/decorators/factory.decorator.mts +4 -4
  64. package/src/decorators/injectable.decorator.mts +5 -5
  65. package/src/errors/di-error.mts +13 -7
  66. package/src/errors/index.mts +0 -8
  67. package/src/index.mts +156 -15
  68. package/src/interfaces/container.interface.mts +82 -0
  69. package/src/interfaces/factory.interface.mts +2 -2
  70. package/src/interfaces/index.mts +1 -0
  71. package/src/internal/context/async-local-storage.mts +120 -0
  72. package/src/internal/context/factory-context.mts +18 -0
  73. package/src/internal/context/index.mts +3 -0
  74. package/src/{request-context-holder.mts → internal/context/request-context.mts} +40 -27
  75. package/src/internal/context/resolution-context.mts +63 -0
  76. package/src/internal/context/sync-local-storage.mts +51 -0
  77. package/src/internal/core/index.mts +5 -0
  78. package/src/internal/core/instance-resolver.mts +641 -0
  79. package/src/{service-instantiator.mts → internal/core/instantiator.mts} +31 -27
  80. package/src/internal/core/invalidator.mts +437 -0
  81. package/src/internal/core/service-locator.mts +202 -0
  82. package/src/{token-processor.mts → internal/core/token-processor.mts} +79 -60
  83. package/src/{base-instance-holder-manager.mts → internal/holder/base-holder-manager.mts} +91 -21
  84. package/src/internal/holder/holder-manager.mts +85 -0
  85. package/src/internal/holder/holder-storage.interface.mts +116 -0
  86. package/src/internal/holder/index.mts +6 -0
  87. package/src/internal/holder/instance-holder.mts +109 -0
  88. package/src/internal/holder/request-storage.mts +134 -0
  89. package/src/internal/holder/singleton-storage.mts +105 -0
  90. package/src/internal/index.mts +4 -0
  91. package/src/internal/lifecycle/circular-detector.mts +77 -0
  92. package/src/internal/lifecycle/index.mts +2 -0
  93. package/src/{service-locator-event-bus.mts → internal/lifecycle/lifecycle-event-bus.mts} +12 -5
  94. package/src/testing/__tests__/test-container.spec.mts +2 -2
  95. package/src/testing/test-container.mts +4 -4
  96. package/src/token/index.mts +2 -0
  97. package/src/{injection-token.mts → token/injection-token.mts} +1 -1
  98. package/src/{registry.mts → token/registry.mts} +1 -1
  99. package/src/utils/get-injectable-token.mts +1 -1
  100. package/src/utils/get-injectors.mts +32 -15
  101. package/src/utils/types.mts +1 -1
  102. package/tsdown.config.mts +67 -0
  103. package/lib/_tsup-dts-rollup.d.mts +0 -1283
  104. package/lib/_tsup-dts-rollup.d.ts +0 -1283
  105. package/lib/chunk-44F3LXW5.mjs +0 -2043
  106. package/lib/chunk-44F3LXW5.mjs.map +0 -1
  107. package/lib/index.d.ts +0 -78
  108. package/lib/index.js +0 -2127
  109. package/lib/index.js.map +0 -1
  110. package/lib/testing/index.d.ts +0 -2
  111. package/lib/testing/index.js +0 -2060
  112. package/lib/testing/index.js.map +0 -1
  113. package/lib/testing/index.mjs.map +0 -1
  114. package/src/container.mts +0 -227
  115. package/src/factory-context.mts +0 -8
  116. package/src/instance-resolver.mts +0 -559
  117. package/src/request-context-manager.mts +0 -149
  118. package/src/service-invalidator.mts +0 -429
  119. package/src/service-locator-instance-holder.mts +0 -70
  120. package/src/service-locator-manager.mts +0 -85
  121. package/src/service-locator.mts +0 -246
  122. package/tsup.config.mts +0 -12
  123. /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>
@@ -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 ServiceInstantiator(mockInjectors)
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(Error)
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(Error)
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(Error)
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(Error)
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(Error)
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(Error)
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(Error)
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(Error)
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 { 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()