ts-ioc-container 47.1.0 → 47.2.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/hooks/HookContext.js +5 -1
- package/cjm/hooks/HooksRunner.js +5 -7
- package/cjm/index.js +4 -4
- package/esm/hooks/HookContext.js +2 -0
- package/esm/hooks/HooksRunner.js +5 -7
- package/esm/index.js +1 -2
- package/package.json +10 -8
- package/typings/hooks/HookContext.d.ts +5 -0
- package/typings/hooks/HooksRunner.d.ts +8 -4
- package/typings/index.d.ts +1 -2
- package/cjm/hooks/HookContextBuilder.js +0 -25
- package/esm/hooks/HookContextBuilder.js +0 -21
- package/typings/hooks/HookContextBuilder.d.ts +0 -19
package/README.md
CHANGED
|
@@ -1572,7 +1572,7 @@ describe('ProxyInjector', function () {
|
|
|
1572
1572
|
// In a real scenario, you'd register multiple loggers with the same alias.
|
|
1573
1573
|
const mockLoggers = [new FileLogger(), new ConsoleLogger()];
|
|
1574
1574
|
|
|
1575
|
-
container.resolveByAlias =
|
|
1575
|
+
container.resolveByAlias = vi.fn().mockReturnValue(mockLoggers);
|
|
1576
1576
|
|
|
1577
1577
|
const app = container.resolve(App);
|
|
1578
1578
|
|
package/cjm/hooks/HookContext.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.HookContext = void 0;
|
|
3
|
+
exports.createHookContextFactory = exports.createHookContext = exports.HookContext = void 0;
|
|
4
4
|
const inject_1 = require("../injector/inject");
|
|
5
5
|
const proxy_1 = require("../utils/proxy");
|
|
6
6
|
class HookContext {
|
|
@@ -30,3 +30,7 @@ class HookContext {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
exports.HookContext = HookContext;
|
|
33
|
+
const createHookContext = (Target, scope, methodName = 'constructor') => new HookContext(Target, scope, methodName);
|
|
34
|
+
exports.createHookContext = createHookContext;
|
|
35
|
+
const createHookContextFactory = ({ args = [] } = {}) => (Target, scope, methodName) => (0, exports.createHookContext)(Target, scope, methodName).setInitialArgs(...args);
|
|
36
|
+
exports.createHookContextFactory = createHookContextFactory;
|
package/cjm/hooks/HooksRunner.js
CHANGED
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.HooksRunner = void 0;
|
|
4
|
+
const HookContext_1 = require("./HookContext");
|
|
4
5
|
const hook_1 = require("./hook");
|
|
5
6
|
const UnexpectedHookResultError_1 = require("../errors/UnexpectedHookResultError");
|
|
6
7
|
const promise_1 = require("../utils/promise");
|
|
7
|
-
const HookContextBuilder_1 = require("./HookContextBuilder");
|
|
8
8
|
class HooksRunner {
|
|
9
9
|
key;
|
|
10
10
|
constructor(key) {
|
|
11
11
|
this.key = key;
|
|
12
12
|
}
|
|
13
|
-
execute(target, { scope,
|
|
13
|
+
execute(target, { scope, createContext = HookContext_1.createHookContext, predicate = () => true }) {
|
|
14
14
|
const hooks = Array.from((0, hook_1.getHooks)(target, this.key).entries()).filter(([methodName]) => predicate(methodName));
|
|
15
|
-
contextBuilder.mergeOptions({ target, scope });
|
|
16
15
|
const runMethodHooks = (methodName, executions) => {
|
|
17
|
-
const context =
|
|
16
|
+
const context = createContext(target, scope, methodName);
|
|
18
17
|
for (const execute of executions) {
|
|
19
18
|
const result = execute(context);
|
|
20
19
|
if (result instanceof Promise) {
|
|
@@ -26,11 +25,10 @@ class HooksRunner {
|
|
|
26
25
|
runMethodHooks(methodName, executions.map(hook_1.toHookFn));
|
|
27
26
|
}
|
|
28
27
|
}
|
|
29
|
-
async executeAsync(target, { scope,
|
|
28
|
+
async executeAsync(target, { scope, createContext = HookContext_1.createHookContext, predicate = () => true, }) {
|
|
30
29
|
const hooks = Array.from((0, hook_1.getHooks)(target, this.key).entries()).filter(([methodName]) => predicate(methodName));
|
|
31
|
-
contextBuilder.mergeOptions({ target, scope });
|
|
32
30
|
const runMethodHooks = async (methodName, executions) => {
|
|
33
|
-
const context =
|
|
31
|
+
const context = createContext(target, scope, methodName);
|
|
34
32
|
for (const execute of executions) {
|
|
35
33
|
await (0, promise_1.promisify)(execute(context));
|
|
36
34
|
}
|
package/cjm/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.
|
|
3
|
+
exports.ClassToken = exports.toSingleAlias = exports.SingleAliasToken = exports.toGroupAlias = exports.GroupAliasToken = exports.InjectionToken = exports.HooksRunner = exports.AddOnDisposeHookModule = exports.onDispose = exports.onDisposeHooksRunner = exports.AddOnConstructHookModule = exports.onConstruct = exports.onConstructHooksRunner = exports.injectProp = exports.createHookContext = exports.createHookContextFactory = exports.HookContext = exports.hasHooks = exports.hook = exports.getHooks = exports.UnexpectedHookResultError = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyMissingKeyError = exports.DependencyNotFoundError = exports.Registration = exports.bindTo = exports.register = exports.scope = exports.decorate = exports.MultiCache = exports.multiCache = exports.SingletonProvider = exports.singleton = exports.Provider = exports.resolveByArgs = exports.ProviderDecorator = exports.args = exports.argsFn = exports.lazy = exports.scopeAccess = exports.ProxyInjector = exports.SimpleInjector = exports.MetadataInjector = exports.Injector = exports.resolveArgs = exports.inject = exports.EmptyContainer = exports.Container = exports.isDependencyKey = void 0;
|
|
4
|
+
exports.resolveConstructor = exports.Is = exports.pipe = exports.select = exports.getMethodTags = exports.methodTag = exports.getMethodLabels = exports.methodLabel = exports.getMethodMeta = exports.methodMeta = exports.getParamTags = exports.paramTag = exports.getParamLabels = exports.paramLabel = exports.getParamMeta = exports.paramMeta = exports.getClassTags = exports.classTag = exports.getClassLabels = exports.classLabel = exports.getClassMeta = exports.classMeta = exports.handleAsyncError = exports.handleError = exports.GroupInstanceToken = exports.ConstantToken = exports.FunctionToken = exports.SingleToken = void 0;
|
|
5
5
|
// Containers
|
|
6
6
|
var IContainer_1 = require("./container/IContainer");
|
|
7
7
|
Object.defineProperty(exports, "isDependencyKey", { enumerable: true, get: function () { return IContainer_1.isDependencyKey; } });
|
|
@@ -64,6 +64,8 @@ Object.defineProperty(exports, "hook", { enumerable: true, get: function () { re
|
|
|
64
64
|
Object.defineProperty(exports, "hasHooks", { enumerable: true, get: function () { return hook_1.hasHooks; } });
|
|
65
65
|
var HookContext_1 = require("./hooks/HookContext");
|
|
66
66
|
Object.defineProperty(exports, "HookContext", { enumerable: true, get: function () { return HookContext_1.HookContext; } });
|
|
67
|
+
Object.defineProperty(exports, "createHookContextFactory", { enumerable: true, get: function () { return HookContext_1.createHookContextFactory; } });
|
|
68
|
+
Object.defineProperty(exports, "createHookContext", { enumerable: true, get: function () { return HookContext_1.createHookContext; } });
|
|
67
69
|
var injectProp_1 = require("./hooks/injectProp");
|
|
68
70
|
Object.defineProperty(exports, "injectProp", { enumerable: true, get: function () { return injectProp_1.injectProp; } });
|
|
69
71
|
var onConstruct_1 = require("./hooks/onConstruct");
|
|
@@ -128,5 +130,3 @@ Object.defineProperty(exports, "pipe", { enumerable: true, get: function () { re
|
|
|
128
130
|
var basic_1 = require("./utils/basic");
|
|
129
131
|
Object.defineProperty(exports, "Is", { enumerable: true, get: function () { return basic_1.Is; } });
|
|
130
132
|
Object.defineProperty(exports, "resolveConstructor", { enumerable: true, get: function () { return basic_1.resolveConstructor; } });
|
|
131
|
-
var HookContextBuilder_1 = require("./hooks/HookContextBuilder");
|
|
132
|
-
Object.defineProperty(exports, "DefaultHookContextBuilder", { enumerable: true, get: function () { return HookContextBuilder_1.DefaultHookContextBuilder; } });
|
package/esm/hooks/HookContext.js
CHANGED
|
@@ -26,3 +26,5 @@ export class HookContext {
|
|
|
26
26
|
return this;
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
|
+
export const createHookContext = (Target, scope, methodName = 'constructor') => new HookContext(Target, scope, methodName);
|
|
30
|
+
export const createHookContextFactory = ({ args = [] } = {}) => (Target, scope, methodName) => createHookContext(Target, scope, methodName).setInitialArgs(...args);
|
package/esm/hooks/HooksRunner.js
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
|
+
import { createHookContext } from './HookContext';
|
|
1
2
|
import { getHooks, toHookFn } from './hook';
|
|
2
3
|
import { UnexpectedHookResultError } from '../errors/UnexpectedHookResultError';
|
|
3
4
|
import { promisify } from '../utils/promise';
|
|
4
|
-
import { DefaultHookContextBuilder } from './HookContextBuilder';
|
|
5
5
|
export class HooksRunner {
|
|
6
6
|
key;
|
|
7
7
|
constructor(key) {
|
|
8
8
|
this.key = key;
|
|
9
9
|
}
|
|
10
|
-
execute(target, { scope,
|
|
10
|
+
execute(target, { scope, createContext = createHookContext, predicate = () => true }) {
|
|
11
11
|
const hooks = Array.from(getHooks(target, this.key).entries()).filter(([methodName]) => predicate(methodName));
|
|
12
|
-
contextBuilder.mergeOptions({ target, scope });
|
|
13
12
|
const runMethodHooks = (methodName, executions) => {
|
|
14
|
-
const context =
|
|
13
|
+
const context = createContext(target, scope, methodName);
|
|
15
14
|
for (const execute of executions) {
|
|
16
15
|
const result = execute(context);
|
|
17
16
|
if (result instanceof Promise) {
|
|
@@ -23,11 +22,10 @@ export class HooksRunner {
|
|
|
23
22
|
runMethodHooks(methodName, executions.map(toHookFn));
|
|
24
23
|
}
|
|
25
24
|
}
|
|
26
|
-
async executeAsync(target, { scope,
|
|
25
|
+
async executeAsync(target, { scope, createContext = createHookContext, predicate = () => true, }) {
|
|
27
26
|
const hooks = Array.from(getHooks(target, this.key).entries()).filter(([methodName]) => predicate(methodName));
|
|
28
|
-
contextBuilder.mergeOptions({ target, scope });
|
|
29
27
|
const runMethodHooks = async (methodName, executions) => {
|
|
30
|
-
const context =
|
|
28
|
+
const context = createContext(target, scope, methodName);
|
|
31
29
|
for (const execute of executions) {
|
|
32
30
|
await promisify(execute(context));
|
|
33
31
|
}
|
package/esm/index.js
CHANGED
|
@@ -25,7 +25,7 @@ export { ContainerDisposedError } from './errors/ContainerDisposedError';
|
|
|
25
25
|
export { UnexpectedHookResultError } from './errors/UnexpectedHookResultError';
|
|
26
26
|
// Hooks
|
|
27
27
|
export { getHooks, hook, hasHooks } from './hooks/hook';
|
|
28
|
-
export { HookContext } from './hooks/HookContext';
|
|
28
|
+
export { HookContext, createHookContextFactory, createHookContext } from './hooks/HookContext';
|
|
29
29
|
export { injectProp } from './hooks/injectProp';
|
|
30
30
|
export { onConstructHooksRunner, onConstruct, AddOnConstructHookModule } from './hooks/onConstruct';
|
|
31
31
|
export { onDisposeHooksRunner, onDispose, AddOnDisposeHookModule } from './hooks/onDispose';
|
|
@@ -48,4 +48,3 @@ export { methodMeta, getMethodMeta, methodLabel, getMethodLabels, methodTag, get
|
|
|
48
48
|
export { select } from './select';
|
|
49
49
|
export { pipe } from './utils/fp';
|
|
50
50
|
export { Is, resolveConstructor } from './utils/basic';
|
|
51
|
-
export { DefaultHookContextBuilder } from './hooks/HookContextBuilder';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-ioc-container",
|
|
3
|
-
"version": "47.
|
|
3
|
+
"version": "47.2.0",
|
|
4
4
|
"description": "Typescript IoC container",
|
|
5
5
|
"workspaces": [
|
|
6
6
|
"docs"
|
|
@@ -46,8 +46,8 @@
|
|
|
46
46
|
"build:types": "rimraf typings && tsc -p tsconfig.production.json --outDir typings --emitDeclarationOnly --declaration",
|
|
47
47
|
"generate:docs": "scripts/generate-readme/generate-readme.ts && git add README.md",
|
|
48
48
|
"build": "npm run build:cjm && npm run build:esm && npm run build:types",
|
|
49
|
-
"test": "
|
|
50
|
-
"test:coverage": "
|
|
49
|
+
"test": "vitest run",
|
|
50
|
+
"test:coverage": "vitest run --coverage --coverage.reporter=lcov",
|
|
51
51
|
"type-check": "tsc --noEmit",
|
|
52
52
|
"type-check:watch": "tsc --noEmit --watch",
|
|
53
53
|
"commit": "cz",
|
|
@@ -71,27 +71,29 @@
|
|
|
71
71
|
"@semantic-release/git": "^10.0.1",
|
|
72
72
|
"@semantic-release/github": "^12.0.2",
|
|
73
73
|
"@semantic-release/npm": "^13.1.2",
|
|
74
|
-
"@
|
|
74
|
+
"@swc/core": "^1.15.24",
|
|
75
75
|
"@types/node": "^25.5.2",
|
|
76
76
|
"@typescript-eslint/eslint-plugin": "8.29.1",
|
|
77
77
|
"@typescript-eslint/parser": "8.29.1",
|
|
78
|
+
"@vitest/coverage-v8": "^4.1.2",
|
|
78
79
|
"cz-conventional-changelog": "^3.3.0",
|
|
79
80
|
"eslint": "9.24.0",
|
|
80
81
|
"eslint-config-prettier": "10.1.1",
|
|
81
82
|
"eslint-plugin-prettier": "5.2.6",
|
|
82
83
|
"handlebars": "^4.7.8",
|
|
83
84
|
"husky": "^9.1.7",
|
|
84
|
-
"jest": "29.7.0",
|
|
85
85
|
"lint-staged": "^15.5.0",
|
|
86
|
-
"moq.ts": "^
|
|
86
|
+
"moq.ts": "^10.0.8",
|
|
87
87
|
"prettier": "3.5.3",
|
|
88
88
|
"prettier-plugin-astro": "^0.14.1",
|
|
89
89
|
"reflect-metadata": "^0.2.2",
|
|
90
90
|
"rimraf": "6.0.1",
|
|
91
91
|
"semantic-release": "^25.0.2",
|
|
92
|
-
"ts-jest": "29.3.1",
|
|
93
92
|
"tsx": "^4.21.0",
|
|
94
|
-
"typescript": "5.8.3"
|
|
93
|
+
"typescript": "5.8.3",
|
|
94
|
+
"unplugin-swc": "^1.5.9",
|
|
95
|
+
"vite": "^6.4.1",
|
|
96
|
+
"vitest": "^4.1.2"
|
|
95
97
|
},
|
|
96
98
|
"lint-staged": {
|
|
97
99
|
"*.{js,ts,tsx}": [
|
|
@@ -24,3 +24,8 @@ export declare class HookContext implements IHookContext {
|
|
|
24
24
|
setProperty(fn: InjectionToken): void;
|
|
25
25
|
setInitialArgs(...args: unknown[]): this;
|
|
26
26
|
}
|
|
27
|
+
export type CreateHookContext = (Target: object, scope: IContainer, methodName?: string) => IHookContext;
|
|
28
|
+
export declare const createHookContext: CreateHookContext;
|
|
29
|
+
export declare const createHookContextFactory: ({ args }?: {
|
|
30
|
+
args?: unknown[];
|
|
31
|
+
}) => CreateHookContext;
|
|
@@ -1,13 +1,17 @@
|
|
|
1
|
+
import { createHookContext, type CreateHookContext } from './HookContext';
|
|
1
2
|
import type { IContainer } from '../container/IContainer';
|
|
2
|
-
import { IHookContextBuilder } from './HookContextBuilder';
|
|
3
3
|
export type HooksRunnerContext = {
|
|
4
4
|
scope: IContainer;
|
|
5
|
-
|
|
5
|
+
createContext?: CreateHookContext;
|
|
6
6
|
predicate?: (methodName: string) => boolean;
|
|
7
7
|
};
|
|
8
8
|
export declare class HooksRunner {
|
|
9
9
|
private readonly key;
|
|
10
10
|
constructor(key: string | symbol);
|
|
11
|
-
execute(target: object, { scope,
|
|
12
|
-
executeAsync(target: object, { scope,
|
|
11
|
+
execute(target: object, { scope, createContext, predicate }: HooksRunnerContext): void;
|
|
12
|
+
executeAsync(target: object, { scope, createContext, predicate, }: {
|
|
13
|
+
scope: IContainer;
|
|
14
|
+
createContext?: typeof createHookContext;
|
|
15
|
+
predicate?: (methodName: string) => boolean;
|
|
16
|
+
}): Promise<void[]>;
|
|
13
17
|
}
|
package/typings/index.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export { MethodNotImplementedError } from './errors/MethodNotImplementedError';
|
|
|
20
20
|
export { ContainerDisposedError } from './errors/ContainerDisposedError';
|
|
21
21
|
export { UnexpectedHookResultError } from './errors/UnexpectedHookResultError';
|
|
22
22
|
export { getHooks, hook, hasHooks, type HookFn, type HookClass, type InjectFn, type HooksOfClass } from './hooks/hook';
|
|
23
|
-
export { HookContext, type IHookContext } from './hooks/HookContext';
|
|
23
|
+
export { HookContext, createHookContextFactory, createHookContext, type IHookContext } from './hooks/HookContext';
|
|
24
24
|
export { injectProp } from './hooks/injectProp';
|
|
25
25
|
export { onConstructHooksRunner, onConstruct, AddOnConstructHookModule } from './hooks/onConstruct';
|
|
26
26
|
export { onDisposeHooksRunner, onDispose, AddOnDisposeHookModule } from './hooks/onDispose';
|
|
@@ -40,4 +40,3 @@ export { methodMeta, getMethodMeta, methodLabel, getMethodLabels, methodTag, get
|
|
|
40
40
|
export { select } from './select';
|
|
41
41
|
export { pipe, type MapFn } from './utils/fp';
|
|
42
42
|
export { type constructor, type Instance, Is, resolveConstructor } from './utils/basic';
|
|
43
|
-
export { type IHookContextBuilder, DefaultHookContextBuilder } from './hooks/HookContextBuilder';
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DefaultHookContextBuilder = void 0;
|
|
4
|
-
const HookContext_1 = require("./HookContext");
|
|
5
|
-
class DefaultHookContextBuilder {
|
|
6
|
-
options = {};
|
|
7
|
-
initialArgs = [];
|
|
8
|
-
build(context) {
|
|
9
|
-
const target = context.target ?? this.options.target;
|
|
10
|
-
const scope = context.scope ?? this.options.scope;
|
|
11
|
-
const methodName = context.methodName ?? context.methodName;
|
|
12
|
-
return new HookContext_1.HookContext(target, scope, methodName).setInitialArgs(...this.initialArgs);
|
|
13
|
-
}
|
|
14
|
-
mergeOptions(context) {
|
|
15
|
-
this.options = {
|
|
16
|
-
...this.options,
|
|
17
|
-
...context,
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
appendArgs(...args) {
|
|
21
|
-
this.initialArgs.push(...args);
|
|
22
|
-
return this;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
exports.DefaultHookContextBuilder = DefaultHookContextBuilder;
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { HookContext } from './HookContext';
|
|
2
|
-
export class DefaultHookContextBuilder {
|
|
3
|
-
options = {};
|
|
4
|
-
initialArgs = [];
|
|
5
|
-
build(context) {
|
|
6
|
-
const target = context.target ?? this.options.target;
|
|
7
|
-
const scope = context.scope ?? this.options.scope;
|
|
8
|
-
const methodName = context.methodName ?? context.methodName;
|
|
9
|
-
return new HookContext(target, scope, methodName).setInitialArgs(...this.initialArgs);
|
|
10
|
-
}
|
|
11
|
-
mergeOptions(context) {
|
|
12
|
-
this.options = {
|
|
13
|
-
...this.options,
|
|
14
|
-
...context,
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
appendArgs(...args) {
|
|
18
|
-
this.initialArgs.push(...args);
|
|
19
|
-
return this;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { IContainer } from '../container/IContainer';
|
|
2
|
-
import { IHookContext } from './HookContext';
|
|
3
|
-
export type HookContextBuilderOptions = {
|
|
4
|
-
target: object;
|
|
5
|
-
scope: IContainer;
|
|
6
|
-
methodName: string;
|
|
7
|
-
};
|
|
8
|
-
export interface IHookContextBuilder {
|
|
9
|
-
mergeOptions(context: Partial<HookContextBuilderOptions>): void;
|
|
10
|
-
build(context: Partial<HookContextBuilderOptions>): IHookContext;
|
|
11
|
-
appendArgs(...args: unknown[]): this;
|
|
12
|
-
}
|
|
13
|
-
export declare class DefaultHookContextBuilder implements IHookContextBuilder {
|
|
14
|
-
private options;
|
|
15
|
-
private initialArgs;
|
|
16
|
-
build(context: Partial<HookContextBuilderOptions>): IHookContext;
|
|
17
|
-
mergeOptions(context: Partial<HookContextBuilderOptions>): void;
|
|
18
|
-
appendArgs(...args: unknown[]): this;
|
|
19
|
-
}
|