@navios/di 0.5.1 → 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 +23 -1
- 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 +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 +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} +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
|
@@ -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 {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1161
|
+
await scoped.invalidate(level1_1)
|
|
1157
1162
|
|
|
1158
|
-
const root2 = await
|
|
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
|
|
1174
|
+
await scoped.endRequest()
|
|
1170
1175
|
})
|
|
1171
1176
|
|
|
1172
1177
|
it('should handle invalidation of services with mixed inject and asyncInject', async () => {
|