@navios/di 0.7.1 → 0.9.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 +110 -0
- package/README.md +117 -17
- package/lib/browser/container/abstract-container.d.mts +112 -0
- package/lib/browser/container/abstract-container.d.mts.map +1 -0
- package/lib/browser/container/abstract-container.mjs +100 -0
- package/lib/browser/container/abstract-container.mjs.map +1 -0
- package/lib/browser/container/container.d.mts +100 -0
- package/lib/browser/container/container.d.mts.map +1 -0
- package/lib/browser/container/container.mjs +424 -0
- package/lib/browser/container/container.mjs.map +1 -0
- package/lib/browser/container/scoped-container.d.mts +93 -0
- package/lib/browser/container/scoped-container.d.mts.map +1 -0
- package/lib/browser/container/scoped-container.mjs +119 -0
- package/lib/browser/container/scoped-container.mjs.map +1 -0
- package/lib/browser/decorators/factory.decorator.d.mts +26 -0
- package/lib/browser/decorators/factory.decorator.d.mts.map +1 -0
- package/lib/browser/decorators/factory.decorator.mjs +20 -0
- package/lib/browser/decorators/factory.decorator.mjs.map +1 -0
- package/lib/browser/decorators/injectable.decorator.d.mts +38 -0
- package/lib/browser/decorators/injectable.decorator.d.mts.map +1 -0
- package/lib/browser/decorators/injectable.decorator.mjs +21 -0
- package/lib/browser/decorators/injectable.decorator.mjs.map +1 -0
- package/lib/browser/enums/injectable-scope.enum.d.mts +18 -0
- package/lib/browser/enums/injectable-scope.enum.d.mts.map +1 -0
- package/lib/browser/enums/injectable-scope.enum.mjs +20 -0
- package/lib/browser/enums/injectable-scope.enum.mjs.map +1 -0
- package/lib/browser/enums/injectable-type.enum.d.mts +8 -0
- package/lib/browser/enums/injectable-type.enum.d.mts.map +1 -0
- package/lib/browser/enums/injectable-type.enum.mjs +10 -0
- package/lib/browser/enums/injectable-type.enum.mjs.map +1 -0
- package/lib/browser/errors/di-error.d.mts +43 -0
- package/lib/browser/errors/di-error.d.mts.map +1 -0
- package/lib/browser/errors/di-error.mjs +98 -0
- package/lib/browser/errors/di-error.mjs.map +1 -0
- package/lib/browser/event-emitter.d.mts +16 -0
- package/lib/browser/event-emitter.d.mts.map +1 -0
- package/lib/browser/event-emitter.mjs +320 -0
- package/lib/browser/event-emitter.mjs.map +1 -0
- package/lib/browser/index.d.mts +37 -1508
- package/lib/browser/index.mjs +29 -2650
- package/lib/browser/interfaces/container.interface.d.mts +59 -0
- package/lib/browser/interfaces/container.interface.d.mts.map +1 -0
- package/lib/browser/interfaces/factory.interface.d.mts +14 -0
- package/lib/browser/interfaces/factory.interface.d.mts.map +1 -0
- package/lib/browser/interfaces/on-service-destroy.interface.d.mts +7 -0
- package/lib/browser/interfaces/on-service-destroy.interface.d.mts.map +1 -0
- package/lib/browser/interfaces/on-service-init.interface.d.mts +7 -0
- package/lib/browser/interfaces/on-service-init.interface.d.mts.map +1 -0
- package/lib/browser/internal/context/async-local-storage.browser.mjs +20 -0
- package/lib/browser/internal/context/async-local-storage.browser.mjs.map +1 -0
- package/lib/browser/internal/context/async-local-storage.d.mts +9 -0
- package/lib/browser/internal/context/async-local-storage.d.mts.map +1 -0
- package/lib/browser/internal/context/async-local-storage.types.d.mts +11 -0
- package/lib/browser/internal/context/async-local-storage.types.d.mts.map +1 -0
- package/lib/browser/internal/context/factory-context.d.mts +23 -0
- package/lib/browser/internal/context/factory-context.d.mts.map +1 -0
- package/lib/browser/internal/context/resolution-context.d.mts +43 -0
- package/lib/browser/internal/context/resolution-context.d.mts.map +1 -0
- package/lib/browser/internal/context/resolution-context.mjs +56 -0
- package/lib/browser/internal/context/resolution-context.mjs.map +1 -0
- package/lib/browser/internal/context/service-initialization-context.d.mts +48 -0
- package/lib/browser/internal/context/service-initialization-context.d.mts.map +1 -0
- package/lib/browser/internal/context/sync-local-storage.mjs +53 -0
- package/lib/browser/internal/context/sync-local-storage.mjs.map +1 -0
- package/lib/browser/internal/core/instance-resolver.d.mts +119 -0
- package/lib/browser/internal/core/instance-resolver.d.mts.map +1 -0
- package/lib/browser/internal/core/instance-resolver.mjs +306 -0
- package/lib/browser/internal/core/instance-resolver.mjs.map +1 -0
- package/lib/browser/internal/core/name-resolver.d.mts +52 -0
- package/lib/browser/internal/core/name-resolver.d.mts.map +1 -0
- package/lib/browser/internal/core/name-resolver.mjs +118 -0
- package/lib/browser/internal/core/name-resolver.mjs.map +1 -0
- package/lib/browser/internal/core/scope-tracker.d.mts +65 -0
- package/lib/browser/internal/core/scope-tracker.d.mts.map +1 -0
- package/lib/browser/internal/core/scope-tracker.mjs +120 -0
- package/lib/browser/internal/core/scope-tracker.mjs.map +1 -0
- package/lib/browser/internal/core/service-initializer.d.mts +44 -0
- package/lib/browser/internal/core/service-initializer.d.mts.map +1 -0
- package/lib/browser/internal/core/service-initializer.mjs +109 -0
- package/lib/browser/internal/core/service-initializer.mjs.map +1 -0
- package/lib/browser/internal/core/service-invalidator.d.mts +81 -0
- package/lib/browser/internal/core/service-invalidator.d.mts.map +1 -0
- package/lib/browser/internal/core/service-invalidator.mjs +142 -0
- package/lib/browser/internal/core/service-invalidator.mjs.map +1 -0
- package/lib/browser/internal/core/token-resolver.d.mts +54 -0
- package/lib/browser/internal/core/token-resolver.d.mts.map +1 -0
- package/lib/browser/internal/core/token-resolver.mjs +77 -0
- package/lib/browser/internal/core/token-resolver.mjs.map +1 -0
- package/lib/browser/internal/holder/holder-storage.interface.d.mts +99 -0
- package/lib/browser/internal/holder/holder-storage.interface.d.mts.map +1 -0
- package/lib/browser/internal/holder/instance-holder.d.mts +101 -0
- package/lib/browser/internal/holder/instance-holder.d.mts.map +1 -0
- package/lib/browser/internal/holder/instance-holder.mjs +19 -0
- package/lib/browser/internal/holder/instance-holder.mjs.map +1 -0
- package/lib/browser/internal/holder/unified-storage.d.mts +53 -0
- package/lib/browser/internal/holder/unified-storage.d.mts.map +1 -0
- package/lib/browser/internal/holder/unified-storage.mjs +144 -0
- package/lib/browser/internal/holder/unified-storage.mjs.map +1 -0
- package/lib/browser/internal/lifecycle/circular-detector.d.mts +39 -0
- package/lib/browser/internal/lifecycle/circular-detector.d.mts.map +1 -0
- package/lib/browser/internal/lifecycle/circular-detector.mjs +55 -0
- package/lib/browser/internal/lifecycle/circular-detector.mjs.map +1 -0
- package/lib/browser/internal/lifecycle/lifecycle-event-bus.d.mts +18 -0
- package/lib/browser/internal/lifecycle/lifecycle-event-bus.d.mts.map +1 -0
- package/lib/browser/internal/lifecycle/lifecycle-event-bus.mjs +43 -0
- package/lib/browser/internal/lifecycle/lifecycle-event-bus.mjs.map +1 -0
- package/lib/browser/internal/stub-factory-class.d.mts +14 -0
- package/lib/browser/internal/stub-factory-class.d.mts.map +1 -0
- package/lib/browser/internal/stub-factory-class.mjs +18 -0
- package/lib/browser/internal/stub-factory-class.mjs.map +1 -0
- package/lib/browser/symbols/injectable-token.d.mts +5 -0
- package/lib/browser/symbols/injectable-token.d.mts.map +1 -0
- package/lib/browser/symbols/injectable-token.mjs +6 -0
- package/lib/browser/symbols/injectable-token.mjs.map +1 -0
- package/lib/browser/token/injection-token.d.mts +55 -0
- package/lib/browser/token/injection-token.d.mts.map +1 -0
- package/lib/browser/token/injection-token.mjs +100 -0
- package/lib/browser/token/injection-token.mjs.map +1 -0
- package/lib/browser/token/registry.d.mts +37 -0
- package/lib/browser/token/registry.d.mts.map +1 -0
- package/lib/browser/token/registry.mjs +86 -0
- package/lib/browser/token/registry.mjs.map +1 -0
- package/lib/browser/utils/default-injectors.d.mts +12 -0
- package/lib/browser/utils/default-injectors.d.mts.map +1 -0
- package/lib/browser/utils/default-injectors.mjs +13 -0
- package/lib/browser/utils/default-injectors.mjs.map +1 -0
- package/lib/browser/utils/get-injectable-token.d.mts +9 -0
- package/lib/browser/utils/get-injectable-token.d.mts.map +1 -0
- package/lib/browser/utils/get-injectable-token.mjs +13 -0
- package/lib/browser/utils/get-injectable-token.mjs.map +1 -0
- package/lib/browser/utils/get-injectors.d.mts +55 -0
- package/lib/browser/utils/get-injectors.d.mts.map +1 -0
- package/lib/browser/utils/get-injectors.mjs +121 -0
- package/lib/browser/utils/get-injectors.mjs.map +1 -0
- package/lib/browser/utils/types.d.mts +23 -0
- package/lib/browser/utils/types.d.mts.map +1 -0
- package/lib/{container-Pb_Y4Z4x.mjs → container-8-z89TyQ.mjs} +1269 -1305
- package/lib/container-8-z89TyQ.mjs.map +1 -0
- package/lib/{container-BuAutHGg.d.mts → container-CNiqesCL.d.mts} +600 -569
- package/lib/container-CNiqesCL.d.mts.map +1 -0
- package/lib/{container-DnzgpfBe.cjs → container-CaY2fDuk.cjs} +1287 -1329
- package/lib/container-CaY2fDuk.cjs.map +1 -0
- package/lib/{container-oGTgX2iX.d.cts → container-D-0Ho3qL.d.cts} +601 -565
- package/lib/container-D-0Ho3qL.d.cts.map +1 -0
- package/lib/index.cjs +13 -15
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +58 -223
- package/lib/index.d.cts.map +1 -1
- package/lib/index.d.mts +62 -222
- package/lib/index.d.mts.map +1 -1
- package/lib/index.mjs +5 -6
- package/lib/index.mjs.map +1 -1
- package/lib/testing/index.cjs +569 -311
- package/lib/testing/index.cjs.map +1 -1
- package/lib/testing/index.d.cts +370 -41
- package/lib/testing/index.d.cts.map +1 -1
- package/lib/testing/index.d.mts +370 -41
- package/lib/testing/index.d.mts.map +1 -1
- package/lib/testing/index.mjs +568 -305
- package/lib/testing/index.mjs.map +1 -1
- package/package.json +2 -1
- package/src/__tests__/circular-detector.spec.mts +193 -0
- package/src/__tests__/concurrent.spec.mts +368 -0
- package/src/__tests__/container.spec.mts +32 -30
- package/src/__tests__/di-error.spec.mts +351 -0
- package/src/__tests__/e2e.browser.spec.mts +0 -4
- package/src/__tests__/e2e.spec.mts +10 -19
- package/src/__tests__/event-emitter.spec.mts +232 -109
- package/src/__tests__/get-injectors.spec.mts +250 -39
- package/src/__tests__/injection-token.spec.mts +293 -349
- package/src/__tests__/library-findings.spec.mts +8 -8
- package/src/__tests__/registry.spec.mts +358 -210
- package/src/__tests__/resolution-context.spec.mts +255 -0
- package/src/__tests__/scope-tracker.spec.mts +598 -0
- package/src/__tests__/scope-upgrade.spec.mts +808 -0
- package/src/__tests__/scoped-container.spec.mts +595 -0
- package/src/__tests__/test-container.spec.mts +293 -0
- package/src/__tests__/token-resolver.spec.mts +207 -0
- package/src/__tests__/unified-storage.spec.mts +535 -0
- package/src/__tests__/unit-test-container.spec.mts +405 -0
- package/src/__type-tests__/container.spec-d.mts +180 -0
- package/src/__type-tests__/factory.spec-d.mts +15 -3
- package/src/__type-tests__/inject.spec-d.mts +115 -20
- package/src/__type-tests__/injectable.spec-d.mts +69 -52
- package/src/__type-tests__/injection-token.spec-d.mts +176 -0
- package/src/__type-tests__/scoped-container.spec-d.mts +212 -0
- package/src/container/abstract-container.mts +327 -0
- package/src/container/container.mts +142 -170
- package/src/container/scoped-container.mts +126 -208
- package/src/decorators/factory.decorator.mts +16 -11
- package/src/decorators/injectable.decorator.mts +20 -16
- package/src/enums/index.mts +2 -2
- package/src/enums/injectable-scope.enum.mts +1 -0
- package/src/enums/injectable-type.enum.mts +1 -0
- package/src/errors/di-error.mts +96 -0
- package/src/event-emitter.mts +3 -27
- package/src/index.mts +6 -153
- package/src/interfaces/container.interface.mts +13 -0
- package/src/interfaces/factory.interface.mts +1 -1
- package/src/interfaces/index.mts +1 -1
- package/src/internal/context/async-local-storage.mts +3 -2
- package/src/internal/context/async-local-storage.types.mts +1 -0
- package/src/internal/context/factory-context.mts +1 -0
- package/src/internal/context/index.mts +3 -1
- package/src/internal/context/resolution-context.mts +1 -0
- package/src/internal/context/service-initialization-context.mts +43 -0
- package/src/internal/core/index.mts +5 -4
- package/src/internal/core/instance-resolver.mts +461 -292
- package/src/internal/core/name-resolver.mts +196 -0
- package/src/internal/core/scope-tracker.mts +242 -0
- package/src/internal/core/{instantiator.mts → service-initializer.mts} +51 -29
- package/src/internal/core/service-invalidator.mts +290 -0
- package/src/internal/core/{token-processor.mts → token-resolver.mts} +17 -88
- package/src/internal/holder/holder-storage.interface.mts +11 -5
- package/src/internal/holder/index.mts +2 -5
- package/src/internal/holder/instance-holder.mts +1 -3
- package/src/internal/holder/unified-storage.mts +245 -0
- package/src/internal/index.mts +2 -1
- package/src/internal/lifecycle/circular-detector.mts +1 -0
- package/src/internal/lifecycle/index.mts +1 -1
- package/src/internal/lifecycle/lifecycle-event-bus.mts +1 -0
- package/src/internal/stub-factory-class.mts +16 -0
- package/src/symbols/injectable-token.mts +3 -1
- package/src/testing/index.mts +2 -0
- package/src/testing/test-container.mts +546 -85
- package/src/testing/types.mts +117 -0
- package/src/testing/unit-test-container.mts +509 -0
- package/src/token/injection-token.mts +41 -4
- package/src/token/registry.mts +75 -9
- package/src/utils/default-injectors.mts +16 -0
- package/src/utils/get-injectable-token.mts +2 -3
- package/src/utils/get-injectors.mts +26 -15
- package/src/utils/index.mts +3 -1
- package/src/utils/types.mts +1 -0
- package/tsdown.config.mts +11 -1
- package/lib/browser/index.d.mts.map +0 -1
- package/lib/browser/index.mjs.map +0 -1
- package/lib/container-BuAutHGg.d.mts.map +0 -1
- package/lib/container-DnzgpfBe.cjs.map +0 -1
- package/lib/container-Pb_Y4Z4x.mjs.map +0 -1
- package/lib/container-oGTgX2iX.d.cts.map +0 -1
- package/src/__tests__/async-local-storage.browser.spec.mts +0 -166
- package/src/__tests__/async-local-storage.spec.mts +0 -333
- package/src/__tests__/errors.spec.mts +0 -87
- package/src/__tests__/factory.spec.mts +0 -137
- package/src/__tests__/injectable.spec.mts +0 -246
- package/src/__tests__/request-scope.spec.mts +0 -416
- package/src/__tests__/service-instantiator.spec.mts +0 -410
- package/src/__tests__/service-locator-event-bus.spec.mts +0 -242
- package/src/__tests__/service-locator-manager.spec.mts +0 -300
- package/src/__tests__/service-locator.spec.mts +0 -966
- package/src/__tests__/unified-api.spec.mts +0 -130
- package/src/browser.mts +0 -11
- package/src/injectors.mts +0 -18
- package/src/internal/context/request-context.mts +0 -214
- package/src/internal/core/invalidator.mts +0 -437
- package/src/internal/core/service-locator.mts +0 -202
- package/src/internal/holder/base-holder-manager.mts +0 -238
- package/src/internal/holder/holder-manager.mts +0 -85
- package/src/internal/holder/request-storage.mts +0 -134
- package/src/internal/holder/singleton-storage.mts +0 -105
- package/src/testing/README.md +0 -80
- package/src/testing/__tests__/test-container.spec.mts +0 -173
|
@@ -1,443 +1,387 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, it } from 'vitest'
|
|
2
1
|
import { z } from 'zod/v4'
|
|
2
|
+
import { describe, expect, it, vi } from 'vitest'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
BoundInjectionToken,
|
|
6
|
+
FactoryInjectionToken,
|
|
7
|
+
InjectionToken,
|
|
8
|
+
} from '../token/injection-token.mjs'
|
|
9
|
+
import type { FactoryContext } from '../internal/context/factory-context.mjs'
|
|
10
|
+
|
|
11
|
+
describe('InjectionToken', () => {
|
|
12
|
+
describe('constructor', () => {
|
|
13
|
+
it('should create token with string name', () => {
|
|
14
|
+
const token = new InjectionToken('TestToken', undefined)
|
|
15
|
+
|
|
16
|
+
expect(token.name).toBe('TestToken')
|
|
17
|
+
expect(token.schema).toBeUndefined()
|
|
18
|
+
})
|
|
3
19
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import { Container } from '../index.mjs'
|
|
8
|
-
import { InjectionToken } from '../token/injection-token.mjs'
|
|
20
|
+
it('should create token with symbol name', () => {
|
|
21
|
+
const sym = Symbol('TestSymbol')
|
|
22
|
+
const token = new InjectionToken(sym, undefined)
|
|
9
23
|
|
|
10
|
-
|
|
11
|
-
let container: Container
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
container = new Container()
|
|
14
|
-
})
|
|
15
|
-
it('should work with class', async () => {
|
|
16
|
-
const token = InjectionToken.create('Test')
|
|
17
|
-
@Injectable({
|
|
18
|
-
token,
|
|
24
|
+
expect(token.name).toBe(sym)
|
|
19
25
|
})
|
|
20
|
-
class Test {}
|
|
21
26
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
27
|
+
it('should create token with class name', () => {
|
|
28
|
+
class TestClass {}
|
|
29
|
+
const token = new InjectionToken(TestClass, undefined)
|
|
25
30
|
|
|
26
|
-
|
|
27
|
-
const schema = z.object({
|
|
28
|
-
test: z.string(),
|
|
31
|
+
expect(token.name).toBe(TestClass)
|
|
29
32
|
})
|
|
30
|
-
const token = InjectionToken.create('Test', schema)
|
|
31
33
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
return 'foo'
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
const value = await container.get(token, {
|
|
41
|
-
test: 'test',
|
|
34
|
+
it('should create token with schema', () => {
|
|
35
|
+
const schema = z.object({ name: z.string() })
|
|
36
|
+
const token = new InjectionToken('TestToken', schema)
|
|
37
|
+
|
|
38
|
+
expect(token.schema).toBe(schema)
|
|
42
39
|
})
|
|
43
40
|
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
it('should generate deterministic id', () => {
|
|
42
|
+
const token1 = InjectionToken.create<string>('TestToken')
|
|
43
|
+
const token2 = InjectionToken.create<string>('TestToken')
|
|
46
44
|
|
|
47
|
-
|
|
48
|
-
const token = InjectionToken.create<string>('Test')
|
|
49
|
-
@Factory({
|
|
50
|
-
token,
|
|
45
|
+
expect(token1.id).toBe(token2.id)
|
|
51
46
|
})
|
|
52
|
-
class Test implements Factorable<string> {
|
|
53
|
-
async create() {
|
|
54
|
-
return 'foo'
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
47
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
48
|
+
it('should generate different ids for different names', () => {
|
|
49
|
+
const token1 = InjectionToken.create<string>('TokenA')
|
|
50
|
+
const token2 = InjectionToken.create<string>('TokenB')
|
|
61
51
|
|
|
62
|
-
|
|
63
|
-
const schema = z.object({
|
|
64
|
-
test: z.string(),
|
|
52
|
+
expect(token1.id).not.toBe(token2.id)
|
|
65
53
|
})
|
|
66
|
-
const token = InjectionToken.create<string, typeof schema>('Test', schema)
|
|
67
54
|
|
|
68
|
-
|
|
69
|
-
token,
|
|
70
|
-
})
|
|
71
|
-
// oxlint-disable-next-line no-unused-vars
|
|
72
|
-
class Test implements FactorableWithArgs<string, typeof schema> {
|
|
73
|
-
async create(ctx: any, args: { test: string }) {
|
|
74
|
-
return args.test
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
const value = await container.get(token, {
|
|
78
|
-
test: 'test',
|
|
79
|
-
})
|
|
55
|
+
it('should use custom id when provided', () => {
|
|
56
|
+
const token = new InjectionToken('TestToken', undefined, 'custom-id')
|
|
80
57
|
|
|
81
|
-
|
|
58
|
+
expect(token.id).toBe('custom-id')
|
|
59
|
+
})
|
|
82
60
|
})
|
|
83
61
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
62
|
+
describe('static create', () => {
|
|
63
|
+
it('should create token with string name', () => {
|
|
64
|
+
const token = InjectionToken.create<string>('TestToken')
|
|
65
|
+
|
|
66
|
+
expect(token).toBeInstanceOf(InjectionToken)
|
|
67
|
+
expect(token.name).toBe('TestToken')
|
|
87
68
|
})
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
69
|
+
|
|
70
|
+
it('should create token with symbol name', () => {
|
|
71
|
+
const sym = Symbol('test')
|
|
72
|
+
const token = InjectionToken.create<string>(sym)
|
|
73
|
+
|
|
74
|
+
expect(token.name).toBe(sym)
|
|
91
75
|
})
|
|
92
76
|
|
|
93
|
-
|
|
94
|
-
|
|
77
|
+
it('should create token with class', () => {
|
|
78
|
+
class TestService {}
|
|
79
|
+
const token = InjectionToken.create(TestService)
|
|
80
|
+
|
|
81
|
+
expect(token.name).toBe(TestService)
|
|
95
82
|
})
|
|
96
|
-
class Test {
|
|
97
|
-
makeFoo() {
|
|
98
|
-
return 'foo'
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
const value = await container.get(boundToken)
|
|
102
83
|
|
|
103
|
-
|
|
84
|
+
it('should create token with schema', () => {
|
|
85
|
+
const schema = z.object({ id: z.number() })
|
|
86
|
+
const token = InjectionToken.create<{ data: string }, typeof schema>(
|
|
87
|
+
'TestToken',
|
|
88
|
+
schema,
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
expect(token.schema).toBe(schema)
|
|
92
|
+
})
|
|
104
93
|
})
|
|
105
94
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
95
|
+
describe('static bound', () => {
|
|
96
|
+
it('should create BoundInjectionToken', () => {
|
|
97
|
+
const schema = z.object({ value: z.string() })
|
|
98
|
+
const token = InjectionToken.create<string, typeof schema>(
|
|
99
|
+
'TestToken',
|
|
100
|
+
schema,
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
const bound = InjectionToken.bound(token, { value: 'test' })
|
|
104
|
+
|
|
105
|
+
expect(bound).toBeInstanceOf(BoundInjectionToken)
|
|
106
|
+
expect(bound.token).toBe(token)
|
|
107
|
+
expect(bound.value).toEqual({ value: 'test' })
|
|
109
108
|
})
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
})
|
|
115
|
-
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
describe('static factory', () => {
|
|
112
|
+
it('should create FactoryInjectionToken', () => {
|
|
113
|
+
const schema = z.object({ value: z.string() })
|
|
114
|
+
const token = InjectionToken.create<string, typeof schema>(
|
|
115
|
+
'TestToken',
|
|
116
|
+
schema,
|
|
117
|
+
)
|
|
118
|
+
const factory = async () => ({ value: 'factory' })
|
|
119
|
+
|
|
120
|
+
const factoryToken = InjectionToken.factory(token, factory)
|
|
116
121
|
|
|
117
|
-
|
|
118
|
-
token
|
|
122
|
+
expect(factoryToken).toBeInstanceOf(FactoryInjectionToken)
|
|
123
|
+
expect(factoryToken.token).toBe(token)
|
|
124
|
+
expect(factoryToken.factory).toBe(factory)
|
|
119
125
|
})
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
describe('static refineType', () => {
|
|
129
|
+
it('should refine bound token type', () => {
|
|
130
|
+
const schema = z.object({ value: z.string() })
|
|
131
|
+
const token = InjectionToken.create<string, typeof schema>(
|
|
132
|
+
'TestToken',
|
|
133
|
+
schema,
|
|
134
|
+
)
|
|
135
|
+
const bound = new BoundInjectionToken(token, { value: 'test' })
|
|
136
|
+
|
|
137
|
+
const refined = InjectionToken.refineType<number>(bound)
|
|
126
138
|
|
|
127
|
-
|
|
139
|
+
expect(refined).toBe(bound)
|
|
140
|
+
})
|
|
128
141
|
})
|
|
129
142
|
|
|
130
|
-
describe('
|
|
131
|
-
it('should
|
|
132
|
-
|
|
133
|
-
const token = InjectionToken.create<Test>('Test')
|
|
134
|
-
const factoryInjectionToken = InjectionToken.factory(token, () => {
|
|
135
|
-
resolveCount++
|
|
136
|
-
return Promise.resolve({
|
|
137
|
-
value: 'cached-value',
|
|
138
|
-
})
|
|
139
|
-
})
|
|
140
|
-
|
|
141
|
-
@Injectable({
|
|
142
|
-
token,
|
|
143
|
-
})
|
|
144
|
-
class Test {
|
|
145
|
-
value = 'test-value'
|
|
146
|
-
}
|
|
143
|
+
describe('toString', () => {
|
|
144
|
+
it('should format string name with id', () => {
|
|
145
|
+
const token = InjectionToken.create<string>('TestToken')
|
|
147
146
|
|
|
148
|
-
|
|
149
|
-
const value1 = await container.get(factoryInjectionToken)
|
|
150
|
-
expect(value1).toBeInstanceOf(Test)
|
|
151
|
-
expect(resolveCount).toBe(1)
|
|
147
|
+
const str = token.toString()
|
|
152
148
|
|
|
153
|
-
|
|
154
|
-
const value2 = await container.get(factoryInjectionToken)
|
|
155
|
-
expect(value2).toBeInstanceOf(Test)
|
|
156
|
-
expect(resolveCount).toBe(1) // Should not increment
|
|
149
|
+
expect(str).toMatch(/TestToken\([^)]+\)/)
|
|
157
150
|
})
|
|
158
151
|
|
|
159
|
-
it('should
|
|
160
|
-
const
|
|
161
|
-
const
|
|
162
|
-
await new Promise((resolve) => setTimeout(resolve, 10))
|
|
163
|
-
return {
|
|
164
|
-
value: 'async-value',
|
|
165
|
-
}
|
|
166
|
-
})
|
|
167
|
-
|
|
168
|
-
@Injectable({
|
|
169
|
-
token,
|
|
170
|
-
})
|
|
171
|
-
class AsyncTest {
|
|
172
|
-
value = 'async-test'
|
|
173
|
-
}
|
|
152
|
+
it('should format symbol name with id', () => {
|
|
153
|
+
const sym = Symbol('TestSymbol')
|
|
154
|
+
const token = InjectionToken.create<string>(sym)
|
|
174
155
|
|
|
175
|
-
const
|
|
176
|
-
|
|
156
|
+
const str = token.toString()
|
|
157
|
+
|
|
158
|
+
expect(str).toMatch(/Symbol\(TestSymbol\)\([^)]+\)/)
|
|
177
159
|
})
|
|
178
160
|
|
|
179
|
-
it('should
|
|
180
|
-
|
|
181
|
-
const
|
|
182
|
-
throw new Error('Factory error')
|
|
183
|
-
})
|
|
184
|
-
|
|
185
|
-
@Injectable({
|
|
186
|
-
token,
|
|
187
|
-
})
|
|
188
|
-
class ErrorTest {
|
|
189
|
-
value = 'error-test'
|
|
190
|
-
}
|
|
161
|
+
it('should format class name with id', () => {
|
|
162
|
+
class TestClass {}
|
|
163
|
+
const token = InjectionToken.create(TestClass)
|
|
191
164
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
)
|
|
165
|
+
const str = token.toString()
|
|
166
|
+
|
|
167
|
+
expect(str).toMatch(/TestClass\([^)]+\)/)
|
|
195
168
|
})
|
|
196
169
|
|
|
197
|
-
it('should
|
|
198
|
-
const token = InjectionToken.create<
|
|
199
|
-
const factoryInjectionToken = InjectionToken.factory(token, () => {
|
|
200
|
-
return Promise.reject(new Error('Promise rejection'))
|
|
201
|
-
})
|
|
202
|
-
|
|
203
|
-
@Injectable({
|
|
204
|
-
token,
|
|
205
|
-
})
|
|
206
|
-
class RejectedTest {
|
|
207
|
-
value = 'rejected-test'
|
|
208
|
-
}
|
|
170
|
+
it('should cache formatted name', () => {
|
|
171
|
+
const token = InjectionToken.create<string>('TestToken')
|
|
209
172
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
173
|
+
const str1 = token.toString()
|
|
174
|
+
const str2 = token.toString()
|
|
175
|
+
|
|
176
|
+
expect(str1).toBe(str2)
|
|
213
177
|
})
|
|
178
|
+
})
|
|
179
|
+
})
|
|
214
180
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
181
|
+
describe('BoundInjectionToken', () => {
|
|
182
|
+
describe('constructor', () => {
|
|
183
|
+
it('should wrap token with value', () => {
|
|
184
|
+
const schema = z.object({ config: z.string() })
|
|
185
|
+
const token = InjectionToken.create<string, typeof schema>(
|
|
186
|
+
'TestToken',
|
|
187
|
+
schema,
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
const bound = new BoundInjectionToken(token, { config: 'value' })
|
|
220
191
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
192
|
+
expect(bound.token).toBe(token)
|
|
193
|
+
expect(bound.value).toEqual({ config: 'value' })
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
it('should copy properties from wrapped token', () => {
|
|
197
|
+
const schema = z.object({ config: z.string() })
|
|
198
|
+
const token = InjectionToken.create<string, typeof schema>(
|
|
199
|
+
'TestToken',
|
|
200
|
+
schema,
|
|
228
201
|
)
|
|
229
202
|
|
|
230
|
-
|
|
231
|
-
token,
|
|
232
|
-
})
|
|
233
|
-
class InjectTest {
|
|
234
|
-
value = 'inject-test'
|
|
235
|
-
}
|
|
203
|
+
const bound = new BoundInjectionToken(token, { config: 'value' })
|
|
236
204
|
|
|
237
|
-
|
|
238
|
-
expect(
|
|
205
|
+
expect(bound.id).toBe(token.id)
|
|
206
|
+
expect(bound.name).toBe(token.name)
|
|
207
|
+
expect(bound.schema).toBe(token.schema)
|
|
239
208
|
})
|
|
240
209
|
})
|
|
241
210
|
|
|
242
|
-
describe('
|
|
243
|
-
it('should
|
|
244
|
-
const schema = z
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
.optional()
|
|
249
|
-
const token = InjectionToken.create('OptionalTest', schema)
|
|
250
|
-
const factoryInjectionToken = InjectionToken.factory(token, () =>
|
|
251
|
-
Promise.resolve(undefined),
|
|
211
|
+
describe('toString', () => {
|
|
212
|
+
it('should delegate to wrapped token', () => {
|
|
213
|
+
const schema = z.object({ config: z.string() })
|
|
214
|
+
const token = InjectionToken.create<string, typeof schema>(
|
|
215
|
+
'TestToken',
|
|
216
|
+
schema,
|
|
252
217
|
)
|
|
218
|
+
const bound = new BoundInjectionToken(token, { config: 'value' })
|
|
253
219
|
|
|
254
|
-
|
|
255
|
-
token,
|
|
256
|
-
})
|
|
257
|
-
class OptionalTest {
|
|
258
|
-
value = 'optional-test'
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
const value = await container.get(factoryInjectionToken)
|
|
262
|
-
expect(value).toBeInstanceOf(OptionalTest)
|
|
220
|
+
expect(bound.toString()).toBe(token.toString())
|
|
263
221
|
})
|
|
222
|
+
})
|
|
223
|
+
})
|
|
264
224
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
const
|
|
269
|
-
|
|
225
|
+
describe('FactoryInjectionToken', () => {
|
|
226
|
+
describe('constructor', () => {
|
|
227
|
+
it('should wrap token with factory function', () => {
|
|
228
|
+
const schema = z.object({ config: z.string() })
|
|
229
|
+
const token = InjectionToken.create<string, typeof schema>(
|
|
230
|
+
'TestToken',
|
|
231
|
+
schema,
|
|
270
232
|
)
|
|
233
|
+
const factory = async () => ({ config: 'factory' })
|
|
271
234
|
|
|
272
|
-
|
|
273
|
-
token,
|
|
274
|
-
})
|
|
275
|
-
class RecordTest {
|
|
276
|
-
value = 'record-test'
|
|
277
|
-
}
|
|
235
|
+
const factoryToken = new FactoryInjectionToken(token, factory)
|
|
278
236
|
|
|
279
|
-
|
|
280
|
-
expect(
|
|
237
|
+
expect(factoryToken.token).toBe(token)
|
|
238
|
+
expect(factoryToken.factory).toBe(factory)
|
|
239
|
+
expect(factoryToken.resolved).toBe(false)
|
|
240
|
+
expect(factoryToken.value).toBeUndefined()
|
|
281
241
|
})
|
|
282
242
|
|
|
283
|
-
it('should
|
|
284
|
-
const schema = z.object({
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
preferences: z.object({
|
|
289
|
-
theme: z.enum(['light', 'dark']),
|
|
290
|
-
notifications: z.boolean(),
|
|
291
|
-
}),
|
|
292
|
-
}),
|
|
293
|
-
metadata: z.array(z.string()),
|
|
294
|
-
})
|
|
295
|
-
const token = InjectionToken.create('ComplexTest', schema)
|
|
296
|
-
const factoryInjectionToken = InjectionToken.factory(token, () =>
|
|
297
|
-
Promise.resolve({
|
|
298
|
-
user: {
|
|
299
|
-
id: 1,
|
|
300
|
-
name: 'John Doe',
|
|
301
|
-
preferences: {
|
|
302
|
-
theme: 'dark' as const,
|
|
303
|
-
notifications: true,
|
|
304
|
-
},
|
|
305
|
-
},
|
|
306
|
-
metadata: ['tag1', 'tag2'],
|
|
307
|
-
}),
|
|
243
|
+
it('should copy properties from wrapped token', () => {
|
|
244
|
+
const schema = z.object({ config: z.string() })
|
|
245
|
+
const token = InjectionToken.create<string, typeof schema>(
|
|
246
|
+
'TestToken',
|
|
247
|
+
schema,
|
|
308
248
|
)
|
|
249
|
+
const factory = async () => ({ config: 'factory' })
|
|
309
250
|
|
|
310
|
-
|
|
311
|
-
token,
|
|
312
|
-
})
|
|
313
|
-
class ComplexTest {
|
|
314
|
-
value = 'complex-test'
|
|
315
|
-
}
|
|
251
|
+
const factoryToken = new FactoryInjectionToken(token, factory)
|
|
316
252
|
|
|
317
|
-
|
|
318
|
-
expect(
|
|
253
|
+
expect(factoryToken.id).toBe(token.id)
|
|
254
|
+
expect(factoryToken.name).toBe(token.name)
|
|
255
|
+
expect(factoryToken.schema).toBe(token.schema)
|
|
319
256
|
})
|
|
320
257
|
})
|
|
321
258
|
|
|
322
|
-
describe('
|
|
323
|
-
it('should
|
|
324
|
-
const
|
|
325
|
-
const
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
Promise.resolve({
|
|
329
|
-
value: 'value1',
|
|
330
|
-
}),
|
|
259
|
+
describe('resolve', () => {
|
|
260
|
+
it('should call factory and store value', async () => {
|
|
261
|
+
const schema = z.object({ config: z.string() })
|
|
262
|
+
const token = InjectionToken.create<string, typeof schema>(
|
|
263
|
+
'TestToken',
|
|
264
|
+
schema,
|
|
331
265
|
)
|
|
332
|
-
const
|
|
333
|
-
|
|
334
|
-
value: 'value2',
|
|
335
|
-
}),
|
|
336
|
-
)
|
|
337
|
-
|
|
338
|
-
@Injectable({
|
|
339
|
-
token: token1,
|
|
340
|
-
})
|
|
341
|
-
class Test1 {
|
|
342
|
-
value = 'test1'
|
|
343
|
-
}
|
|
266
|
+
const factory = vi.fn(async () => ({ config: 'resolved' }))
|
|
267
|
+
const factoryToken = new FactoryInjectionToken(token, factory)
|
|
344
268
|
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
value = 'test2'
|
|
269
|
+
const mockCtx: FactoryContext = {
|
|
270
|
+
inject: vi.fn(),
|
|
271
|
+
container: {} as any,
|
|
272
|
+
addDestroyListener: vi.fn(),
|
|
350
273
|
}
|
|
351
274
|
|
|
352
|
-
const
|
|
353
|
-
const value2 = await container.get(factoryToken2)
|
|
275
|
+
const result = await factoryToken.resolve(mockCtx)
|
|
354
276
|
|
|
355
|
-
expect(
|
|
356
|
-
expect(
|
|
357
|
-
expect(
|
|
277
|
+
expect(result).toEqual({ config: 'resolved' })
|
|
278
|
+
expect(factoryToken.value).toEqual({ config: 'resolved' })
|
|
279
|
+
expect(factoryToken.resolved).toBe(true)
|
|
280
|
+
expect(factory).toHaveBeenCalledWith(mockCtx)
|
|
358
281
|
})
|
|
359
282
|
|
|
360
|
-
it('should
|
|
361
|
-
const
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
value: 'factory1',
|
|
366
|
-
}),
|
|
367
|
-
)
|
|
368
|
-
const factoryToken2 = InjectionToken.factory(token, () =>
|
|
369
|
-
Promise.resolve({
|
|
370
|
-
value: 'factory2',
|
|
371
|
-
}),
|
|
283
|
+
it('should only call factory once', async () => {
|
|
284
|
+
const schema = z.object({ config: z.string() })
|
|
285
|
+
const token = InjectionToken.create<string, typeof schema>(
|
|
286
|
+
'TestToken',
|
|
287
|
+
schema,
|
|
372
288
|
)
|
|
289
|
+
const factory = vi.fn(async () => ({ config: 'resolved' }))
|
|
290
|
+
const factoryToken = new FactoryInjectionToken(token, factory)
|
|
373
291
|
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
value = 'shared-test'
|
|
292
|
+
const mockCtx: FactoryContext = {
|
|
293
|
+
inject: vi.fn(),
|
|
294
|
+
container: {} as any,
|
|
295
|
+
addDestroyListener: vi.fn(),
|
|
379
296
|
}
|
|
380
297
|
|
|
381
|
-
|
|
382
|
-
|
|
298
|
+
await factoryToken.resolve(mockCtx)
|
|
299
|
+
await factoryToken.resolve(mockCtx)
|
|
300
|
+
await factoryToken.resolve(mockCtx)
|
|
383
301
|
|
|
384
|
-
expect(
|
|
385
|
-
expect(value2).toBeInstanceOf(SharedTest)
|
|
302
|
+
expect(factory).toHaveBeenCalledTimes(1)
|
|
386
303
|
})
|
|
387
|
-
})
|
|
388
304
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
const token = InjectionToken.create(
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
value: 'test',
|
|
395
|
-
}),
|
|
305
|
+
it('should return cached value on subsequent calls', async () => {
|
|
306
|
+
const schema = z.object({ config: z.string() })
|
|
307
|
+
const token = InjectionToken.create<string, typeof schema>(
|
|
308
|
+
'TestToken',
|
|
309
|
+
schema,
|
|
396
310
|
)
|
|
311
|
+
let callCount = 0
|
|
312
|
+
const factory = async () => ({ config: `call-${++callCount}` })
|
|
313
|
+
const factoryToken = new FactoryInjectionToken(token, factory)
|
|
314
|
+
|
|
315
|
+
const mockCtx: FactoryContext = {
|
|
316
|
+
inject: vi.fn(),
|
|
317
|
+
container: {} as any,
|
|
318
|
+
addDestroyListener: vi.fn(),
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
const result1 = await factoryToken.resolve(mockCtx)
|
|
322
|
+
const result2 = await factoryToken.resolve(mockCtx)
|
|
397
323
|
|
|
398
|
-
expect(
|
|
399
|
-
expect(
|
|
400
|
-
expect(factoryInjectionToken.schema).toBe(token.schema)
|
|
401
|
-
expect(factoryInjectionToken.resolved).toBe(false)
|
|
402
|
-
expect(factoryInjectionToken.value).toBeUndefined()
|
|
324
|
+
expect(result1).toEqual({ config: 'call-1' })
|
|
325
|
+
expect(result2).toEqual({ config: 'call-1' })
|
|
403
326
|
})
|
|
404
327
|
|
|
405
|
-
it('should
|
|
406
|
-
const
|
|
407
|
-
const
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
}),
|
|
328
|
+
it('should allow factory to use inject', async () => {
|
|
329
|
+
const schema = z.object({ config: z.string() })
|
|
330
|
+
const token = InjectionToken.create<string, typeof schema>(
|
|
331
|
+
'TestToken',
|
|
332
|
+
schema,
|
|
411
333
|
)
|
|
412
334
|
|
|
413
|
-
|
|
414
|
-
|
|
335
|
+
const factory = async (ctx: FactoryContext) => {
|
|
336
|
+
await ctx.inject(InjectionToken.create<string>('Dependency'))
|
|
337
|
+
return { config: 'with-dep' }
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
const factoryToken = new FactoryInjectionToken(token, factory)
|
|
341
|
+
const mockInject = vi.fn().mockResolvedValue('dep-value')
|
|
342
|
+
const mockCtx: FactoryContext = {
|
|
343
|
+
inject: mockInject,
|
|
344
|
+
container: {} as any,
|
|
345
|
+
addDestroyListener: vi.fn(),
|
|
346
|
+
}
|
|
415
347
|
|
|
416
|
-
|
|
417
|
-
await factoryInjectionToken.resolve()
|
|
348
|
+
await factoryToken.resolve(mockCtx)
|
|
418
349
|
|
|
419
|
-
expect(
|
|
420
|
-
expect(factoryInjectionToken.value).toMatchObject({ value: 'resolved' })
|
|
350
|
+
expect(mockInject).toHaveBeenCalled()
|
|
421
351
|
})
|
|
352
|
+
})
|
|
422
353
|
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
const
|
|
426
|
-
const
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
const result1 = await factoryInjectionToken.resolve()
|
|
435
|
-
// @ts-expect-error we are not using the context
|
|
436
|
-
const result2 = await factoryInjectionToken.resolve()
|
|
437
|
-
|
|
438
|
-
expect(result1).toMatchObject({ value: 'cached' })
|
|
439
|
-
expect(result2).toMatchObject({ value: 'cached' })
|
|
440
|
-
expect(resolveCount).toBe(1)
|
|
354
|
+
describe('toString', () => {
|
|
355
|
+
it('should delegate to wrapped token', () => {
|
|
356
|
+
const schema = z.object({ config: z.string() })
|
|
357
|
+
const token = InjectionToken.create<string, typeof schema>(
|
|
358
|
+
'TestToken',
|
|
359
|
+
schema,
|
|
360
|
+
)
|
|
361
|
+
const factory = async () => ({ config: 'factory' })
|
|
362
|
+
const factoryToken = new FactoryInjectionToken(token, factory)
|
|
363
|
+
|
|
364
|
+
expect(factoryToken.toString()).toBe(token.toString())
|
|
441
365
|
})
|
|
442
366
|
})
|
|
443
367
|
})
|
|
368
|
+
|
|
369
|
+
describe('token identity', () => {
|
|
370
|
+
it('should maintain token reference through wrapping', () => {
|
|
371
|
+
const schema = z.object({ value: z.string() })
|
|
372
|
+
const original = InjectionToken.create<string, typeof schema>(
|
|
373
|
+
'TestToken',
|
|
374
|
+
schema,
|
|
375
|
+
)
|
|
376
|
+
|
|
377
|
+
const bound = new BoundInjectionToken(original, { value: 'test' })
|
|
378
|
+
const factory = new FactoryInjectionToken(original, async () => ({
|
|
379
|
+
value: 'test',
|
|
380
|
+
}))
|
|
381
|
+
|
|
382
|
+
expect(bound.token).toBe(original)
|
|
383
|
+
expect(factory.token).toBe(original)
|
|
384
|
+
expect(bound.id).toBe(original.id)
|
|
385
|
+
expect(factory.id).toBe(original.id)
|
|
386
|
+
})
|
|
387
|
+
})
|