ts-ioc-container 32.0.7 → 32.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 -2
- package/cjm/{utils/autorun.js → autorun.js} +19 -3
- package/cjm/index.js +5 -2
- package/cjm/injector/MetadataInjector.js +11 -5
- package/esm/{utils/autorun.js → autorun.js} +17 -2
- package/esm/index.js +2 -2
- package/esm/injector/MetadataInjector.js +8 -4
- package/package.json +2 -2
- package/typings/autorun.d.ts +16 -0
- package/typings/index.d.ts +2 -2
- package/typings/injector/MetadataInjector.d.ts +2 -0
- package/typings/utils/autorun.d.ts +0 -12
package/README.md
CHANGED
|
@@ -1207,7 +1207,6 @@ import {
|
|
|
1207
1207
|
MetadataInjector,
|
|
1208
1208
|
register,
|
|
1209
1209
|
} from 'ts-ioc-container';
|
|
1210
|
-
import * as console from 'node:console';
|
|
1211
1210
|
|
|
1212
1211
|
@register(key('logsRepo'))
|
|
1213
1212
|
@provider(singleton())
|
|
@@ -1225,7 +1224,7 @@ class Logger {
|
|
|
1225
1224
|
|
|
1226
1225
|
constructor(@inject(by.key('logsRepo')) private logsRepo: LogsRepo) {}
|
|
1227
1226
|
|
|
1228
|
-
log(message: string): void {
|
|
1227
|
+
log(@inject(by.key('logsRepo')) message: string): void {
|
|
1229
1228
|
this.messages.push(message);
|
|
1230
1229
|
}
|
|
1231
1230
|
|
|
@@ -1,7 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.startAutorun = exports.getAutorunHooks = exports.autorun = void 0;
|
|
3
|
+
exports.startAutorun = exports.getAutorunHooks = exports.autorun = exports.AutorunContext = void 0;
|
|
4
|
+
const MetadataInjector_1 = require("./injector/MetadataInjector");
|
|
4
5
|
const METADATA_KEY = 'autorun';
|
|
6
|
+
class AutorunContext {
|
|
7
|
+
constructor(instance, methodName, scope) {
|
|
8
|
+
this.instance = instance;
|
|
9
|
+
this.methodName = methodName;
|
|
10
|
+
this.scope = scope;
|
|
11
|
+
}
|
|
12
|
+
resolveArgs(...args) {
|
|
13
|
+
return (0, MetadataInjector_1.resolveArgs)(this.instance.constructor, this.methodName)(this.scope, ...args);
|
|
14
|
+
}
|
|
15
|
+
invokeMethod({ args = this.resolveArgs() }) {
|
|
16
|
+
// @ts-ignore
|
|
17
|
+
return this.instance[this.methodName](...args);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.AutorunContext = AutorunContext;
|
|
5
21
|
const createStore = () => new Map();
|
|
6
22
|
const autorun = (execute) => (target, propertyKey) => {
|
|
7
23
|
const hooks = Reflect.hasMetadata(METADATA_KEY, target.constructor)
|
|
@@ -17,9 +33,9 @@ const getAutorunHooks = (target) => {
|
|
|
17
33
|
: new Map();
|
|
18
34
|
};
|
|
19
35
|
exports.getAutorunHooks = getAutorunHooks;
|
|
20
|
-
const startAutorun = (target, createContext = (c) => c) => {
|
|
36
|
+
const startAutorun = (target, scope, createContext = (c) => c) => {
|
|
21
37
|
for (const [methodName, execute] of (0, exports.getAutorunHooks)(target)) {
|
|
22
|
-
execute(createContext(
|
|
38
|
+
execute(createContext(new AutorunContext(target, methodName, scope)));
|
|
23
39
|
}
|
|
24
40
|
};
|
|
25
41
|
exports.startAutorun = startAutorun;
|
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.startAutorun = exports.autorun = exports.byAliases = exports.byAlias = exports.IMemoKey = exports.by = exports.hasHooks = exports.hook = exports.getHooks = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyNotFoundError = exports.Registration = exports.register = exports.scope = exports.key = exports.decorate = exports.multiCache = exports.MultiCache = exports.SingletonProvider = exports.singleton = exports.Provider = exports.ProviderDecorator = exports.args = exports.argsFn = exports.alias = exports.visible = exports.provider = exports.ProxyInjector = exports.SimpleInjector = exports.inject = exports.MetadataInjector = exports.AutoMockedContainer = exports.EmptyContainer = exports.Container = exports.isDependencyKey = void 0;
|
|
3
|
+
exports.getParameterMetadata = exports.getMethodMetadata = exports.setMethodMetadata = exports.setParameterMetadata = exports.getMetadata = exports.setMetadata = exports.AutorunContext = exports.startAutorun = exports.autorun = exports.byAliases = exports.byAlias = exports.IMemoKey = exports.by = exports.hasHooks = exports.hook = exports.getHooks = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyNotFoundError = exports.Registration = exports.register = exports.scope = exports.key = exports.decorate = exports.multiCache = exports.MultiCache = exports.SingletonProvider = exports.singleton = exports.Provider = exports.ProviderDecorator = exports.args = exports.argsFn = exports.alias = exports.visible = exports.provider = exports.ProxyInjector = exports.SimpleInjector = exports.getInjectFns = exports.resolveArgs = exports.inject = exports.MetadataInjector = exports.AutoMockedContainer = exports.EmptyContainer = exports.Container = exports.isDependencyKey = void 0;
|
|
4
4
|
// Containers
|
|
5
5
|
var IContainer_1 = require("./container/IContainer");
|
|
6
6
|
Object.defineProperty(exports, "isDependencyKey", { enumerable: true, get: function () { return IContainer_1.isDependencyKey; } });
|
|
@@ -13,6 +13,8 @@ Object.defineProperty(exports, "AutoMockedContainer", { enumerable: true, get: f
|
|
|
13
13
|
var MetadataInjector_1 = require("./injector/MetadataInjector");
|
|
14
14
|
Object.defineProperty(exports, "MetadataInjector", { enumerable: true, get: function () { return MetadataInjector_1.MetadataInjector; } });
|
|
15
15
|
Object.defineProperty(exports, "inject", { enumerable: true, get: function () { return MetadataInjector_1.inject; } });
|
|
16
|
+
Object.defineProperty(exports, "resolveArgs", { enumerable: true, get: function () { return MetadataInjector_1.resolveArgs; } });
|
|
17
|
+
Object.defineProperty(exports, "getInjectFns", { enumerable: true, get: function () { return MetadataInjector_1.getInjectFns; } });
|
|
16
18
|
var SimpleInjector_1 = require("./injector/SimpleInjector");
|
|
17
19
|
Object.defineProperty(exports, "SimpleInjector", { enumerable: true, get: function () { return SimpleInjector_1.SimpleInjector; } });
|
|
18
20
|
var ProxyInjector_1 = require("./injector/ProxyInjector");
|
|
@@ -59,9 +61,10 @@ Object.defineProperty(exports, "by", { enumerable: true, get: function () { retu
|
|
|
59
61
|
Object.defineProperty(exports, "IMemoKey", { enumerable: true, get: function () { return by_1.IMemoKey; } });
|
|
60
62
|
Object.defineProperty(exports, "byAlias", { enumerable: true, get: function () { return by_1.byAlias; } });
|
|
61
63
|
Object.defineProperty(exports, "byAliases", { enumerable: true, get: function () { return by_1.byAliases; } });
|
|
62
|
-
var autorun_1 = require("./
|
|
64
|
+
var autorun_1 = require("./autorun");
|
|
63
65
|
Object.defineProperty(exports, "autorun", { enumerable: true, get: function () { return autorun_1.autorun; } });
|
|
64
66
|
Object.defineProperty(exports, "startAutorun", { enumerable: true, get: function () { return autorun_1.startAutorun; } });
|
|
67
|
+
Object.defineProperty(exports, "AutorunContext", { enumerable: true, get: function () { return autorun_1.AutorunContext; } });
|
|
65
68
|
var metadata_1 = require("./metadata");
|
|
66
69
|
Object.defineProperty(exports, "setMetadata", { enumerable: true, get: function () { return metadata_1.setMetadata; } });
|
|
67
70
|
Object.defineProperty(exports, "getMetadata", { enumerable: true, get: function () { return metadata_1.getMetadata; } });
|
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MetadataInjector = exports.inject = void 0;
|
|
3
|
+
exports.MetadataInjector = exports.resolveArgs = exports.inject = exports.getInjectFns = void 0;
|
|
4
4
|
const utils_1 = require("../utils");
|
|
5
5
|
const metadata_1 = require("../metadata");
|
|
6
6
|
const METADATA_KEY = 'inject';
|
|
7
|
-
const getInjectFns = (Target) => (0, metadata_1.getParameterMetadata)(
|
|
8
|
-
|
|
7
|
+
const getInjectFns = (Target, methodName) => (0, metadata_1.getParameterMetadata)(metaKey(methodName), Target);
|
|
8
|
+
exports.getInjectFns = getInjectFns;
|
|
9
|
+
const metaKey = (methodName = 'constructor') => `${METADATA_KEY}:${methodName}`;
|
|
10
|
+
const inject = (fn) => (target, propertyKey, parameterIndex) => (0, metadata_1.setParameterMetadata)(metaKey(propertyKey), fn)(target, propertyKey, parameterIndex);
|
|
9
11
|
exports.inject = inject;
|
|
12
|
+
const resolveArgs = (Target, methodName) => {
|
|
13
|
+
const argsFns = (0, exports.getInjectFns)(Target, methodName);
|
|
14
|
+
return (scope, ...deps) => (0, utils_1.fillEmptyIndexes)(argsFns, deps.map(utils_1.constant)).map((fn) => fn(scope));
|
|
15
|
+
};
|
|
16
|
+
exports.resolveArgs = resolveArgs;
|
|
10
17
|
class MetadataInjector {
|
|
11
18
|
resolve(container, Target, { args: deps }) {
|
|
12
|
-
const
|
|
13
|
-
const args = (0, utils_1.fillEmptyIndexes)(injectionFns, deps.map(utils_1.constant)).map((fn) => fn(container));
|
|
19
|
+
const args = (0, exports.resolveArgs)(Target)(container, ...deps);
|
|
14
20
|
return new Target(...args);
|
|
15
21
|
}
|
|
16
22
|
}
|
|
@@ -1,4 +1,19 @@
|
|
|
1
|
+
import { resolveArgs } from './injector/MetadataInjector';
|
|
1
2
|
const METADATA_KEY = 'autorun';
|
|
3
|
+
export class AutorunContext {
|
|
4
|
+
constructor(instance, methodName, scope) {
|
|
5
|
+
this.instance = instance;
|
|
6
|
+
this.methodName = methodName;
|
|
7
|
+
this.scope = scope;
|
|
8
|
+
}
|
|
9
|
+
resolveArgs(...args) {
|
|
10
|
+
return resolveArgs(this.instance.constructor, this.methodName)(this.scope, ...args);
|
|
11
|
+
}
|
|
12
|
+
invokeMethod({ args = this.resolveArgs() }) {
|
|
13
|
+
// @ts-ignore
|
|
14
|
+
return this.instance[this.methodName](...args);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
2
17
|
const createStore = () => new Map();
|
|
3
18
|
export const autorun = (execute) => (target, propertyKey) => {
|
|
4
19
|
const hooks = Reflect.hasMetadata(METADATA_KEY, target.constructor)
|
|
@@ -12,8 +27,8 @@ export const getAutorunHooks = (target) => {
|
|
|
12
27
|
? Reflect.getMetadata(METADATA_KEY, target.constructor)
|
|
13
28
|
: new Map();
|
|
14
29
|
};
|
|
15
|
-
export const startAutorun = (target, createContext = (c) => c) => {
|
|
30
|
+
export const startAutorun = (target, scope, createContext = (c) => c) => {
|
|
16
31
|
for (const [methodName, execute] of getAutorunHooks(target)) {
|
|
17
|
-
execute(createContext(
|
|
32
|
+
execute(createContext(new AutorunContext(target, methodName, scope)));
|
|
18
33
|
}
|
|
19
34
|
};
|
package/esm/index.js
CHANGED
|
@@ -3,7 +3,7 @@ export { isDependencyKey, } from './container/IContainer';
|
|
|
3
3
|
export { Container } from './container/Container';
|
|
4
4
|
export { EmptyContainer } from './container/EmptyContainer';
|
|
5
5
|
export { AutoMockedContainer } from './container/AutoMockedContainer';
|
|
6
|
-
export { MetadataInjector, inject } from './injector/MetadataInjector';
|
|
6
|
+
export { MetadataInjector, inject, resolveArgs, getInjectFns } from './injector/MetadataInjector';
|
|
7
7
|
export { SimpleInjector } from './injector/SimpleInjector';
|
|
8
8
|
export { ProxyInjector } from './injector/ProxyInjector';
|
|
9
9
|
// Providers
|
|
@@ -22,5 +22,5 @@ export { ContainerDisposedError } from './errors/ContainerDisposedError';
|
|
|
22
22
|
// Others
|
|
23
23
|
export { getHooks, hook, hasHooks } from './hook';
|
|
24
24
|
export { by, IMemoKey, byAlias, byAliases } from './by';
|
|
25
|
-
export { autorun, startAutorun } from './
|
|
25
|
+
export { autorun, startAutorun, AutorunContext } from './autorun';
|
|
26
26
|
export { setMetadata, getMetadata, setParameterMetadata, setMethodMetadata, getMethodMetadata, getParameterMetadata, } from './metadata';
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { constant, fillEmptyIndexes } from '../utils';
|
|
2
2
|
import { setParameterMetadata, getParameterMetadata } from '../metadata';
|
|
3
3
|
const METADATA_KEY = 'inject';
|
|
4
|
-
const getInjectFns = (Target) => getParameterMetadata(
|
|
5
|
-
|
|
4
|
+
export const getInjectFns = (Target, methodName) => getParameterMetadata(metaKey(methodName), Target);
|
|
5
|
+
const metaKey = (methodName = 'constructor') => `${METADATA_KEY}:${methodName}`;
|
|
6
|
+
export const inject = (fn) => (target, propertyKey, parameterIndex) => setParameterMetadata(metaKey(propertyKey), fn)(target, propertyKey, parameterIndex);
|
|
7
|
+
export const resolveArgs = (Target, methodName) => {
|
|
8
|
+
const argsFns = getInjectFns(Target, methodName);
|
|
9
|
+
return (scope, ...deps) => fillEmptyIndexes(argsFns, deps.map(constant)).map((fn) => fn(scope));
|
|
10
|
+
};
|
|
6
11
|
export class MetadataInjector {
|
|
7
12
|
resolve(container, Target, { args: deps }) {
|
|
8
|
-
const
|
|
9
|
-
const args = fillEmptyIndexes(injectionFns, deps.map(constant)).map((fn) => fn(container));
|
|
13
|
+
const args = resolveArgs(Target)(container, ...deps);
|
|
10
14
|
return new Target(...args);
|
|
11
15
|
}
|
|
12
16
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-ioc-container",
|
|
3
|
-
"version": "32.0
|
|
3
|
+
"version": "32.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": "79eba3d3a19747339a7b078592f719f00c869f59"
|
|
63
63
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { IContainer } from './container/IContainer';
|
|
2
|
+
export declare class AutorunContext {
|
|
3
|
+
instance: object;
|
|
4
|
+
methodName: string;
|
|
5
|
+
private scope;
|
|
6
|
+
constructor(instance: object, methodName: string, scope: IContainer);
|
|
7
|
+
resolveArgs(...args: unknown[]): unknown[];
|
|
8
|
+
invokeMethod({ args }: {
|
|
9
|
+
args: unknown[];
|
|
10
|
+
}): unknown;
|
|
11
|
+
}
|
|
12
|
+
type AutorunHandler = <T extends AutorunContext>(context: T) => void;
|
|
13
|
+
export declare const autorun: (execute: AutorunHandler) => MethodDecorator;
|
|
14
|
+
export declare const getAutorunHooks: (target: object) => Map<string, AutorunHandler>;
|
|
15
|
+
export declare const startAutorun: <Context extends AutorunContext>(target: object, scope: IContainer, createContext?: (c: AutorunContext) => Context) => void;
|
|
16
|
+
export {};
|
package/typings/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export { Container } from './container/Container';
|
|
|
3
3
|
export { EmptyContainer } from './container/EmptyContainer';
|
|
4
4
|
export { AutoMockedContainer } from './container/AutoMockedContainer';
|
|
5
5
|
export { IInjector } from './injector/IInjector';
|
|
6
|
-
export { MetadataInjector, inject } from './injector/MetadataInjector';
|
|
6
|
+
export { MetadataInjector, inject, resolveArgs, getInjectFns, InjectFn } from './injector/MetadataInjector';
|
|
7
7
|
export { SimpleInjector } from './injector/SimpleInjector';
|
|
8
8
|
export { ProxyInjector } from './injector/ProxyInjector';
|
|
9
9
|
export { ResolveDependency, IProvider, provider, visible, alias, argsFn, args, ArgsFn, ProviderDecorator, InstantDependencyOptions, ProviderResolveOptions, } from './provider/IProvider';
|
|
@@ -20,5 +20,5 @@ export { ContainerDisposedError } from './errors/ContainerDisposedError';
|
|
|
20
20
|
export { getHooks, hook, hasHooks } from './hook';
|
|
21
21
|
export { by, InstancePredicate, IMemo, IMemoKey, byAlias, byAliases } from './by';
|
|
22
22
|
export { constructor } from './utils';
|
|
23
|
-
export { autorun, startAutorun } from './
|
|
23
|
+
export { autorun, startAutorun, AutorunContext } from './autorun';
|
|
24
24
|
export { setMetadata, getMetadata, setParameterMetadata, setMethodMetadata, getMethodMetadata, getParameterMetadata, } from './metadata';
|
|
@@ -2,7 +2,9 @@ import { IInjector, InjectOptions } from './IInjector';
|
|
|
2
2
|
import { IContainer } from '../container/IContainer';
|
|
3
3
|
import { constructor } from '../utils';
|
|
4
4
|
export type InjectFn<T = unknown> = (l: IContainer) => T;
|
|
5
|
+
export declare const getInjectFns: (Target: constructor<unknown>, methodName?: string) => InjectFn<unknown>[];
|
|
5
6
|
export declare const inject: (fn: InjectFn) => ParameterDecorator;
|
|
7
|
+
export declare const resolveArgs: (Target: constructor<unknown>, methodName?: string) => (scope: IContainer, ...deps: unknown[]) => unknown[];
|
|
6
8
|
export declare class MetadataInjector implements IInjector {
|
|
7
9
|
resolve<T>(container: IContainer, Target: constructor<T>, { args: deps }: InjectOptions): T;
|
|
8
10
|
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
interface AutorunContext {
|
|
2
|
-
instance: object;
|
|
3
|
-
methodName: string;
|
|
4
|
-
}
|
|
5
|
-
type AutorunHandler = <T extends AutorunContext>(context: T) => void;
|
|
6
|
-
export declare const autorun: (execute: AutorunHandler) => MethodDecorator;
|
|
7
|
-
export declare const getAutorunHooks: (target: object) => Map<string, AutorunHandler>;
|
|
8
|
-
export declare const startAutorun: <Context extends AutorunContext>(target: object, createContext?: (props: {
|
|
9
|
-
instance: object;
|
|
10
|
-
methodName: string;
|
|
11
|
-
}) => Context) => void;
|
|
12
|
-
export {};
|