ts-ioc-container 31.2.2 → 31.4.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/README.md +126 -18
- package/cjm/index.js +5 -4
- package/cjm/provider/ArgsProvider.js +3 -4
- package/cjm/provider/IProvider.js +2 -13
- package/cjm/provider/Provider.js +2 -1
- package/cjm/provider/singleton/Cache.js +2 -0
- package/cjm/provider/singleton/MultiCache.js +21 -0
- package/cjm/provider/singleton/SingleCache.js +18 -0
- package/cjm/provider/singleton/SingletonProvider.js +24 -0
- package/cjm/registration/IRegistration.js +1 -3
- package/cjm/registration/Registration.js +8 -9
- package/cjm/utils.js +1 -11
- package/esm/index.js +3 -2
- package/esm/provider/ArgsProvider.js +3 -4
- package/esm/provider/IProvider.js +1 -10
- package/esm/provider/Provider.js +3 -2
- package/esm/provider/singleton/Cache.js +1 -0
- package/esm/provider/singleton/MultiCache.js +16 -0
- package/esm/provider/singleton/SingleCache.js +14 -0
- package/esm/provider/singleton/SingletonProvider.js +19 -0
- package/esm/registration/IRegistration.js +0 -1
- package/esm/registration/Registration.js +9 -10
- package/esm/utils.js +0 -9
- package/package.json +2 -2
- package/typings/container/Container.d.ts +1 -1
- package/typings/container/IContainer.d.ts +1 -1
- package/typings/index.d.ts +4 -2
- package/typings/provider/ArgsProvider.d.ts +1 -1
- package/typings/provider/IProvider.d.ts +0 -2
- package/typings/provider/singleton/Cache.d.ts +6 -0
- package/typings/provider/singleton/MultiCache.d.ts +10 -0
- package/typings/provider/singleton/SingleCache.d.ts +8 -0
- package/typings/provider/singleton/SingletonProvider.d.ts +12 -0
- package/typings/registration/IRegistration.d.ts +3 -5
- package/typings/registration/Registration.d.ts +5 -6
- package/typings/utils.d.ts +0 -1
- package/cjm/provider/SingletonProvider.js +0 -20
- package/esm/provider/SingletonProvider.js +0 -15
- package/typings/provider/SingletonProvider.d.ts +0 -11
package/README.md
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
- [Metadata](#metadata) `@inject`
|
|
30
30
|
- [Simple](#simple)
|
|
31
31
|
- [Proxy](#proxy)
|
|
32
|
-
- [Provider](#provider)
|
|
32
|
+
- [Provider](#provider) `@provider`
|
|
33
33
|
- [Singleton](#singleton) `singleton`
|
|
34
34
|
- [Arguments](#arguments) `args`
|
|
35
35
|
- [Visibility](#visibility) `visible`
|
|
@@ -138,6 +138,7 @@ import {
|
|
|
138
138
|
Container,
|
|
139
139
|
DependencyNotFoundError,
|
|
140
140
|
key,
|
|
141
|
+
provider,
|
|
141
142
|
MetadataInjector,
|
|
142
143
|
Registration as R,
|
|
143
144
|
by,
|
|
@@ -145,7 +146,8 @@ import {
|
|
|
145
146
|
register,
|
|
146
147
|
} from 'ts-ioc-container';
|
|
147
148
|
|
|
148
|
-
@register(key('ILogger'), scope((s) => s.hasTag('child'))
|
|
149
|
+
@register(key('ILogger'), scope((s) => s.hasTag('child')))
|
|
150
|
+
@provider(singleton())
|
|
149
151
|
class Logger {}
|
|
150
152
|
|
|
151
153
|
describe('Scopes', function () {
|
|
@@ -330,7 +332,7 @@ This type of injector injects dependencies as dictionary `Record<string, unknown
|
|
|
330
332
|
|
|
331
333
|
```typescript
|
|
332
334
|
import 'reflect-metadata';
|
|
333
|
-
import {
|
|
335
|
+
import { Container, ProxyInjector, args, Registration as R } from 'ts-ioc-container';
|
|
334
336
|
|
|
335
337
|
describe('ProxyInjector', function () {
|
|
336
338
|
it('should pass dependency to constructor as dictionary', function () {
|
|
@@ -387,6 +389,7 @@ describe('ProxyInjector', function () {
|
|
|
387
389
|
## Provider
|
|
388
390
|
Provider is dependency factory which creates dependency.
|
|
389
391
|
|
|
392
|
+
- `@provider()`
|
|
390
393
|
- `Provider.fromClass(Logger)`
|
|
391
394
|
- `Provider.fromValue(logger)`
|
|
392
395
|
- `new Provider((container, ...args) => container.resolve(Logger, {args}))`
|
|
@@ -436,9 +439,10 @@ Sometimes you need to create only one instance of dependency per scope. For exam
|
|
|
436
439
|
|
|
437
440
|
```typescript
|
|
438
441
|
import 'reflect-metadata';
|
|
439
|
-
import { singleton, Container, key, MetadataInjector, Registration as R, register } from 'ts-ioc-container';
|
|
442
|
+
import { singleton, Container, key, provider, MetadataInjector, Registration as R, register } from 'ts-ioc-container';
|
|
440
443
|
|
|
441
|
-
@register(key('logger')
|
|
444
|
+
@register(key('logger'))
|
|
445
|
+
@provider(singleton())
|
|
442
446
|
class Logger {}
|
|
443
447
|
|
|
444
448
|
describe('Singleton', function () {
|
|
@@ -471,14 +475,27 @@ describe('Singleton', function () {
|
|
|
471
475
|
|
|
472
476
|
### Arguments
|
|
473
477
|
Sometimes you want to bind some arguments to provider. This is what `ArgsProvider` is for.
|
|
474
|
-
-
|
|
475
|
-
-
|
|
478
|
+
- `@provider(args('someArgument'))`
|
|
479
|
+
- `@provider(argsFn((container) => [container.resolve(Logger), 'someValue']))`
|
|
476
480
|
- `Provider.fromClass(Logger).pipe(args('someArgument'))`
|
|
477
481
|
- NOTICE: args from this provider has higher priority than args from `resolve` method.
|
|
478
482
|
|
|
479
483
|
```typescript
|
|
480
484
|
import 'reflect-metadata';
|
|
481
|
-
import {
|
|
485
|
+
import {
|
|
486
|
+
args,
|
|
487
|
+
argsFn,
|
|
488
|
+
Container,
|
|
489
|
+
DependencyKey,
|
|
490
|
+
inject,
|
|
491
|
+
key,
|
|
492
|
+
MetadataInjector,
|
|
493
|
+
MultiCache,
|
|
494
|
+
provider,
|
|
495
|
+
register,
|
|
496
|
+
Registration as R,
|
|
497
|
+
singleton,
|
|
498
|
+
} from 'ts-ioc-container';
|
|
482
499
|
|
|
483
500
|
@register(key('logger'))
|
|
484
501
|
class Logger {
|
|
@@ -515,13 +532,97 @@ describe('ArgsProvider', function () {
|
|
|
515
532
|
expect(logger.name).toBe('name');
|
|
516
533
|
expect(logger.type).toBe('file');
|
|
517
534
|
});
|
|
535
|
+
|
|
536
|
+
it('should resolve dependency by passing arguments resolve from container by another argument', function () {
|
|
537
|
+
interface IRepository {
|
|
538
|
+
name: string;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
@register(key('UserRepository'))
|
|
542
|
+
class UserRepository implements IRepository {
|
|
543
|
+
name = 'UserRepository';
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
@register(key('TodoRepository'))
|
|
547
|
+
class TodoRepository implements IRepository {
|
|
548
|
+
name = 'TodoRepository';
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
@register(key('EntityManager'))
|
|
552
|
+
@provider(argsFn((container, token) => [container.resolve(token as DependencyKey)]))
|
|
553
|
+
class EntityManager {
|
|
554
|
+
constructor(public repository: IRepository) {}
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
class Main {
|
|
558
|
+
constructor(
|
|
559
|
+
@inject((s) => s.resolve('EntityManager', { args: ['UserRepository'] })) public userEntities: EntityManager,
|
|
560
|
+
@inject((s) => s.resolve('EntityManager', { args: ['TodoRepository'] })) public todoEntities: EntityManager,
|
|
561
|
+
) {}
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
const root = createContainer()
|
|
565
|
+
.add(R.fromClass(EntityManager))
|
|
566
|
+
.add(R.fromClass(UserRepository))
|
|
567
|
+
.add(R.fromClass(TodoRepository));
|
|
568
|
+
const main = root.resolve(Main);
|
|
569
|
+
|
|
570
|
+
expect(main.userEntities.repository).toBeInstanceOf(UserRepository);
|
|
571
|
+
expect(main.todoEntities.repository).toBeInstanceOf(TodoRepository);
|
|
572
|
+
});
|
|
573
|
+
|
|
574
|
+
it('should resolve memoized dependency by passing arguments resolve from container by another argument', function () {
|
|
575
|
+
interface IRepository {
|
|
576
|
+
name: string;
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
@register(key('UserRepository'))
|
|
580
|
+
class UserRepository implements IRepository {
|
|
581
|
+
name = 'UserRepository';
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
@register(key('TodoRepository'))
|
|
585
|
+
class TodoRepository implements IRepository {
|
|
586
|
+
name = 'TodoRepository';
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
@register(key('EntityManager'))
|
|
590
|
+
@provider(
|
|
591
|
+
argsFn((container, token) => [container.resolve(token as DependencyKey)]),
|
|
592
|
+
singleton(() => new MultiCache((...args: unknown[]) => args[0] as DependencyKey)),
|
|
593
|
+
)
|
|
594
|
+
class EntityManager {
|
|
595
|
+
constructor(public repository: IRepository) {}
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
class Main {
|
|
599
|
+
constructor(
|
|
600
|
+
@inject((s) => s.resolve('EntityManager', { args: ['UserRepository'] })) public userEntities: EntityManager,
|
|
601
|
+
@inject((s) => s.resolve('EntityManager', { args: ['TodoRepository'] })) public todoEntities: EntityManager,
|
|
602
|
+
) {}
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
const root = createContainer()
|
|
606
|
+
.add(R.fromClass(EntityManager))
|
|
607
|
+
.add(R.fromClass(UserRepository))
|
|
608
|
+
.add(R.fromClass(TodoRepository));
|
|
609
|
+
const main = root.resolve(Main);
|
|
610
|
+
|
|
611
|
+
const userRepository = root.resolve<EntityManager>('EntityManager', { args: ['UserRepository'] }).repository;
|
|
612
|
+
expect(userRepository).toBeInstanceOf(UserRepository);
|
|
613
|
+
expect(main.userEntities.repository).toBe(userRepository);
|
|
614
|
+
|
|
615
|
+
const todoRepository = root.resolve<EntityManager>('EntityManager', { args: ['TodoRepository'] }).repository;
|
|
616
|
+
expect(todoRepository).toBeInstanceOf(TodoRepository);
|
|
617
|
+
expect(main.todoEntities.repository).toBe(todoRepository);
|
|
618
|
+
});
|
|
518
619
|
});
|
|
519
620
|
|
|
520
621
|
```
|
|
521
622
|
|
|
522
623
|
### Visibility
|
|
523
624
|
Sometimes you want to hide dependency if somebody wants to resolve it from certain scope
|
|
524
|
-
-
|
|
625
|
+
- `@provider(visible(({ isParent, child }) => isParent || child.hasTag('root')))` - dependency will be accessible from scope `root` or from scope where it's registered
|
|
525
626
|
- `Provider.fromClass(Logger).pipe(visible(({ isParent, child }) => isParent || child.hasTag('root')))`
|
|
526
627
|
|
|
527
628
|
```typescript
|
|
@@ -531,6 +632,7 @@ import {
|
|
|
531
632
|
DependencyNotFoundError,
|
|
532
633
|
key,
|
|
533
634
|
MetadataInjector,
|
|
635
|
+
provider,
|
|
534
636
|
register,
|
|
535
637
|
Registration as R,
|
|
536
638
|
scope,
|
|
@@ -540,7 +642,8 @@ import {
|
|
|
540
642
|
|
|
541
643
|
describe('Visibility', function () {
|
|
542
644
|
it('should hide from children', () => {
|
|
543
|
-
@register(key('logger'), scope((s) => s.hasTag('root'))
|
|
645
|
+
@register(key('logger'), scope((s) => s.hasTag('root')))
|
|
646
|
+
@provider(singleton(), visible(({ isParent }) => isParent))
|
|
544
647
|
class FileLogger {}
|
|
545
648
|
|
|
546
649
|
const parent = new Container(new MetadataInjector(), { tags: ['root'] }).add(R.fromClass(FileLogger));
|
|
@@ -564,14 +667,15 @@ Registration is provider factory which registers provider in container.
|
|
|
564
667
|
|
|
565
668
|
```typescript
|
|
566
669
|
import 'reflect-metadata';
|
|
567
|
-
import { Container, key, MetadataInjector, register, Registration as R, scope, singleton } from 'ts-ioc-container';
|
|
670
|
+
import { Container, key, MetadataInjector, provider, register, Registration as R, scope, singleton } from 'ts-ioc-container';
|
|
568
671
|
import { DependencyMissingKeyError } from '../../lib/errors/DependencyMissingKeyError';
|
|
569
672
|
|
|
570
673
|
describe('Registration module', function () {
|
|
571
674
|
const createContainer = () => new Container(new MetadataInjector(), { tags: ['root'] });
|
|
572
675
|
|
|
573
676
|
it('should register class', function () {
|
|
574
|
-
@register(key('ILogger'), scope((s) => s.hasTag('root'))
|
|
677
|
+
@register(key('ILogger'), scope((s) => s.hasTag('root')))
|
|
678
|
+
@provider(singleton())
|
|
575
679
|
class Logger {}
|
|
576
680
|
|
|
577
681
|
const root = createContainer().add(R.fromClass(Logger));
|
|
@@ -615,9 +719,10 @@ Sometimes you need to register provider only in scope which matches to certain c
|
|
|
615
719
|
|
|
616
720
|
```typescript
|
|
617
721
|
import 'reflect-metadata';
|
|
618
|
-
import { singleton, Container, key, MetadataInjector, Registration as R, scope, register } from 'ts-ioc-container';
|
|
722
|
+
import { singleton, Container, key, provider, MetadataInjector, Registration as R, scope, register } from 'ts-ioc-container';
|
|
619
723
|
|
|
620
|
-
@register(key('ILogger'), scope((s) => s.hasTag('root'))
|
|
724
|
+
@register(key('ILogger'), scope((s) => s.hasTag('root')))
|
|
725
|
+
@provider(singleton()) // the same as .pipe(singleton(), scope((s) => s.hasTag('root')))
|
|
621
726
|
class Logger {}
|
|
622
727
|
describe('ScopeProvider', function () {
|
|
623
728
|
it('should return the same instance', function () {
|
|
@@ -832,19 +937,22 @@ describe('onConstruct', function () {
|
|
|
832
937
|
```typescript
|
|
833
938
|
import 'reflect-metadata';
|
|
834
939
|
import {
|
|
940
|
+
singleton,
|
|
835
941
|
by,
|
|
836
942
|
Container,
|
|
943
|
+
key,
|
|
837
944
|
getHooks,
|
|
838
945
|
hook,
|
|
839
946
|
inject,
|
|
840
|
-
|
|
947
|
+
provider,
|
|
948
|
+
Registration as R,
|
|
841
949
|
MetadataInjector,
|
|
842
950
|
register,
|
|
843
|
-
Registration as R,
|
|
844
|
-
singleton,
|
|
845
951
|
} from 'ts-ioc-container';
|
|
952
|
+
import * as console from 'node:console';
|
|
846
953
|
|
|
847
|
-
@register(key('logsRepo')
|
|
954
|
+
@register(key('logsRepo'))
|
|
955
|
+
@provider(singleton())
|
|
848
956
|
class LogsRepo {
|
|
849
957
|
savedLogs: string[] = [];
|
|
850
958
|
|
package/cjm/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getParameterMetadata = exports.getMethodMetadata = exports.setMethodMetadata = exports.setParameterMetadata = exports.getMetadata = exports.setMetadata = exports.by = exports.hasHooks = exports.hook = exports.getHooks = exports.ProxyInjector = exports.SimpleInjector = exports.inject = exports.MetadataInjector = exports.register = exports.scope = exports.alias = exports.key = exports.Registration = exports.AutoMockedContainer = exports.SingletonProvider = exports.singleton = exports.ArgsProvider = exports.args = exports.argsFn = exports.ProviderDecorator = exports.Provider = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyNotFoundError = exports.
|
|
3
|
+
exports.getParameterMetadata = exports.getMethodMetadata = exports.setMethodMetadata = exports.setParameterMetadata = exports.getMetadata = exports.setMetadata = exports.by = exports.hasHooks = exports.hook = exports.getHooks = exports.ProxyInjector = exports.SimpleInjector = exports.inject = exports.MetadataInjector = exports.register = exports.scope = exports.alias = exports.key = exports.Registration = exports.AutoMockedContainer = exports.MultiCache = exports.SingletonProvider = exports.singleton = exports.ArgsProvider = exports.args = exports.argsFn = exports.ProviderDecorator = exports.Provider = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyNotFoundError = exports.visible = exports.provider = exports.EmptyContainer = exports.Container = exports.isDependencyKey = void 0;
|
|
4
4
|
var IContainer_1 = require("./container/IContainer");
|
|
5
5
|
Object.defineProperty(exports, "isDependencyKey", { enumerable: true, get: function () { return IContainer_1.isDependencyKey; } });
|
|
6
6
|
var Container_1 = require("./container/Container");
|
|
@@ -8,9 +8,8 @@ Object.defineProperty(exports, "Container", { enumerable: true, get: function ()
|
|
|
8
8
|
var EmptyContainer_1 = require("./container/EmptyContainer");
|
|
9
9
|
Object.defineProperty(exports, "EmptyContainer", { enumerable: true, get: function () { return EmptyContainer_1.EmptyContainer; } });
|
|
10
10
|
var IProvider_1 = require("./provider/IProvider");
|
|
11
|
-
Object.defineProperty(exports, "visible", { enumerable: true, get: function () { return IProvider_1.visible; } });
|
|
12
11
|
Object.defineProperty(exports, "provider", { enumerable: true, get: function () { return IProvider_1.provider; } });
|
|
13
|
-
Object.defineProperty(exports, "
|
|
12
|
+
Object.defineProperty(exports, "visible", { enumerable: true, get: function () { return IProvider_1.visible; } });
|
|
14
13
|
var DependencyNotFoundError_1 = require("./errors/DependencyNotFoundError");
|
|
15
14
|
Object.defineProperty(exports, "DependencyNotFoundError", { enumerable: true, get: function () { return DependencyNotFoundError_1.DependencyNotFoundError; } });
|
|
16
15
|
var MethodNotImplementedError_1 = require("./errors/MethodNotImplementedError");
|
|
@@ -25,9 +24,11 @@ var ArgsProvider_1 = require("./provider/ArgsProvider");
|
|
|
25
24
|
Object.defineProperty(exports, "argsFn", { enumerable: true, get: function () { return ArgsProvider_1.argsFn; } });
|
|
26
25
|
Object.defineProperty(exports, "args", { enumerable: true, get: function () { return ArgsProvider_1.args; } });
|
|
27
26
|
Object.defineProperty(exports, "ArgsProvider", { enumerable: true, get: function () { return ArgsProvider_1.ArgsProvider; } });
|
|
28
|
-
var SingletonProvider_1 = require("./provider/SingletonProvider");
|
|
27
|
+
var SingletonProvider_1 = require("./provider/singleton/SingletonProvider");
|
|
29
28
|
Object.defineProperty(exports, "singleton", { enumerable: true, get: function () { return SingletonProvider_1.singleton; } });
|
|
30
29
|
Object.defineProperty(exports, "SingletonProvider", { enumerable: true, get: function () { return SingletonProvider_1.SingletonProvider; } });
|
|
30
|
+
var MultiCache_1 = require("./provider/singleton/MultiCache");
|
|
31
|
+
Object.defineProperty(exports, "MultiCache", { enumerable: true, get: function () { return MultiCache_1.MultiCache; } });
|
|
31
32
|
var AutoMockedContainer_1 = require("./container/AutoMockedContainer");
|
|
32
33
|
Object.defineProperty(exports, "AutoMockedContainer", { enumerable: true, get: function () { return AutoMockedContainer_1.AutoMockedContainer; } });
|
|
33
34
|
var Registration_1 = require("./registration/Registration");
|
|
@@ -2,13 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ArgsProvider = exports.argsFn = exports.args = void 0;
|
|
4
4
|
const ProviderDecorator_1 = require("./ProviderDecorator");
|
|
5
|
-
const IProvider_1 = require("./IProvider");
|
|
6
5
|
function args(...extraArgs) {
|
|
7
|
-
return (
|
|
6
|
+
return (provider) => new ArgsProvider(provider, () => extraArgs);
|
|
8
7
|
}
|
|
9
8
|
exports.args = args;
|
|
10
9
|
function argsFn(value) {
|
|
11
|
-
return (
|
|
10
|
+
return (provider) => new ArgsProvider(provider, value);
|
|
12
11
|
}
|
|
13
12
|
exports.argsFn = argsFn;
|
|
14
13
|
class ArgsProvider extends ProviderDecorator_1.ProviderDecorator {
|
|
@@ -18,7 +17,7 @@ class ArgsProvider extends ProviderDecorator_1.ProviderDecorator {
|
|
|
18
17
|
this.argsFn = argsFn;
|
|
19
18
|
}
|
|
20
19
|
resolve(container, ...args) {
|
|
21
|
-
return this.provider.resolve(container, ...this.argsFn(container), ...args);
|
|
20
|
+
return this.provider.resolve(container, ...this.argsFn(container, ...args), ...args);
|
|
22
21
|
}
|
|
23
22
|
}
|
|
24
23
|
exports.ArgsProvider = ArgsProvider;
|
|
@@ -1,22 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.visible = exports.
|
|
3
|
+
exports.visible = exports.getTransformers = exports.provider = void 0;
|
|
4
4
|
const metadata_1 = require("../metadata");
|
|
5
5
|
const METADATA_KEY = 'provider';
|
|
6
6
|
const provider = (...mappers) => (0, metadata_1.setMetadata)(METADATA_KEY, mappers);
|
|
7
7
|
exports.provider = provider;
|
|
8
8
|
const getTransformers = (Target) => (0, metadata_1.getMetadata)(Target, METADATA_KEY) ?? [];
|
|
9
9
|
exports.getTransformers = getTransformers;
|
|
10
|
-
const
|
|
11
|
-
// @ts-ignore
|
|
12
|
-
fn.__provider = true;
|
|
13
|
-
return fn;
|
|
14
|
-
};
|
|
15
|
-
exports.markAsProvider = markAsProvider;
|
|
16
|
-
const isProviderMapper = (fn) => {
|
|
17
|
-
// @ts-ignore
|
|
18
|
-
return fn.__provider === true;
|
|
19
|
-
};
|
|
20
|
-
exports.isProviderMapper = isProviderMapper;
|
|
21
|
-
const visible = (isVisibleWhen) => (0, exports.markAsProvider)((p) => p.setVisibility(isVisibleWhen));
|
|
10
|
+
const visible = (isVisibleWhen) => (p) => p.setVisibility(isVisibleWhen);
|
|
22
11
|
exports.visible = visible;
|
package/cjm/provider/Provider.js
CHANGED
|
@@ -9,7 +9,8 @@ class Provider {
|
|
|
9
9
|
return new Provider((container, ...args) => container.resolve(Target, { args })).pipe(...transformers);
|
|
10
10
|
}
|
|
11
11
|
static fromValue(value) {
|
|
12
|
-
|
|
12
|
+
const mappers = (0, utils_1.isConstructor)(value) ? (0, IProvider_1.getTransformers)(value) ?? [] : [];
|
|
13
|
+
return new Provider(() => value).pipe(...mappers);
|
|
13
14
|
}
|
|
14
15
|
constructor(resolveDependency, isVisibleWhen = () => true) {
|
|
15
16
|
this.resolveDependency = resolveDependency;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.multiCache = exports.MultiCache = void 0;
|
|
4
|
+
class MultiCache {
|
|
5
|
+
constructor(getKey = () => '1') {
|
|
6
|
+
this.getKey = getKey;
|
|
7
|
+
this.instances = new Map();
|
|
8
|
+
}
|
|
9
|
+
hasValue(token) {
|
|
10
|
+
return this.instances.has(token);
|
|
11
|
+
}
|
|
12
|
+
getValue(token) {
|
|
13
|
+
return this.instances.get(token);
|
|
14
|
+
}
|
|
15
|
+
setValue(token, value) {
|
|
16
|
+
this.instances.set(token, value);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.MultiCache = MultiCache;
|
|
20
|
+
const multiCache = (getKey) => new MultiCache(getKey);
|
|
21
|
+
exports.multiCache = multiCache;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SingleCache = void 0;
|
|
4
|
+
class SingleCache {
|
|
5
|
+
getKey(...args) {
|
|
6
|
+
return '1';
|
|
7
|
+
}
|
|
8
|
+
getValue(key) {
|
|
9
|
+
return this.instance.value;
|
|
10
|
+
}
|
|
11
|
+
hasValue(key) {
|
|
12
|
+
return this.instance !== undefined;
|
|
13
|
+
}
|
|
14
|
+
setValue(key, value) {
|
|
15
|
+
this.instance = { value };
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.SingleCache = SingleCache;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SingletonProvider = exports.singleton = void 0;
|
|
4
|
+
const ProviderDecorator_1 = require("../ProviderDecorator");
|
|
5
|
+
const SingleCache_1 = require("./SingleCache");
|
|
6
|
+
function singleton(cacheProvider) {
|
|
7
|
+
return (provider) => new SingletonProvider(provider, cacheProvider ? cacheProvider() : new SingleCache_1.SingleCache());
|
|
8
|
+
}
|
|
9
|
+
exports.singleton = singleton;
|
|
10
|
+
class SingletonProvider extends ProviderDecorator_1.ProviderDecorator {
|
|
11
|
+
constructor(provider, cache) {
|
|
12
|
+
super(provider);
|
|
13
|
+
this.provider = provider;
|
|
14
|
+
this.cache = cache;
|
|
15
|
+
}
|
|
16
|
+
resolve(container, ...args) {
|
|
17
|
+
const key = this.cache.getKey(...args);
|
|
18
|
+
if (!this.cache.hasValue(key)) {
|
|
19
|
+
this.cache.setValue(key, this.provider.resolve(container, ...args));
|
|
20
|
+
}
|
|
21
|
+
return this.cache.getValue(key);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.SingletonProvider = SingletonProvider;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.register = exports.getTransformers = exports.scope = exports.alias = exports.key = void 0;
|
|
4
4
|
const metadata_1 = require("../metadata");
|
|
5
5
|
const key = (key) => (r) => r.to(key);
|
|
6
6
|
exports.key = key;
|
|
@@ -13,5 +13,3 @@ const getTransformers = (Target) => (0, metadata_1.getMetadata)(Target, METADATA
|
|
|
13
13
|
exports.getTransformers = getTransformers;
|
|
14
14
|
const register = (...mappers) => (0, metadata_1.setMetadata)(METADATA_KEY, mappers);
|
|
15
15
|
exports.register = register;
|
|
16
|
-
const provider = (...mappers) => (r) => r.provider(...mappers);
|
|
17
|
-
exports.provider = provider;
|
|
@@ -3,25 +3,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Registration = void 0;
|
|
4
4
|
const utils_1 = require("../utils");
|
|
5
5
|
const Provider_1 = require("../provider/Provider");
|
|
6
|
-
const IProvider_1 = require("../provider/IProvider");
|
|
7
6
|
const DependencyMissingKeyError_1 = require("../errors/DependencyMissingKeyError");
|
|
8
7
|
const IRegistration_1 = require("./IRegistration");
|
|
9
8
|
class Registration {
|
|
10
9
|
static fromClass(Target) {
|
|
11
|
-
|
|
10
|
+
const transform = (0, utils_1.pipe)(...(0, IRegistration_1.getTransformers)(Target));
|
|
11
|
+
return transform(new Registration(() => Provider_1.Provider.fromClass(Target), Target.name));
|
|
12
12
|
}
|
|
13
13
|
static fromValue(value) {
|
|
14
|
+
if ((0, utils_1.isConstructor)(value)) {
|
|
15
|
+
const transform = (0, utils_1.pipe)(...(0, IRegistration_1.getTransformers)(value));
|
|
16
|
+
return transform(new Registration(() => Provider_1.Provider.fromValue(value), value.name));
|
|
17
|
+
}
|
|
14
18
|
return new Registration(() => Provider_1.Provider.fromValue(value));
|
|
15
19
|
}
|
|
16
20
|
static fromFn(fn) {
|
|
17
21
|
return new Registration(() => new Provider_1.Provider(fn));
|
|
18
22
|
}
|
|
19
|
-
constructor(createProvider, key) {
|
|
23
|
+
constructor(createProvider, key, matchScope = () => true) {
|
|
20
24
|
this.createProvider = createProvider;
|
|
21
25
|
this.key = key;
|
|
26
|
+
this.matchScope = matchScope;
|
|
22
27
|
this.aliases = [];
|
|
23
28
|
this.mappers = [];
|
|
24
|
-
this.matchScope = () => true;
|
|
25
29
|
}
|
|
26
30
|
to(key) {
|
|
27
31
|
this.key = key;
|
|
@@ -34,11 +38,6 @@ class Registration {
|
|
|
34
38
|
return this;
|
|
35
39
|
}
|
|
36
40
|
pipe(...mappers) {
|
|
37
|
-
const [providerMappers, registrationMappers] = (0, utils_1.groupBy)(mappers, IProvider_1.isProviderMapper);
|
|
38
|
-
this.mappers.push(...providerMappers);
|
|
39
|
-
return (0, utils_1.pipe)(...registrationMappers)(this);
|
|
40
|
-
}
|
|
41
|
-
provider(...mappers) {
|
|
42
41
|
this.mappers.push(...mappers);
|
|
43
42
|
return this;
|
|
44
43
|
}
|
package/cjm/utils.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.isConstructor = exports.constant = exports.fillEmptyIndexes = exports.pipe = void 0;
|
|
4
4
|
const pipe = (...mappers) => (value) => mappers.reduce((acc, current) => current(acc), value);
|
|
5
5
|
exports.pipe = pipe;
|
|
6
6
|
function fillEmptyIndexes(baseArr, insertArr) {
|
|
@@ -18,13 +18,3 @@ const constant = (value) => () => value;
|
|
|
18
18
|
exports.constant = constant;
|
|
19
19
|
const isConstructor = (T) => typeof T === 'function' && !!T.prototype;
|
|
20
20
|
exports.isConstructor = isConstructor;
|
|
21
|
-
function groupBy(items, predicate) {
|
|
22
|
-
const [a, b] = items.reduce(([a, b], item) => {
|
|
23
|
-
if (predicate(item)) {
|
|
24
|
-
return [a.concat(item), b];
|
|
25
|
-
}
|
|
26
|
-
return [a, b.concat(item)];
|
|
27
|
-
}, [[], []]);
|
|
28
|
-
return [a, b];
|
|
29
|
-
}
|
|
30
|
-
exports.groupBy = groupBy;
|
package/esm/index.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
export { isDependencyKey, } from './container/IContainer';
|
|
2
2
|
export { Container } from './container/Container';
|
|
3
3
|
export { EmptyContainer } from './container/EmptyContainer';
|
|
4
|
-
export {
|
|
4
|
+
export { provider, visible } from './provider/IProvider';
|
|
5
5
|
export { DependencyNotFoundError } from './errors/DependencyNotFoundError';
|
|
6
6
|
export { MethodNotImplementedError } from './errors/MethodNotImplementedError';
|
|
7
7
|
export { ContainerDisposedError } from './errors/ContainerDisposedError';
|
|
8
8
|
export { Provider } from './provider/Provider';
|
|
9
9
|
export { ProviderDecorator } from './provider/ProviderDecorator';
|
|
10
10
|
export { argsFn, args, ArgsProvider } from './provider/ArgsProvider';
|
|
11
|
-
export { singleton, SingletonProvider } from './provider/SingletonProvider';
|
|
11
|
+
export { singleton, SingletonProvider } from './provider/singleton/SingletonProvider';
|
|
12
|
+
export { MultiCache } from './provider/singleton/MultiCache';
|
|
12
13
|
export { AutoMockedContainer } from './container/AutoMockedContainer';
|
|
13
14
|
export { Registration } from './registration/Registration';
|
|
14
15
|
export { key, alias, scope, register } from './registration/IRegistration';
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { ProviderDecorator } from './ProviderDecorator';
|
|
2
|
-
import { markAsProvider } from './IProvider';
|
|
3
2
|
export function args(...extraArgs) {
|
|
4
|
-
return
|
|
3
|
+
return (provider) => new ArgsProvider(provider, () => extraArgs);
|
|
5
4
|
}
|
|
6
5
|
export function argsFn(value) {
|
|
7
|
-
return
|
|
6
|
+
return (provider) => new ArgsProvider(provider, value);
|
|
8
7
|
}
|
|
9
8
|
export class ArgsProvider extends ProviderDecorator {
|
|
10
9
|
constructor(provider, argsFn) {
|
|
@@ -13,6 +12,6 @@ export class ArgsProvider extends ProviderDecorator {
|
|
|
13
12
|
this.argsFn = argsFn;
|
|
14
13
|
}
|
|
15
14
|
resolve(container, ...args) {
|
|
16
|
-
return this.provider.resolve(container, ...this.argsFn(container), ...args);
|
|
15
|
+
return this.provider.resolve(container, ...this.argsFn(container, ...args), ...args);
|
|
17
16
|
}
|
|
18
17
|
}
|
|
@@ -2,13 +2,4 @@ import { getMetadata, setMetadata } from '../metadata';
|
|
|
2
2
|
const METADATA_KEY = 'provider';
|
|
3
3
|
export const provider = (...mappers) => setMetadata(METADATA_KEY, mappers);
|
|
4
4
|
export const getTransformers = (Target) => getMetadata(Target, METADATA_KEY) ?? [];
|
|
5
|
-
export const
|
|
6
|
-
// @ts-ignore
|
|
7
|
-
fn.__provider = true;
|
|
8
|
-
return fn;
|
|
9
|
-
};
|
|
10
|
-
export const isProviderMapper = (fn) => {
|
|
11
|
-
// @ts-ignore
|
|
12
|
-
return fn.__provider === true;
|
|
13
|
-
};
|
|
14
|
-
export const visible = (isVisibleWhen) => markAsProvider((p) => p.setVisibility(isVisibleWhen));
|
|
5
|
+
export const visible = (isVisibleWhen) => (p) => p.setVisibility(isVisibleWhen);
|
package/esm/provider/Provider.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { getTransformers } from './IProvider';
|
|
2
|
-
import { pipe } from '../utils';
|
|
2
|
+
import { isConstructor, pipe } from '../utils';
|
|
3
3
|
export class Provider {
|
|
4
4
|
static fromClass(Target) {
|
|
5
5
|
const transformers = getTransformers(Target);
|
|
6
6
|
return new Provider((container, ...args) => container.resolve(Target, { args })).pipe(...transformers);
|
|
7
7
|
}
|
|
8
8
|
static fromValue(value) {
|
|
9
|
-
|
|
9
|
+
const mappers = isConstructor(value) ? getTransformers(value) ?? [] : [];
|
|
10
|
+
return new Provider(() => value).pipe(...mappers);
|
|
10
11
|
}
|
|
11
12
|
constructor(resolveDependency, isVisibleWhen = () => true) {
|
|
12
13
|
this.resolveDependency = resolveDependency;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export class MultiCache {
|
|
2
|
+
constructor(getKey = () => '1') {
|
|
3
|
+
this.getKey = getKey;
|
|
4
|
+
this.instances = new Map();
|
|
5
|
+
}
|
|
6
|
+
hasValue(token) {
|
|
7
|
+
return this.instances.has(token);
|
|
8
|
+
}
|
|
9
|
+
getValue(token) {
|
|
10
|
+
return this.instances.get(token);
|
|
11
|
+
}
|
|
12
|
+
setValue(token, value) {
|
|
13
|
+
this.instances.set(token, value);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export const multiCache = (getKey) => new MultiCache(getKey);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ProviderDecorator } from '../ProviderDecorator';
|
|
2
|
+
import { SingleCache } from './SingleCache';
|
|
3
|
+
export function singleton(cacheProvider) {
|
|
4
|
+
return (provider) => new SingletonProvider(provider, cacheProvider ? cacheProvider() : new SingleCache());
|
|
5
|
+
}
|
|
6
|
+
export class SingletonProvider extends ProviderDecorator {
|
|
7
|
+
constructor(provider, cache) {
|
|
8
|
+
super(provider);
|
|
9
|
+
this.provider = provider;
|
|
10
|
+
this.cache = cache;
|
|
11
|
+
}
|
|
12
|
+
resolve(container, ...args) {
|
|
13
|
+
const key = this.cache.getKey(...args);
|
|
14
|
+
if (!this.cache.hasValue(key)) {
|
|
15
|
+
this.cache.setValue(key, this.provider.resolve(container, ...args));
|
|
16
|
+
}
|
|
17
|
+
return this.cache.getValue(key);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -5,4 +5,3 @@ export const scope = (predicate) => (r) => r.when(predicate);
|
|
|
5
5
|
const METADATA_KEY = 'registration';
|
|
6
6
|
export const getTransformers = (Target) => getMetadata(Target, METADATA_KEY) ?? [];
|
|
7
7
|
export const register = (...mappers) => setMetadata(METADATA_KEY, mappers);
|
|
8
|
-
export const provider = (...mappers) => (r) => r.provider(...mappers);
|
|
@@ -1,24 +1,28 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isConstructor, pipe } from '../utils';
|
|
2
2
|
import { Provider } from '../provider/Provider';
|
|
3
|
-
import { isProviderMapper } from '../provider/IProvider';
|
|
4
3
|
import { DependencyMissingKeyError } from '../errors/DependencyMissingKeyError';
|
|
5
4
|
import { getTransformers } from './IRegistration';
|
|
6
5
|
export class Registration {
|
|
7
6
|
static fromClass(Target) {
|
|
8
|
-
|
|
7
|
+
const transform = pipe(...getTransformers(Target));
|
|
8
|
+
return transform(new Registration(() => Provider.fromClass(Target), Target.name));
|
|
9
9
|
}
|
|
10
10
|
static fromValue(value) {
|
|
11
|
+
if (isConstructor(value)) {
|
|
12
|
+
const transform = pipe(...getTransformers(value));
|
|
13
|
+
return transform(new Registration(() => Provider.fromValue(value), value.name));
|
|
14
|
+
}
|
|
11
15
|
return new Registration(() => Provider.fromValue(value));
|
|
12
16
|
}
|
|
13
17
|
static fromFn(fn) {
|
|
14
18
|
return new Registration(() => new Provider(fn));
|
|
15
19
|
}
|
|
16
|
-
constructor(createProvider, key) {
|
|
20
|
+
constructor(createProvider, key, matchScope = () => true) {
|
|
17
21
|
this.createProvider = createProvider;
|
|
18
22
|
this.key = key;
|
|
23
|
+
this.matchScope = matchScope;
|
|
19
24
|
this.aliases = [];
|
|
20
25
|
this.mappers = [];
|
|
21
|
-
this.matchScope = () => true;
|
|
22
26
|
}
|
|
23
27
|
to(key) {
|
|
24
28
|
this.key = key;
|
|
@@ -31,11 +35,6 @@ export class Registration {
|
|
|
31
35
|
return this;
|
|
32
36
|
}
|
|
33
37
|
pipe(...mappers) {
|
|
34
|
-
const [providerMappers, registrationMappers] = groupBy(mappers, isProviderMapper);
|
|
35
|
-
this.mappers.push(...providerMappers);
|
|
36
|
-
return pipe(...registrationMappers)(this);
|
|
37
|
-
}
|
|
38
|
-
provider(...mappers) {
|
|
39
38
|
this.mappers.push(...mappers);
|
|
40
39
|
return this;
|
|
41
40
|
}
|
package/esm/utils.js
CHANGED
|
@@ -11,12 +11,3 @@ export function fillEmptyIndexes(baseArr, insertArr) {
|
|
|
11
11
|
}
|
|
12
12
|
export const constant = (value) => () => value;
|
|
13
13
|
export const isConstructor = (T) => typeof T === 'function' && !!T.prototype;
|
|
14
|
-
export function groupBy(items, predicate) {
|
|
15
|
-
const [a, b] = items.reduce(([a, b], item) => {
|
|
16
|
-
if (predicate(item)) {
|
|
17
|
-
return [a.concat(item), b];
|
|
18
|
-
}
|
|
19
|
-
return [a, b.concat(item)];
|
|
20
|
-
}, [[], []]);
|
|
21
|
-
return [a, b];
|
|
22
|
-
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-ioc-container",
|
|
3
|
-
"version": "31.
|
|
3
|
+
"version": "31.4.0",
|
|
4
4
|
"description": "Typescript IoC container",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public",
|
|
@@ -59,5 +59,5 @@
|
|
|
59
59
|
"ts-node": "^10.9.1",
|
|
60
60
|
"typescript": "5.4.3"
|
|
61
61
|
},
|
|
62
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "1374fb632851b79d7f7e119f7ea854037894d72f"
|
|
63
63
|
}
|
|
@@ -16,7 +16,7 @@ export declare class Container implements IContainer {
|
|
|
16
16
|
parent?: IContainer;
|
|
17
17
|
tags?: Tag[];
|
|
18
18
|
});
|
|
19
|
-
add(registration: IRegistration
|
|
19
|
+
add(registration: IRegistration): this;
|
|
20
20
|
register(key: DependencyKey, provider: IProvider, aliases?: Alias[]): this;
|
|
21
21
|
resolve<T>(token: InjectionToken<T>, { args, child }?: ResolveOptions): T;
|
|
22
22
|
createScope(...tags: Tag[]): Container;
|
|
@@ -25,7 +25,7 @@ export interface IContainer extends Resolvable, Tagged {
|
|
|
25
25
|
readonly isDisposed: boolean;
|
|
26
26
|
createScope(...tags: Tag[]): IContainer;
|
|
27
27
|
register(key: DependencyKey, value: IProvider, aliases?: Alias[]): this;
|
|
28
|
-
add(registration: IRegistration
|
|
28
|
+
add(registration: IRegistration): this;
|
|
29
29
|
removeScope(child: IContainer): void;
|
|
30
30
|
getInstances(): unknown[];
|
|
31
31
|
dispose(): void;
|
package/typings/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ export { IContainer, Resolvable, IContainerModule, isDependencyKey, DependencyKe
|
|
|
2
2
|
export { constructor } from './utils';
|
|
3
3
|
export { Container } from './container/Container';
|
|
4
4
|
export { EmptyContainer } from './container/EmptyContainer';
|
|
5
|
-
export { ResolveDependency, IProvider,
|
|
5
|
+
export { ResolveDependency, IProvider, provider, visible } from './provider/IProvider';
|
|
6
6
|
export { IInjector } from './injector/IInjector';
|
|
7
7
|
export { DependencyNotFoundError } from './errors/DependencyNotFoundError';
|
|
8
8
|
export { MethodNotImplementedError } from './errors/MethodNotImplementedError';
|
|
@@ -10,7 +10,9 @@ export { ContainerDisposedError } from './errors/ContainerDisposedError';
|
|
|
10
10
|
export { Provider } from './provider/Provider';
|
|
11
11
|
export { ProviderDecorator } from './provider/ProviderDecorator';
|
|
12
12
|
export { ArgsFn, argsFn, args, ArgsProvider } from './provider/ArgsProvider';
|
|
13
|
-
export { singleton, SingletonProvider } from './provider/SingletonProvider';
|
|
13
|
+
export { singleton, SingletonProvider } from './provider/singleton/SingletonProvider';
|
|
14
|
+
export { MultiCache } from './provider/singleton/MultiCache';
|
|
15
|
+
export { Cache } from './provider/singleton/Cache';
|
|
14
16
|
export { AutoMockedContainer } from './container/AutoMockedContainer';
|
|
15
17
|
export { Registration } from './registration/Registration';
|
|
16
18
|
export { key, alias, IRegistration, scope, register } from './registration/IRegistration';
|
|
@@ -2,7 +2,7 @@ import { ProviderDecorator } from './ProviderDecorator';
|
|
|
2
2
|
import { IContainer } from '../container/IContainer';
|
|
3
3
|
import { IProvider } from './IProvider';
|
|
4
4
|
import { MapFn } from '../utils';
|
|
5
|
-
export type ArgsFn = (l: IContainer) => unknown[];
|
|
5
|
+
export type ArgsFn = (l: IContainer, ...args: unknown[]) => unknown[];
|
|
6
6
|
export declare function args<T = unknown>(...extraArgs: unknown[]): MapFn<IProvider<T>>;
|
|
7
7
|
export declare function argsFn<T = unknown>(value: ArgsFn): MapFn<IProvider<T>>;
|
|
8
8
|
export declare class ArgsProvider<T> extends ProviderDecorator<T> {
|
|
@@ -13,6 +13,4 @@ export interface IProvider<T = unknown> {
|
|
|
13
13
|
}
|
|
14
14
|
export declare const provider: (...mappers: MapFn<IProvider>[]) => ClassDecorator;
|
|
15
15
|
export declare const getTransformers: <T>(Target: constructor<T>) => MapFn<IProvider<T>>[];
|
|
16
|
-
export declare const markAsProvider: <T>(fn: MapFn<IProvider<T>>) => MapFn<IProvider<T>>;
|
|
17
|
-
export declare const isProviderMapper: <T>(fn: unknown) => fn is MapFn<IProvider<T>>;
|
|
18
16
|
export declare const visible: (isVisibleWhen: ChildrenVisibilityPredicate) => MapFn<IProvider>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Cache } from './Cache';
|
|
2
|
+
export declare class MultiCache<K, V> implements Cache<K, V> {
|
|
3
|
+
readonly getKey: (...args: unknown[]) => K;
|
|
4
|
+
private instances;
|
|
5
|
+
constructor(getKey?: (...args: unknown[]) => K);
|
|
6
|
+
hasValue(token: K): boolean;
|
|
7
|
+
getValue(token: K): V;
|
|
8
|
+
setValue(token: K, value: V): void;
|
|
9
|
+
}
|
|
10
|
+
export declare const multiCache: <K, V>(getKey: (...args: unknown[]) => K) => MultiCache<K, V>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Cache } from './Cache';
|
|
2
|
+
export declare class SingleCache<V> implements Cache<string, V> {
|
|
3
|
+
private instance?;
|
|
4
|
+
getKey(...args: unknown[]): string;
|
|
5
|
+
getValue(key: string): V;
|
|
6
|
+
hasValue(key: string): boolean;
|
|
7
|
+
setValue(key: string, value: V): void;
|
|
8
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { IContainer } from '../../container/IContainer';
|
|
2
|
+
import { ProviderDecorator } from '../ProviderDecorator';
|
|
3
|
+
import { IProvider } from '../IProvider';
|
|
4
|
+
import { MapFn } from '../../utils';
|
|
5
|
+
import { Cache } from './Cache';
|
|
6
|
+
export declare function singleton<T = unknown>(cacheProvider?: () => Cache<unknown, T>): MapFn<IProvider<T>>;
|
|
7
|
+
export declare class SingletonProvider<T> extends ProviderDecorator<T> {
|
|
8
|
+
private readonly provider;
|
|
9
|
+
private readonly cache;
|
|
10
|
+
constructor(provider: IProvider<T>, cache: Cache<unknown, T>);
|
|
11
|
+
resolve(container: IContainer, ...args: unknown[]): T;
|
|
12
|
+
}
|
|
@@ -6,12 +6,10 @@ export interface IRegistration<T = unknown> extends IContainerModule {
|
|
|
6
6
|
addAliases(...aliases: Alias[]): this;
|
|
7
7
|
when(isValidWhen: ScopePredicate): this;
|
|
8
8
|
to(key: DependencyKey): this;
|
|
9
|
-
pipe(...mappers:
|
|
10
|
-
provider(...mappers: MapFn<IProvider<T>>[]): this;
|
|
9
|
+
pipe(...mappers: MapFn<IProvider<T>>[]): this;
|
|
11
10
|
}
|
|
12
11
|
export declare const key: (key: DependencyKey) => MapFn<IRegistration>;
|
|
13
12
|
export declare const alias: (...aliases: Alias[]) => MapFn<IRegistration>;
|
|
14
13
|
export declare const scope: (predicate: ScopePredicate) => MapFn<IRegistration>;
|
|
15
|
-
export declare const getTransformers:
|
|
16
|
-
export declare const register: (...mappers:
|
|
17
|
-
export declare const provider: (...mappers: MapFn<IProvider>[]) => MapFn<IRegistration>;
|
|
14
|
+
export declare const getTransformers: (Target: constructor<unknown>) => MapFn<IRegistration<unknown>>[];
|
|
15
|
+
export declare const register: (...mappers: MapFn<IRegistration>[]) => ClassDecorator;
|
|
@@ -5,17 +5,16 @@ import { IRegistration, ScopePredicate } from './IRegistration';
|
|
|
5
5
|
export declare class Registration<T = unknown> implements IRegistration<T> {
|
|
6
6
|
private createProvider;
|
|
7
7
|
private key?;
|
|
8
|
-
|
|
9
|
-
static
|
|
8
|
+
private matchScope;
|
|
9
|
+
static fromClass<T>(Target: constructor<T>): IRegistration<unknown>;
|
|
10
|
+
static fromValue<T>(value: T): IRegistration<unknown>;
|
|
10
11
|
static fromFn<T>(fn: ResolveDependency<T>): Registration<T>;
|
|
11
12
|
private aliases;
|
|
12
13
|
private mappers;
|
|
13
|
-
|
|
14
|
-
constructor(createProvider: () => IProvider<T>, key?: DependencyKey | undefined);
|
|
14
|
+
constructor(createProvider: () => IProvider<T>, key?: DependencyKey | undefined, matchScope?: ScopePredicate);
|
|
15
15
|
to(key: DependencyKey): this;
|
|
16
16
|
addAliases(...aliases: Alias[]): this;
|
|
17
|
-
pipe(...mappers:
|
|
18
|
-
provider(...mappers: MapFn<IProvider<T>>[]): this;
|
|
17
|
+
pipe(...mappers: MapFn<IProvider<T>>[]): this;
|
|
19
18
|
applyTo(container: IContainer): void;
|
|
20
19
|
when(isValidWhen: ScopePredicate): this;
|
|
21
20
|
}
|
package/typings/utils.d.ts
CHANGED
|
@@ -4,4 +4,3 @@ export declare const pipe: <T>(...mappers: MapFn<T>[]) => MapFn<T>;
|
|
|
4
4
|
export declare function fillEmptyIndexes<T>(baseArr: (T | undefined)[], insertArr: T[]): T[];
|
|
5
5
|
export declare const constant: <T>(value: T) => () => T;
|
|
6
6
|
export declare const isConstructor: (T: unknown) => T is constructor<unknown>;
|
|
7
|
-
export declare function groupBy<T>(items: T[], predicate: (value: T) => boolean): T[][];
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SingletonProvider = exports.singleton = void 0;
|
|
4
|
-
const ProviderDecorator_1 = require("./ProviderDecorator");
|
|
5
|
-
const IProvider_1 = require("./IProvider");
|
|
6
|
-
function singleton() {
|
|
7
|
-
return (0, IProvider_1.markAsProvider)((provider) => new SingletonProvider(provider));
|
|
8
|
-
}
|
|
9
|
-
exports.singleton = singleton;
|
|
10
|
-
class SingletonProvider extends ProviderDecorator_1.ProviderDecorator {
|
|
11
|
-
constructor(provider) {
|
|
12
|
-
super(provider);
|
|
13
|
-
this.provider = provider;
|
|
14
|
-
}
|
|
15
|
-
resolve(container, ...args) {
|
|
16
|
-
this.instance = this.instance ?? { value: this.provider.resolve(container, ...args) };
|
|
17
|
-
return this.instance.value;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
exports.SingletonProvider = SingletonProvider;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { ProviderDecorator } from './ProviderDecorator';
|
|
2
|
-
import { markAsProvider } from './IProvider';
|
|
3
|
-
export function singleton() {
|
|
4
|
-
return markAsProvider((provider) => new SingletonProvider(provider));
|
|
5
|
-
}
|
|
6
|
-
export class SingletonProvider extends ProviderDecorator {
|
|
7
|
-
constructor(provider) {
|
|
8
|
-
super(provider);
|
|
9
|
-
this.provider = provider;
|
|
10
|
-
}
|
|
11
|
-
resolve(container, ...args) {
|
|
12
|
-
this.instance = this.instance ?? { value: this.provider.resolve(container, ...args) };
|
|
13
|
-
return this.instance.value;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { IContainer } from '../container/IContainer';
|
|
2
|
-
import { ProviderDecorator } from './ProviderDecorator';
|
|
3
|
-
import { IProvider } from './IProvider';
|
|
4
|
-
import { MapFn } from '../utils';
|
|
5
|
-
export declare function singleton<T = unknown>(): MapFn<IProvider<T>>;
|
|
6
|
-
export declare class SingletonProvider<T> extends ProviderDecorator<T> {
|
|
7
|
-
private readonly provider;
|
|
8
|
-
private instance?;
|
|
9
|
-
constructor(provider: IProvider<T>);
|
|
10
|
-
resolve(container: IContainer, ...args: unknown[]): T;
|
|
11
|
-
}
|