@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
@@ -2,21 +2,21 @@
2
2
  import { beforeEach, describe, expect, it, vi } from 'vitest'
3
3
  import { z } from 'zod/v4'
4
4
 
5
- import type { FactoryContext } from '../factory-context.mjs'
6
5
  import type {
7
6
  Factorable,
8
7
  FactorableWithArgs,
9
8
  } from '../interfaces/factory.interface.mjs'
9
+ import type { FactoryContext } from '../internal/context/factory-context.mjs'
10
10
 
11
- import { Container } from '../container.mjs'
11
+ import { Container } from '../container/container.mjs'
12
12
  import { Factory } from '../decorators/factory.decorator.mjs'
13
13
  import { Injectable } from '../decorators/injectable.decorator.mjs'
14
14
  import { InjectableScope } from '../enums/injectable-scope.enum.mjs'
15
15
  import { getInjectors } from '../index.mjs'
16
- import { InjectionToken } from '../injection-token.mjs'
17
- import { asyncInject, inject } from '../injector.mjs'
18
- import { Registry } from '../registry.mjs'
19
- import { ServiceLocator } from '../service-locator.mjs'
16
+ import { asyncInject, inject } from '../injectors.mjs'
17
+ import { ServiceLocator } from '../internal/core/service-locator.mjs'
18
+ import { InjectionToken } from '../token/injection-token.mjs'
19
+ import { Registry } from '../token/registry.mjs'
20
20
 
21
21
  describe('Container', () => {
22
22
  let container: Container
@@ -313,9 +313,10 @@ describe('Container', () => {
313
313
 
314
314
  @Factory({ token, registry })
315
315
  // oxlint-disable-next-line no-unused-vars
316
- class ArgFactory
317
- implements FactorableWithArgs<TestService, typeof schema>
318
- {
316
+ class ArgFactory implements FactorableWithArgs<
317
+ TestService,
318
+ typeof schema
319
+ > {
319
320
  async create(ctx: any, args: z.output<typeof schema>) {
320
321
  return new TestService(args.name, args.value)
321
322
  }
@@ -350,9 +351,10 @@ describe('Container', () => {
350
351
 
351
352
  @Factory({ token, registry })
352
353
  // oxlint-disable-next-line no-unused-vars
353
- class OptionalArgFactory
354
- implements FactorableWithArgs<TestService, typeof schema>
355
- {
354
+ class OptionalArgFactory implements FactorableWithArgs<
355
+ TestService,
356
+ typeof schema
357
+ > {
356
358
  async create(ctx: any, args: z.output<typeof schema>) {
357
359
  return new TestService(args?.name || 'default', args?.optional)
358
360
  }
@@ -439,9 +441,10 @@ describe('Container', () => {
439
441
 
440
442
  @Factory({ token, registry })
441
443
  // oxlint-disable-next-line no-unused-vars
442
- class FactoryService
443
- implements FactorableWithArgs<TestService, typeof schema>
444
- {
444
+ class FactoryService implements FactorableWithArgs<
445
+ TestService,
446
+ typeof schema
447
+ > {
445
448
  async create(ctx: any, args: z.output<typeof schema>) {
446
449
  return new TestService(args.factory)
447
450
  }
@@ -526,7 +529,7 @@ describe('Container', () => {
526
529
 
527
530
  @Injectable({ registry })
528
531
  class ServiceB {
529
- serviceA = asyncInject(ServiceA)
532
+ serviceA = asyncInject(ServiceA).catch(() => null)
530
533
  }
531
534
 
532
535
  // This should not throw but handle the circular dependency
@@ -535,6 +538,8 @@ describe('Container', () => {
535
538
  expect(serviceA.serviceB).toBeInstanceOf(Promise)
536
539
  const serviceB = await serviceA.serviceB
537
540
  expect(serviceB).toBeInstanceOf(ServiceB)
541
+ const serviceA2 = await serviceB.serviceA
542
+ expect(serviceA2).toBeInstanceOf(ServiceA)
538
543
  })
539
544
 
540
545
  it('should handle deep dependency chains', async () => {
@@ -626,7 +631,7 @@ describe('Container', () => {
626
631
  await expect(container.get(token, { invalid: 'arg' })).rejects.toThrow()
627
632
  })
628
633
 
629
- it.skip('should handle factory errors', async () => {
634
+ it('should handle factory errors', async () => {
630
635
  @Factory({ registry })
631
636
  class ErrorFactory implements Factorable<TestService> {
632
637
  async create() {
@@ -640,7 +645,7 @@ describe('Container', () => {
640
645
  await expect(container.get(ErrorFactory)).rejects.toThrow('Factory error')
641
646
  })
642
647
 
643
- it.skip('should handle async factory errors', async () => {
648
+ it('should handle async factory errors', async () => {
644
649
  @Factory({ registry })
645
650
  class AsyncErrorFactory implements Factorable<TestService> {
646
651
  async create() {
@@ -1135,27 +1140,27 @@ describe('Container', () => {
1135
1140
  public id = Math.random()
1136
1141
  }
1137
1142
 
1138
- @Injectable({ registry })
1143
+ @Injectable({ registry, scope: InjectableScope.Request })
1139
1144
  class Level2Service {
1140
1145
  level1 = inject(Level1Service)
1141
1146
  public id = Math.random()
1142
1147
  }
1143
1148
 
1144
- @Injectable({ registry })
1149
+ @Injectable({ registry, scope: InjectableScope.Request })
1145
1150
  class RootService {
1146
1151
  level2 = inject(Level2Service)
1147
1152
  }
1148
1153
 
1149
- container.beginRequest('request-1')
1154
+ const scoped = container.beginRequest('request-1')
1150
1155
 
1151
- const root1 = await container.get(RootService)
1156
+ const root1 = await scoped.get(RootService)
1152
1157
  const level2_1 = root1.level2
1153
1158
  const level1_1 = level2_1.level1
1154
1159
 
1155
1160
  // Invalidate the root service
1156
- await container.invalidate(level1_1)
1161
+ await scoped.invalidate(level1_1)
1157
1162
 
1158
- const root2 = await container.get(RootService)
1163
+ const root2 = await scoped.get(RootService)
1159
1164
  const level2_2 = root2.level2
1160
1165
  const level1_2 = level2_2.level1
1161
1166
 
@@ -1166,7 +1171,7 @@ describe('Container', () => {
1166
1171
  expect(level2_1.id).not.toBe(level2_2.id)
1167
1172
  expect(level1_1.id).not.toBe(level1_2.id)
1168
1173
 
1169
- await container.endRequest('request-1')
1174
+ await scoped.endRequest()
1170
1175
  })
1171
1176
 
1172
1177
  it('should handle invalidation of services with mixed inject and asyncInject', async () => {