ts-ioc-container 30.0.2 → 30.1.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 +1 -1
- package/cjm/container/AutoMockedContainer.js +3 -0
- package/cjm/container/Container.js +17 -4
- package/cjm/container/EmptyContainer.js +3 -0
- package/cjm/index.js +2 -1
- package/cjm/provider/Provider.js +10 -3
- package/cjm/provider/ProviderDecorator.js +4 -0
- package/esm/container/AutoMockedContainer.js +4 -1
- package/esm/container/Container.js +17 -4
- package/esm/container/EmptyContainer.js +3 -0
- package/esm/index.js +1 -1
- package/esm/provider/Provider.js +8 -2
- package/esm/provider/ProviderDecorator.js +4 -0
- package/package.json +2 -2
- package/typings/container/AutoMockedContainer.d.ts +2 -1
- package/typings/container/Container.d.ts +2 -0
- package/typings/container/EmptyContainer.d.ts +1 -0
- package/typings/container/IContainer.d.ts +1 -0
- package/typings/index.d.ts +1 -1
- package/typings/provider/IProvider.d.ts +2 -1
- package/typings/provider/Provider.d.ts +5 -2
- package/typings/provider/ProviderDecorator.d.ts +1 -0
package/README.md
CHANGED
|
@@ -855,7 +855,7 @@ import { IMock, Mock } from 'moq.ts';
|
|
|
855
855
|
export class MoqContainer extends AutoMockedContainer {
|
|
856
856
|
private mocks = new Map<DependencyKey, IMock<any>>();
|
|
857
857
|
|
|
858
|
-
|
|
858
|
+
resolveFromChild<T>(key: DependencyKey): T {
|
|
859
859
|
return this.resolveMock<T>(key).object();
|
|
860
860
|
}
|
|
861
861
|
|
|
@@ -12,6 +12,9 @@ class AutoMockedContainer {
|
|
|
12
12
|
createScope() {
|
|
13
13
|
throw new index_1.MethodNotImplementedError();
|
|
14
14
|
}
|
|
15
|
+
resolve(key, ...args) {
|
|
16
|
+
throw new index_1.DependencyNotFoundError(`Cannot find ${key.toString()}`);
|
|
17
|
+
}
|
|
15
18
|
dispose() { }
|
|
16
19
|
register() {
|
|
17
20
|
return this;
|
|
@@ -26,12 +26,25 @@ class Container {
|
|
|
26
26
|
resolve(token, ...args) {
|
|
27
27
|
this.validateContainer();
|
|
28
28
|
if ((0, IContainer_1.isConstructor)(token)) {
|
|
29
|
-
|
|
30
|
-
this.instances.add(instance);
|
|
31
|
-
return instance;
|
|
29
|
+
return this.resolveByConstructor(token, ...args);
|
|
32
30
|
}
|
|
33
31
|
const provider = this.providers.get(token);
|
|
34
|
-
return provider?.isValid(this) ? provider.resolve(this, ...args) : this.parent.
|
|
32
|
+
return provider?.isValid(this) ? provider.resolve(this, ...args) : this.parent.resolveFromChild(token, ...args);
|
|
33
|
+
}
|
|
34
|
+
resolveFromChild(token, ...args) {
|
|
35
|
+
this.validateContainer();
|
|
36
|
+
if ((0, IContainer_1.isConstructor)(token)) {
|
|
37
|
+
return this.resolveByConstructor(token, ...args);
|
|
38
|
+
}
|
|
39
|
+
const provider = this.providers.get(token);
|
|
40
|
+
return provider?.isValid(this, true)
|
|
41
|
+
? provider.resolve(this, ...args)
|
|
42
|
+
: this.parent.resolveFromChild(token, ...args);
|
|
43
|
+
}
|
|
44
|
+
resolveByConstructor(token, ...args) {
|
|
45
|
+
const instance = this.injector.resolve(this, token, ...args);
|
|
46
|
+
this.instances.add(instance);
|
|
47
|
+
return instance;
|
|
35
48
|
}
|
|
36
49
|
createScope(...tags) {
|
|
37
50
|
this.validateContainer();
|
|
@@ -25,6 +25,9 @@ class EmptyContainer {
|
|
|
25
25
|
resolve(key) {
|
|
26
26
|
throw new DependencyNotFoundError_1.DependencyNotFoundError(`Cannot find ${key.toString()}`);
|
|
27
27
|
}
|
|
28
|
+
resolveFromChild(key, ...args) {
|
|
29
|
+
throw new DependencyNotFoundError_1.DependencyNotFoundError(`Cannot find ${key.toString()}`);
|
|
30
|
+
}
|
|
28
31
|
getAllProviders() {
|
|
29
32
|
return new Map();
|
|
30
33
|
}
|
package/cjm/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.setParameterMetadata = exports.getMetadata = exports.setMetadata = exports.by = exports.hook = exports.getHooks = exports.ProxyInjector = exports.SimpleInjector = exports.inject = exports.MetadataInjector = exports.alias = exports.register = exports.Registration = exports.key = exports.AutoMockedContainer = exports.ScopeProvider = exports.scope = exports.SingletonProvider = exports.singleton = exports.ArgsProvider = exports.args = exports.argsFn = exports.provider = exports.Provider = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyNotFoundError = exports.EmptyContainer = exports.Container = exports.isDependencyKey = void 0;
|
|
3
|
+
exports.setParameterMetadata = exports.getMetadata = exports.setMetadata = exports.by = exports.hook = exports.getHooks = exports.ProxyInjector = exports.SimpleInjector = exports.inject = exports.MetadataInjector = exports.alias = exports.register = exports.Registration = exports.key = exports.AutoMockedContainer = exports.ScopeProvider = exports.scope = exports.SingletonProvider = exports.singleton = exports.ArgsProvider = exports.args = exports.argsFn = exports.hideFromChildren = exports.provider = exports.Provider = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyNotFoundError = 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");
|
|
@@ -16,6 +16,7 @@ Object.defineProperty(exports, "ContainerDisposedError", { enumerable: true, get
|
|
|
16
16
|
var Provider_1 = require("./provider/Provider");
|
|
17
17
|
Object.defineProperty(exports, "Provider", { enumerable: true, get: function () { return Provider_1.Provider; } });
|
|
18
18
|
Object.defineProperty(exports, "provider", { enumerable: true, get: function () { return Provider_1.provider; } });
|
|
19
|
+
Object.defineProperty(exports, "hideFromChildren", { enumerable: true, get: function () { return Provider_1.hideFromChildren; } });
|
|
19
20
|
var ArgsProvider_1 = require("./provider/ArgsProvider");
|
|
20
21
|
Object.defineProperty(exports, "argsFn", { enumerable: true, get: function () { return ArgsProvider_1.argsFn; } });
|
|
21
22
|
Object.defineProperty(exports, "args", { enumerable: true, get: function () { return ArgsProvider_1.args; } });
|
package/cjm/provider/Provider.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Provider = exports.provider = void 0;
|
|
3
|
+
exports.Provider = exports.hideFromChildren = exports.provider = void 0;
|
|
4
4
|
const utils_1 = require("../utils");
|
|
5
5
|
const metadata_1 = require("../metadata");
|
|
6
6
|
const PROVIDER_KEY = 'provider';
|
|
7
7
|
const provider = (...mappers) => (0, metadata_1.setMetadata)(PROVIDER_KEY, mappers);
|
|
8
8
|
exports.provider = provider;
|
|
9
|
+
const hideFromChildren = (p) => p.hideFromChildren();
|
|
10
|
+
exports.hideFromChildren = hideFromChildren;
|
|
9
11
|
class Provider {
|
|
10
12
|
static fromClass(Target) {
|
|
11
13
|
const mappers = (0, metadata_1.getMetadata)(Target, PROVIDER_KEY) ?? [];
|
|
@@ -16,6 +18,7 @@ class Provider {
|
|
|
16
18
|
}
|
|
17
19
|
constructor(resolveDependency) {
|
|
18
20
|
this.resolveDependency = resolveDependency;
|
|
21
|
+
this.isHiddenFromChildren = false;
|
|
19
22
|
}
|
|
20
23
|
pipe(...mappers) {
|
|
21
24
|
return (0, utils_1.pipe)(...mappers)(this);
|
|
@@ -26,8 +29,12 @@ class Provider {
|
|
|
26
29
|
resolve(container, ...args) {
|
|
27
30
|
return this.resolveDependency(container, ...args);
|
|
28
31
|
}
|
|
29
|
-
|
|
30
|
-
|
|
32
|
+
hideFromChildren() {
|
|
33
|
+
this.isHiddenFromChildren = true;
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
isValid(container, fromChild = false) {
|
|
37
|
+
return !(this.isHiddenFromChildren && fromChild);
|
|
31
38
|
}
|
|
32
39
|
}
|
|
33
40
|
exports.Provider = Provider;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MethodNotImplementedError } from '../index';
|
|
1
|
+
import { MethodNotImplementedError, DependencyNotFoundError, } from '../index';
|
|
2
2
|
export class AutoMockedContainer {
|
|
3
3
|
getKeysByAlias(alias) {
|
|
4
4
|
return [];
|
|
@@ -9,6 +9,9 @@ export class AutoMockedContainer {
|
|
|
9
9
|
createScope() {
|
|
10
10
|
throw new MethodNotImplementedError();
|
|
11
11
|
}
|
|
12
|
+
resolve(key, ...args) {
|
|
13
|
+
throw new DependencyNotFoundError(`Cannot find ${key.toString()}`);
|
|
14
|
+
}
|
|
12
15
|
dispose() { }
|
|
13
16
|
register() {
|
|
14
17
|
return this;
|
|
@@ -23,12 +23,25 @@ export class Container {
|
|
|
23
23
|
resolve(token, ...args) {
|
|
24
24
|
this.validateContainer();
|
|
25
25
|
if (isConstructor(token)) {
|
|
26
|
-
|
|
27
|
-
this.instances.add(instance);
|
|
28
|
-
return instance;
|
|
26
|
+
return this.resolveByConstructor(token, ...args);
|
|
29
27
|
}
|
|
30
28
|
const provider = this.providers.get(token);
|
|
31
|
-
return provider?.isValid(this) ? provider.resolve(this, ...args) : this.parent.
|
|
29
|
+
return provider?.isValid(this) ? provider.resolve(this, ...args) : this.parent.resolveFromChild(token, ...args);
|
|
30
|
+
}
|
|
31
|
+
resolveFromChild(token, ...args) {
|
|
32
|
+
this.validateContainer();
|
|
33
|
+
if (isConstructor(token)) {
|
|
34
|
+
return this.resolveByConstructor(token, ...args);
|
|
35
|
+
}
|
|
36
|
+
const provider = this.providers.get(token);
|
|
37
|
+
return provider?.isValid(this, true)
|
|
38
|
+
? provider.resolve(this, ...args)
|
|
39
|
+
: this.parent.resolveFromChild(token, ...args);
|
|
40
|
+
}
|
|
41
|
+
resolveByConstructor(token, ...args) {
|
|
42
|
+
const instance = this.injector.resolve(this, token, ...args);
|
|
43
|
+
this.instances.add(instance);
|
|
44
|
+
return instance;
|
|
32
45
|
}
|
|
33
46
|
createScope(...tags) {
|
|
34
47
|
this.validateContainer();
|
|
@@ -22,6 +22,9 @@ export class EmptyContainer {
|
|
|
22
22
|
resolve(key) {
|
|
23
23
|
throw new DependencyNotFoundError(`Cannot find ${key.toString()}`);
|
|
24
24
|
}
|
|
25
|
+
resolveFromChild(key, ...args) {
|
|
26
|
+
throw new DependencyNotFoundError(`Cannot find ${key.toString()}`);
|
|
27
|
+
}
|
|
25
28
|
getAllProviders() {
|
|
26
29
|
return new Map();
|
|
27
30
|
}
|
package/esm/index.js
CHANGED
|
@@ -4,7 +4,7 @@ export { EmptyContainer } from './container/EmptyContainer';
|
|
|
4
4
|
export { DependencyNotFoundError } from './errors/DependencyNotFoundError';
|
|
5
5
|
export { MethodNotImplementedError } from './errors/MethodNotImplementedError';
|
|
6
6
|
export { ContainerDisposedError } from './errors/ContainerDisposedError';
|
|
7
|
-
export { Provider, provider } from './provider/Provider';
|
|
7
|
+
export { Provider, provider, hideFromChildren } from './provider/Provider';
|
|
8
8
|
export { argsFn, args, ArgsProvider } from './provider/ArgsProvider';
|
|
9
9
|
export { singleton, SingletonProvider } from './provider/SingletonProvider';
|
|
10
10
|
export { scope, ScopeProvider } from './provider/ScopeProvider';
|
package/esm/provider/Provider.js
CHANGED
|
@@ -2,6 +2,7 @@ import { pipe } from '../utils';
|
|
|
2
2
|
import { getMetadata, setMetadata } from '../metadata';
|
|
3
3
|
const PROVIDER_KEY = 'provider';
|
|
4
4
|
export const provider = (...mappers) => setMetadata(PROVIDER_KEY, mappers);
|
|
5
|
+
export const hideFromChildren = (p) => p.hideFromChildren();
|
|
5
6
|
export class Provider {
|
|
6
7
|
static fromClass(Target) {
|
|
7
8
|
const mappers = getMetadata(Target, PROVIDER_KEY) ?? [];
|
|
@@ -12,6 +13,7 @@ export class Provider {
|
|
|
12
13
|
}
|
|
13
14
|
constructor(resolveDependency) {
|
|
14
15
|
this.resolveDependency = resolveDependency;
|
|
16
|
+
this.isHiddenFromChildren = false;
|
|
15
17
|
}
|
|
16
18
|
pipe(...mappers) {
|
|
17
19
|
return pipe(...mappers)(this);
|
|
@@ -22,7 +24,11 @@ export class Provider {
|
|
|
22
24
|
resolve(container, ...args) {
|
|
23
25
|
return this.resolveDependency(container, ...args);
|
|
24
26
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
hideFromChildren() {
|
|
28
|
+
this.isHiddenFromChildren = true;
|
|
29
|
+
return this;
|
|
30
|
+
}
|
|
31
|
+
isValid(container, fromChild = false) {
|
|
32
|
+
return !(this.isHiddenFromChildren && fromChild);
|
|
27
33
|
}
|
|
28
34
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-ioc-container",
|
|
3
|
-
"version": "30.0
|
|
3
|
+
"version": "30.1.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": "2f754797a42e434073c21b71b0ac7cf76e8b4fec"
|
|
63
63
|
}
|
|
@@ -4,7 +4,8 @@ export declare abstract class AutoMockedContainer implements IContainer {
|
|
|
4
4
|
getKeysByAlias(alias: AliasPredicate): DependencyKey[];
|
|
5
5
|
hasDependency(key: string): boolean;
|
|
6
6
|
createScope(): IContainer;
|
|
7
|
-
|
|
7
|
+
resolve<T>(key: InjectionToken<T>, ...args: unknown[]): T;
|
|
8
|
+
abstract resolveFromChild<T>(key: InjectionToken<T>, ...args: unknown[]): T;
|
|
8
9
|
dispose(): void;
|
|
9
10
|
register(): this;
|
|
10
11
|
getInstances(): unknown[];
|
|
@@ -16,6 +16,8 @@ export declare class Container implements IContainer {
|
|
|
16
16
|
});
|
|
17
17
|
register(key: DependencyKey, provider: IProvider, aliases?: Alias[]): this;
|
|
18
18
|
resolve<T>(token: InjectionToken<T>, ...args: unknown[]): T;
|
|
19
|
+
resolveFromChild<T>(token: InjectionToken<T>, ...args: unknown[]): T;
|
|
20
|
+
private resolveByConstructor;
|
|
19
21
|
createScope(...tags: Tag[]): Container;
|
|
20
22
|
dispose(): void;
|
|
21
23
|
getInstances(): unknown[];
|
|
@@ -8,6 +8,7 @@ export declare class EmptyContainer implements IContainer {
|
|
|
8
8
|
dispose(): void;
|
|
9
9
|
register(key: DependencyKey, value: IProvider): this;
|
|
10
10
|
resolve<T>(key: InjectionToken<T>): T;
|
|
11
|
+
resolveFromChild<T>(key: InjectionToken<T>, ...args: unknown[]): T;
|
|
11
12
|
getAllProviders(): Map<DependencyKey, IProvider>;
|
|
12
13
|
getInstances(): unknown[];
|
|
13
14
|
removeScope(): void;
|
|
@@ -7,6 +7,7 @@ export declare function isConstructor<T>(token: InjectionToken<T>): token is con
|
|
|
7
7
|
export type InjectionToken<T = unknown> = constructor<T> | DependencyKey;
|
|
8
8
|
export interface Resolvable {
|
|
9
9
|
resolve<T>(key: InjectionToken<T>, ...args: unknown[]): T;
|
|
10
|
+
resolveFromChild<T>(key: InjectionToken<T>, ...args: unknown[]): T;
|
|
10
11
|
}
|
|
11
12
|
export interface IContainerModule {
|
|
12
13
|
applyTo(container: IContainer): void;
|
package/typings/index.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export { IInjector } from './injector/IInjector';
|
|
|
7
7
|
export { DependencyNotFoundError } from './errors/DependencyNotFoundError';
|
|
8
8
|
export { MethodNotImplementedError } from './errors/MethodNotImplementedError';
|
|
9
9
|
export { ContainerDisposedError } from './errors/ContainerDisposedError';
|
|
10
|
-
export { Provider, provider } from './provider/Provider';
|
|
10
|
+
export { Provider, provider, hideFromChildren } from './provider/Provider';
|
|
11
11
|
export { ArgsFn, argsFn, args, ArgsProvider } from './provider/ArgsProvider';
|
|
12
12
|
export { singleton, SingletonProvider } from './provider/SingletonProvider';
|
|
13
13
|
export { scope, ScopeProvider } from './provider/ScopeProvider';
|
|
@@ -4,6 +4,7 @@ export type ResolveDependency<T = unknown> = (container: Resolvable, ...args: un
|
|
|
4
4
|
export interface IProvider<T = unknown> {
|
|
5
5
|
clone(): IProvider<T>;
|
|
6
6
|
resolve(container: Resolvable, ...args: unknown[]): T;
|
|
7
|
-
isValid(container: Tagged): boolean;
|
|
7
|
+
isValid(container: Tagged, fromChild?: boolean): boolean;
|
|
8
8
|
pipe(...mappers: MapFn<IProvider<T>>[]): IProvider<T>;
|
|
9
|
+
hideFromChildren(): this;
|
|
9
10
|
}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { IProvider, ResolveDependency } from './IProvider';
|
|
2
|
-
import { Resolvable } from '../container/IContainer';
|
|
2
|
+
import { Resolvable, Tagged } from '../container/IContainer';
|
|
3
3
|
import { constructor, MapFn } from '../utils';
|
|
4
4
|
export declare const provider: (...mappers: MapFn<IProvider>[]) => ClassDecorator;
|
|
5
|
+
export declare const hideFromChildren: MapFn<IProvider>;
|
|
5
6
|
export declare class Provider<T> implements IProvider<T> {
|
|
6
7
|
private readonly resolveDependency;
|
|
7
8
|
static fromClass<T>(Target: constructor<T>): IProvider<T>;
|
|
8
9
|
static fromValue<T>(value: T): Provider<T>;
|
|
10
|
+
private isHiddenFromChildren;
|
|
9
11
|
constructor(resolveDependency: ResolveDependency<T>);
|
|
10
12
|
pipe(...mappers: MapFn<IProvider<T>>[]): IProvider<T>;
|
|
11
13
|
clone(): Provider<T>;
|
|
12
14
|
resolve(container: Resolvable, ...args: unknown[]): T;
|
|
13
|
-
|
|
15
|
+
hideFromChildren(): this;
|
|
16
|
+
isValid(container: Tagged, fromChild?: boolean): boolean;
|
|
14
17
|
}
|
|
@@ -4,6 +4,7 @@ import { MapFn } from '../utils';
|
|
|
4
4
|
export declare abstract class ProviderDecorator<T> implements IProvider<T> {
|
|
5
5
|
private decorated;
|
|
6
6
|
protected constructor(decorated: IProvider<T>);
|
|
7
|
+
hideFromChildren(): this;
|
|
7
8
|
abstract clone(): IProvider<T>;
|
|
8
9
|
isValid(container: Tagged): boolean;
|
|
9
10
|
resolve(container: Resolvable, ...args: any[]): T;
|