ts-ioc-container 56.2.0 → 56.3.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 +75 -1
- package/cjm/hooks/injectProp.js +4 -3
- package/cjm/index.js +5 -1
- package/cjm/injector/MetadataInjector.js +6 -9
- package/cjm/token/toToken.js +8 -1
- package/esm/hooks/injectProp.js +4 -2
- package/esm/index.js +1 -0
- package/esm/injector/MetadataInjector.js +5 -8
- package/esm/token/toToken.js +6 -0
- package/package.json +2 -2
- package/typings/hooks/injectProp.d.ts +14 -5
- package/typings/index.d.ts +1 -0
- package/typings/injector/MetadataInjector.d.ts +13 -2
- package/typings/select.d.ts +1 -1
- package/typings/token/toToken.d.ts +4 -1
package/README.md
CHANGED
|
@@ -38,6 +38,7 @@ provider pipelines, aliases, and custom injector strategies.
|
|
|
38
38
|
- [Lazy with registerPipe](#lazy-with-registerpipe) `lazy()`
|
|
39
39
|
- [Injector](#injector)
|
|
40
40
|
- [Metadata](#metadata) `@inject`
|
|
41
|
+
- [Mapping injected values](#mapping-injected-values)
|
|
41
42
|
- [Simple](#simple)
|
|
42
43
|
- [Proxy](#proxy)
|
|
43
44
|
- [Provider](#provider) `provider`
|
|
@@ -157,7 +158,8 @@ describe('Quickstart', function () {
|
|
|
157
158
|
- Current scope token: `select.scope.current`
|
|
158
159
|
- Lazy token: `select.token('Service').lazy()`
|
|
159
160
|
- Inject decorator: `@inject('Key')`
|
|
160
|
-
-
|
|
161
|
+
- Map an injected value: `@inject('Key', sanitize(), validate())`
|
|
162
|
+
- Property inject: `@hook('onInit', append(injectProp('Key')))`
|
|
161
163
|
|
|
162
164
|
> [!TIP]
|
|
163
165
|
> For classes, prefer the `@register(bindTo('Key'))` decorator over the fluent
|
|
@@ -1187,6 +1189,78 @@ describe('Metadata Injector', function () {
|
|
|
1187
1189
|
|
|
1188
1190
|
```
|
|
1189
1191
|
|
|
1192
|
+
### Mapping injected values
|
|
1193
|
+
|
|
1194
|
+
Every argument after the first one is a **mapper** applied to the resolved
|
|
1195
|
+
instance, left to right — the value the last mapper returns is what reaches the
|
|
1196
|
+
constructor parameter:
|
|
1197
|
+
|
|
1198
|
+
```typescript
|
|
1199
|
+
@inject('Config', takeApiUrl(), stripTrailingSlash(), requireHttps())
|
|
1200
|
+
```
|
|
1201
|
+
|
|
1202
|
+
A mapper is a plain `(value) => value` function, so mappers compose into named,
|
|
1203
|
+
reusable steps (selecting a member, sanitizing, validating) and each step's
|
|
1204
|
+
parameter type is inferred from the previous one. With no mapper the resolved
|
|
1205
|
+
instance is injected untouched.
|
|
1206
|
+
|
|
1207
|
+
`injectProp` takes the same rest parameters: `injectProp('Config', takeApiUrl())`.
|
|
1208
|
+
|
|
1209
|
+
```typescript
|
|
1210
|
+
import 'reflect-metadata';
|
|
1211
|
+
import { Container, inject, Registration as R } from 'ts-ioc-container';
|
|
1212
|
+
|
|
1213
|
+
/**
|
|
1214
|
+
* Mapping injected values
|
|
1215
|
+
*
|
|
1216
|
+
* Every argument after the first one passed to `@inject` (or `injectProp`) is a
|
|
1217
|
+
* mapper applied to the resolved instance, left to right. Mappers are plain
|
|
1218
|
+
* functions, so they compose into reusable, named steps.
|
|
1219
|
+
*/
|
|
1220
|
+
|
|
1221
|
+
interface Config {
|
|
1222
|
+
apiUrl: string;
|
|
1223
|
+
retries: number;
|
|
1224
|
+
}
|
|
1225
|
+
|
|
1226
|
+
// Reusable mappers, each returning a `(value) => value` function
|
|
1227
|
+
const takeApiUrl = () => (config: Config) => config.apiUrl;
|
|
1228
|
+
const stripTrailingSlash = () => (url: string) => url.replace(/\/$/, '');
|
|
1229
|
+
const requireHttps = () => (url: string) => {
|
|
1230
|
+
if (!url.startsWith('https://')) {
|
|
1231
|
+
throw new Error(`Insecure api url: ${url}`);
|
|
1232
|
+
}
|
|
1233
|
+
return url;
|
|
1234
|
+
};
|
|
1235
|
+
|
|
1236
|
+
describe('inject mappers', () => {
|
|
1237
|
+
it('should pipe the resolved dependency through every mapper', () => {
|
|
1238
|
+
class ApiClient {
|
|
1239
|
+
constructor(@inject('Config', takeApiUrl(), stripTrailingSlash(), requireHttps()) readonly apiUrl: string) {}
|
|
1240
|
+
}
|
|
1241
|
+
|
|
1242
|
+
const container = new Container().addRegistration(
|
|
1243
|
+
R.fromValue<Config>({ apiUrl: 'https://api.com/', retries: 3 }).bindToKey('Config'),
|
|
1244
|
+
);
|
|
1245
|
+
|
|
1246
|
+
expect(container.resolve(ApiClient).apiUrl).toBe('https://api.com');
|
|
1247
|
+
});
|
|
1248
|
+
|
|
1249
|
+
it('should throw from a mapper when the resolved value is not acceptable', () => {
|
|
1250
|
+
class ApiClient {
|
|
1251
|
+
constructor(@inject('Config', takeApiUrl(), requireHttps()) readonly apiUrl: string) {}
|
|
1252
|
+
}
|
|
1253
|
+
|
|
1254
|
+
const container = new Container().addRegistration(
|
|
1255
|
+
R.fromValue<Config>({ apiUrl: 'http://api.com', retries: 3 }).bindToKey('Config'),
|
|
1256
|
+
);
|
|
1257
|
+
|
|
1258
|
+
expect(() => container.resolve(ApiClient)).toThrow('Insecure api url: http://api.com');
|
|
1259
|
+
});
|
|
1260
|
+
});
|
|
1261
|
+
|
|
1262
|
+
```
|
|
1263
|
+
|
|
1190
1264
|
### Simple
|
|
1191
1265
|
|
|
1192
1266
|
This type of injector just passes container to constructor with others arguments.
|
package/cjm/hooks/injectProp.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.injectProp = void 0;
|
|
4
|
-
const toToken_1 = require("../token/toToken");
|
|
5
|
-
const injectProp = (fn) => (context) => context.setProperty((0, toToken_1.toToken)(fn));
|
|
6
3
|
exports.injectProp = injectProp;
|
|
4
|
+
const toToken_1 = require("../token/toToken");
|
|
5
|
+
function injectProp(fn, ...mappers) {
|
|
6
|
+
return (context) => context.setProperty((0, toToken_1.toMappedToken)(fn, mappers));
|
|
7
|
+
}
|
package/cjm/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.onContainerDisposedHooksRunner = exports.AddOnConstructAsyncHookModule = exports.onConstructAsync = exports.onConstructAsyncHooksRunner = exports.AddOnConstructHookModule = exports.onConstruct = exports.onConstructHooksRunner = exports.injectProp = exports.createHookContext = exports.createHookContextFactory = exports.HookContext = exports.prepend = exports.append = exports.prependHooks = exports.appendHooks = exports.hasHooks = exports.hook = exports.getHooks = exports.UnsupportedTokenTypeError = exports.CannonSingletonApplyTwiceError = exports.UnexpectedHookResultError = exports.ProviderDisposedError = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyMissingKeyError = exports.ContainerNotFoundError = exports.DependencyNotFoundError = exports.ContainerError = exports.Registration = exports.appendArgsFn = exports.appendArgs = exports.decorate = exports.singleton = exports.lazy = exports.scopeAccess = exports.scope = exports.bindTo = exports.register = exports.Provider = exports.ProxyInjector = exports.SimpleInjector = exports.resolveArgs = exports.argsFn = exports.args = exports.inject = exports.MetadataInjector = exports.Injector = exports.EmptyContainer = exports.Container = exports.isDependencyKey = void 0;
|
|
4
|
-
exports.resolveConstructor = exports.Is = exports.pipe = exports.select = exports.once = exports.shallowCache = exports.debounce = exports.throttle = exports.handleAsyncError = exports.handleError = exports.getMethodTags = exports.addMethodTag = exports.getMethodLabels = exports.addMethodLabel = exports.getMethodMeta = exports.addMethodMeta = exports.getParamTags = exports.addParamTag = exports.getParamLabels = exports.addParamLabel = exports.getParamMeta = exports.addParamMeta = exports.getClassTags = exports.addClassTag = exports.getClassLabels = exports.addClassLabel = exports.getClassMeta = exports.addClassMeta = exports.GroupInstanceToken = exports.ConstantToken = exports.FunctionToken = exports.SingleToken = exports.ClassToken = exports.toSingleAlias = exports.SingleAliasToken = exports.toGroupAlias = exports.GroupAliasToken = exports.InjectionToken = exports.HooksRunner = exports.AddOnDisposeHookModule = exports.onContainerDisposed = void 0;
|
|
4
|
+
exports.resolveConstructor = exports.Is = exports.pipe = exports.select = exports.once = exports.shallowCache = exports.debounce = exports.throttle = exports.handleAsyncError = exports.handleError = exports.getMethodTags = exports.addMethodTag = exports.getMethodLabels = exports.addMethodLabel = exports.getMethodMeta = exports.addMethodMeta = exports.getParamTags = exports.addParamTag = exports.getParamLabels = exports.addParamLabel = exports.getParamMeta = exports.addParamMeta = exports.getClassTags = exports.addClassTag = exports.getClassLabels = exports.addClassLabel = exports.getClassMeta = exports.addClassMeta = exports.GroupInstanceToken = exports.ConstantToken = exports.FunctionToken = exports.SingleToken = exports.ClassToken = exports.toSingleAlias = exports.SingleAliasToken = exports.toGroupAlias = exports.GroupAliasToken = exports.argToToken = exports.toMappedToken = exports.toToken = exports.InjectionToken = exports.HooksRunner = exports.AddOnDisposeHookModule = exports.onContainerDisposed = void 0;
|
|
5
5
|
var IContainer_1 = require("./container/IContainer");
|
|
6
6
|
Object.defineProperty(exports, "isDependencyKey", { enumerable: true, get: function () { return IContainer_1.isDependencyKey; } });
|
|
7
7
|
var Container_1 = require("./container/Container");
|
|
@@ -84,6 +84,10 @@ var HooksRunner_1 = require("./hooks/HooksRunner");
|
|
|
84
84
|
Object.defineProperty(exports, "HooksRunner", { enumerable: true, get: function () { return HooksRunner_1.HooksRunner; } });
|
|
85
85
|
var InjectionToken_1 = require("./token/InjectionToken");
|
|
86
86
|
Object.defineProperty(exports, "InjectionToken", { enumerable: true, get: function () { return InjectionToken_1.InjectionToken; } });
|
|
87
|
+
var toToken_1 = require("./token/toToken");
|
|
88
|
+
Object.defineProperty(exports, "toToken", { enumerable: true, get: function () { return toToken_1.toToken; } });
|
|
89
|
+
Object.defineProperty(exports, "toMappedToken", { enumerable: true, get: function () { return toToken_1.toMappedToken; } });
|
|
90
|
+
Object.defineProperty(exports, "argToToken", { enumerable: true, get: function () { return toToken_1.argToToken; } });
|
|
87
91
|
var GroupAliasToken_1 = require("./token/GroupAliasToken");
|
|
88
92
|
Object.defineProperty(exports, "GroupAliasToken", { enumerable: true, get: function () { return GroupAliasToken_1.GroupAliasToken; } });
|
|
89
93
|
Object.defineProperty(exports, "toGroupAlias", { enumerable: true, get: function () { return GroupAliasToken_1.toGroupAlias; } });
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.resolveArgs = exports.args = exports.argsFn = exports.
|
|
3
|
+
exports.resolveArgs = exports.args = exports.argsFn = exports.MetadataInjector = void 0;
|
|
4
|
+
exports.inject = inject;
|
|
4
5
|
const IInjector_1 = require("./IInjector");
|
|
5
6
|
const basic_1 = require("../utils/basic");
|
|
6
7
|
const parameter_1 = require("../metadata/parameter");
|
|
7
8
|
const toToken_1 = require("../token/toToken");
|
|
8
|
-
const FunctionToken_1 = require("../token/FunctionToken");
|
|
9
9
|
class MetadataInjector extends IInjector_1.Injector {
|
|
10
10
|
createInstance(scope, Target, { args: deps = [] } = {}) {
|
|
11
11
|
const args = (0, exports.resolveArgs)(Target)(scope, { args: deps });
|
|
@@ -14,14 +14,11 @@ class MetadataInjector extends IInjector_1.Injector {
|
|
|
14
14
|
}
|
|
15
15
|
exports.MetadataInjector = MetadataInjector;
|
|
16
16
|
const hookMetaKey = (methodName = 'constructor') => `inject:${methodName}`;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
return new FunctionToken_1.FunctionToken((scope, options) => selectFn(token.resolve(scope, options)));
|
|
17
|
+
function inject(fn, ...mappers) {
|
|
18
|
+
return (target, propertyKey, parameterIndex) => {
|
|
19
|
+
(0, parameter_1.addParamMeta)(hookMetaKey(propertyKey), () => (0, toToken_1.toMappedToken)(fn, mappers))(basic_1.Is.instance(target) ? target.constructor : target, propertyKey, parameterIndex);
|
|
21
20
|
};
|
|
22
|
-
|
|
23
|
-
};
|
|
24
|
-
exports.inject = inject;
|
|
21
|
+
}
|
|
25
22
|
const argsFn = (predicate) => (c, { args = [] }) => args.find((value, index) => predicate(value, index));
|
|
26
23
|
exports.argsFn = argsFn;
|
|
27
24
|
const args = (index) => (0, exports.argsFn)((value, i) => i === index);
|
package/cjm/token/toToken.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.argToToken = exports.toToken = void 0;
|
|
3
|
+
exports.toMappedToken = exports.argToToken = exports.toToken = void 0;
|
|
4
4
|
const IContainer_1 = require("../container/IContainer");
|
|
5
5
|
const SingleToken_1 = require("./SingleToken");
|
|
6
6
|
const ClassToken_1 = require("./ClassToken");
|
|
@@ -9,6 +9,7 @@ const UnsupportedTokenTypeError_1 = require("../errors/UnsupportedTokenTypeError
|
|
|
9
9
|
const InjectionToken_1 = require("./InjectionToken");
|
|
10
10
|
const basic_1 = require("../utils/basic");
|
|
11
11
|
const ConstantToken_1 = require("./ConstantToken");
|
|
12
|
+
const fp_1 = require("../utils/fp");
|
|
12
13
|
const toToken = (token) => {
|
|
13
14
|
if (token instanceof InjectionToken_1.InjectionToken) {
|
|
14
15
|
return token;
|
|
@@ -27,3 +28,9 @@ const toToken = (token) => {
|
|
|
27
28
|
exports.toToken = toToken;
|
|
28
29
|
const argToToken = (v) => ((0, InjectionToken_1.isInjectionToken)(v) ? v : new ConstantToken_1.ConstantToken(v));
|
|
29
30
|
exports.argToToken = argToToken;
|
|
31
|
+
const toMappedToken = (token, mappers) => {
|
|
32
|
+
const source = (0, exports.toToken)(token);
|
|
33
|
+
const mapInstance = (0, fp_1.pipe)(...mappers);
|
|
34
|
+
return new FunctionToken_1.FunctionToken((scope, options) => mapInstance(source.resolve(scope, options)));
|
|
35
|
+
};
|
|
36
|
+
exports.toMappedToken = toMappedToken;
|
package/esm/hooks/injectProp.js
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export
|
|
1
|
+
import { toMappedToken } from '../token/toToken.js';
|
|
2
|
+
export function injectProp(fn, ...mappers) {
|
|
3
|
+
return (context) => context.setProperty(toMappedToken(fn, mappers));
|
|
4
|
+
}
|
package/esm/index.js
CHANGED
|
@@ -26,6 +26,7 @@ export { onConstructAsyncHooksRunner, onConstructAsync, AddOnConstructAsyncHookM
|
|
|
26
26
|
export { onContainerDisposedHooksRunner, onContainerDisposed, AddOnDisposeHookModule, } from './hooks/onContainerDisposed.js';
|
|
27
27
|
export { HooksRunner } from './hooks/HooksRunner.js';
|
|
28
28
|
export { InjectionToken } from './token/InjectionToken.js';
|
|
29
|
+
export { toToken, toMappedToken, argToToken } from './token/toToken.js';
|
|
29
30
|
export { GroupAliasToken, toGroupAlias } from './token/GroupAliasToken.js';
|
|
30
31
|
export { SingleAliasToken, toSingleAlias } from './token/SingleAliasToken.js';
|
|
31
32
|
export { ClassToken } from './token/ClassToken.js';
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { Injector } from './IInjector.js';
|
|
2
2
|
import { Is } from '../utils/basic.js';
|
|
3
3
|
import { getParamMeta, addParamMeta } from '../metadata/parameter.js';
|
|
4
|
-
import { argToToken,
|
|
5
|
-
import { FunctionToken } from '../token/FunctionToken.js';
|
|
4
|
+
import { argToToken, toMappedToken } from '../token/toToken.js';
|
|
6
5
|
export class MetadataInjector extends Injector {
|
|
7
6
|
createInstance(scope, Target, { args: deps = [] } = {}) {
|
|
8
7
|
const args = resolveArgs(Target)(scope, { args: deps });
|
|
@@ -10,13 +9,11 @@ export class MetadataInjector extends Injector {
|
|
|
10
9
|
}
|
|
11
10
|
}
|
|
12
11
|
const hookMetaKey = (methodName = 'constructor') => `inject:${methodName}`;
|
|
13
|
-
export
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
return new FunctionToken((scope, options) => selectFn(token.resolve(scope, options)));
|
|
12
|
+
export function inject(fn, ...mappers) {
|
|
13
|
+
return (target, propertyKey, parameterIndex) => {
|
|
14
|
+
addParamMeta(hookMetaKey(propertyKey), () => toMappedToken(fn, mappers))(Is.instance(target) ? target.constructor : target, propertyKey, parameterIndex);
|
|
17
15
|
};
|
|
18
|
-
|
|
19
|
-
};
|
|
16
|
+
}
|
|
20
17
|
export const argsFn = (predicate) => (c, { args = [] }) => args.find((value, index) => predicate(value, index));
|
|
21
18
|
export const args = (index) => argsFn((value, i) => i === index);
|
|
22
19
|
export const resolveArgs = (Target, methodName) => {
|
package/esm/token/toToken.js
CHANGED
|
@@ -6,6 +6,7 @@ import { UnsupportedTokenTypeError } from '../errors/UnsupportedTokenTypeError.j
|
|
|
6
6
|
import { InjectionToken, isInjectionToken } from './InjectionToken.js';
|
|
7
7
|
import { Is } from '../utils/basic.js';
|
|
8
8
|
import { ConstantToken } from './ConstantToken.js';
|
|
9
|
+
import { pipe } from '../utils/fp.js';
|
|
9
10
|
export const toToken = (token) => {
|
|
10
11
|
if (token instanceof InjectionToken) {
|
|
11
12
|
return token;
|
|
@@ -22,3 +23,8 @@ export const toToken = (token) => {
|
|
|
22
23
|
throw new UnsupportedTokenTypeError(`Unknown token ${token}`);
|
|
23
24
|
};
|
|
24
25
|
export const argToToken = (v) => (isInjectionToken(v) ? v : new ConstantToken(v));
|
|
26
|
+
export const toMappedToken = (token, mappers) => {
|
|
27
|
+
const source = toToken(token);
|
|
28
|
+
const mapInstance = pipe(...mappers);
|
|
29
|
+
return new FunctionToken((scope, options) => mapInstance(source.resolve(scope, options)));
|
|
30
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-ioc-container",
|
|
3
|
-
"version": "56.
|
|
3
|
+
"version": "56.3.0",
|
|
4
4
|
"description": "Fast, lightweight TypeScript dependency injection container with a clean API, scoped lifecycles, decorators, tokens, hooks, lazy injection, customizable providers, and no global container objects.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public",
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
"typescript": "5.8.3",
|
|
80
80
|
"unplugin-swc": "^1.5.9",
|
|
81
81
|
"vite": "^6.4.1",
|
|
82
|
-
"vitest": "^4.1.
|
|
82
|
+
"vitest": "^4.1.11"
|
|
83
83
|
},
|
|
84
84
|
"engines": {
|
|
85
85
|
"node": ">= 18"
|
|
@@ -1,5 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
export declare
|
|
1
|
+
import { HookFn } from './hook.js';
|
|
2
|
+
import { type Injectable } from '../token/toToken.js';
|
|
3
|
+
import { type MapFn } from '../utils/fp.js';
|
|
4
|
+
export declare function injectProp<T, B>(fn: Injectable<T>, fn1: MapFn<T, B>): HookFn;
|
|
5
|
+
export declare function injectProp<T, B, C>(fn: Injectable<T>, fn1: MapFn<T, B>, fn2: MapFn<B, C>): HookFn;
|
|
6
|
+
export declare function injectProp<T, B, C, D>(fn: Injectable<T>, fn1: MapFn<T, B>, fn2: MapFn<B, C>, fn3: MapFn<C, D>): HookFn;
|
|
7
|
+
export declare function injectProp<T, B, C, D, E>(fn: Injectable<T>, fn1: MapFn<T, B>, fn2: MapFn<B, C>, fn3: MapFn<C, D>, fn4: MapFn<D, E>): HookFn;
|
|
8
|
+
export declare function injectProp<T, B, C, D, E, F>(fn: Injectable<T>, fn1: MapFn<T, B>, fn2: MapFn<B, C>, fn3: MapFn<C, D>, fn4: MapFn<D, E>, fn5: MapFn<E, F>): HookFn;
|
|
9
|
+
export declare function injectProp<T, B, C, D, E, F, G>(fn: Injectable<T>, fn1: MapFn<T, B>, fn2: MapFn<B, C>, fn3: MapFn<C, D>, fn4: MapFn<D, E>, fn5: MapFn<E, F>, fn6: MapFn<F, G>): HookFn;
|
|
10
|
+
export declare function injectProp<T, B, C, D, E, F, G, H>(fn: Injectable<T>, fn1: MapFn<T, B>, fn2: MapFn<B, C>, fn3: MapFn<C, D>, fn4: MapFn<D, E>, fn5: MapFn<E, F>, fn6: MapFn<F, G>, fn7: MapFn<G, H>): HookFn;
|
|
11
|
+
export declare function injectProp<T, B, C, D, E, F, G, H, I>(fn: Injectable<T>, fn1: MapFn<T, B>, fn2: MapFn<B, C>, fn3: MapFn<C, D>, fn4: MapFn<D, E>, fn5: MapFn<E, F>, fn6: MapFn<F, G>, fn7: MapFn<G, H>, fn8: MapFn<H, I>): HookFn;
|
|
12
|
+
export declare function injectProp<T, B, C, D, E, F, G, H, I, J>(fn: Injectable<T>, fn1: MapFn<T, B>, fn2: MapFn<B, C>, fn3: MapFn<C, D>, fn4: MapFn<D, E>, fn5: MapFn<E, F>, fn6: MapFn<F, G>, fn7: MapFn<G, H>, fn8: MapFn<H, I>, fn9: MapFn<I, J>): HookFn;
|
|
13
|
+
export declare function injectProp<T, B, C, D, E, F, G, H, I, J, K>(fn: Injectable<T>, fn1: MapFn<T, B>, fn2: MapFn<B, C>, fn3: MapFn<C, D>, fn4: MapFn<D, E>, fn5: MapFn<E, F>, fn6: MapFn<F, G>, fn7: MapFn<G, H>, fn8: MapFn<H, I>, fn9: MapFn<I, J>, fn10: MapFn<J, K>): HookFn;
|
|
14
|
+
export declare function injectProp<T>(fn: Injectable<T>, ...mappers: MapFn<T>[]): HookFn;
|
package/typings/index.d.ts
CHANGED
|
@@ -27,6 +27,7 @@ export { onConstructAsyncHooksRunner, onConstructAsync, AddOnConstructAsyncHookM
|
|
|
27
27
|
export { onContainerDisposedHooksRunner, onContainerDisposed, AddOnDisposeHookModule, } from './hooks/onContainerDisposed.js';
|
|
28
28
|
export { HooksRunner, type HooksRunnerContext, type MapHookContext } from './hooks/HooksRunner.js';
|
|
29
29
|
export { InjectionToken } from './token/InjectionToken.js';
|
|
30
|
+
export { type Injectable, toToken, toMappedToken, argToToken } from './token/toToken.js';
|
|
30
31
|
export { GroupAliasToken, toGroupAlias } from './token/GroupAliasToken.js';
|
|
31
32
|
export { SingleAliasToken, toSingleAlias } from './token/SingleAliasToken.js';
|
|
32
33
|
export { ClassToken } from './token/ClassToken.js';
|
|
@@ -1,13 +1,24 @@
|
|
|
1
1
|
import { IInjector, InjectOptions, Injector } from './IInjector.js';
|
|
2
2
|
import type { IContainer } from '../container/IContainer.js';
|
|
3
3
|
import { type constructor } from '../utils/basic.js';
|
|
4
|
-
import { InjectionToken } from '../token/InjectionToken.js';
|
|
5
4
|
import { ProviderOptions } from '../provider/IProvider.js';
|
|
5
|
+
import { type Injectable } from '../token/toToken.js';
|
|
6
6
|
import { InjectFn } from '../hooks/hook.js';
|
|
7
|
+
import { type MapFn } from '../utils/fp.js';
|
|
7
8
|
export declare class MetadataInjector extends Injector implements IInjector {
|
|
8
9
|
protected createInstance<T>(scope: IContainer, Target: constructor<T>, { args: deps }?: InjectOptions): T;
|
|
9
10
|
}
|
|
10
|
-
export declare
|
|
11
|
+
export declare function inject<T, B>(fn: Injectable<T>, fn1: MapFn<T, B>): ParameterDecorator;
|
|
12
|
+
export declare function inject<T, B, C>(fn: Injectable<T>, fn1: MapFn<T, B>, fn2: MapFn<B, C>): ParameterDecorator;
|
|
13
|
+
export declare function inject<T, B, C, D>(fn: Injectable<T>, fn1: MapFn<T, B>, fn2: MapFn<B, C>, fn3: MapFn<C, D>): ParameterDecorator;
|
|
14
|
+
export declare function inject<T, B, C, D, E>(fn: Injectable<T>, fn1: MapFn<T, B>, fn2: MapFn<B, C>, fn3: MapFn<C, D>, fn4: MapFn<D, E>): ParameterDecorator;
|
|
15
|
+
export declare function inject<T, B, C, D, E, F>(fn: Injectable<T>, fn1: MapFn<T, B>, fn2: MapFn<B, C>, fn3: MapFn<C, D>, fn4: MapFn<D, E>, fn5: MapFn<E, F>): ParameterDecorator;
|
|
16
|
+
export declare function inject<T, B, C, D, E, F, G>(fn: Injectable<T>, fn1: MapFn<T, B>, fn2: MapFn<B, C>, fn3: MapFn<C, D>, fn4: MapFn<D, E>, fn5: MapFn<E, F>, fn6: MapFn<F, G>): ParameterDecorator;
|
|
17
|
+
export declare function inject<T, B, C, D, E, F, G, H>(fn: Injectable<T>, fn1: MapFn<T, B>, fn2: MapFn<B, C>, fn3: MapFn<C, D>, fn4: MapFn<D, E>, fn5: MapFn<E, F>, fn6: MapFn<F, G>, fn7: MapFn<G, H>): ParameterDecorator;
|
|
18
|
+
export declare function inject<T, B, C, D, E, F, G, H, I>(fn: Injectable<T>, fn1: MapFn<T, B>, fn2: MapFn<B, C>, fn3: MapFn<C, D>, fn4: MapFn<D, E>, fn5: MapFn<E, F>, fn6: MapFn<F, G>, fn7: MapFn<G, H>, fn8: MapFn<H, I>): ParameterDecorator;
|
|
19
|
+
export declare function inject<T, B, C, D, E, F, G, H, I, J>(fn: Injectable<T>, fn1: MapFn<T, B>, fn2: MapFn<B, C>, fn3: MapFn<C, D>, fn4: MapFn<D, E>, fn5: MapFn<E, F>, fn6: MapFn<F, G>, fn7: MapFn<G, H>, fn8: MapFn<H, I>, fn9: MapFn<I, J>): ParameterDecorator;
|
|
20
|
+
export declare function inject<T, B, C, D, E, F, G, H, I, J, K>(fn: Injectable<T>, fn1: MapFn<T, B>, fn2: MapFn<B, C>, fn3: MapFn<C, D>, fn4: MapFn<D, E>, fn5: MapFn<E, F>, fn6: MapFn<F, G>, fn7: MapFn<G, H>, fn8: MapFn<H, I>, fn9: MapFn<I, J>, fn10: MapFn<J, K>): ParameterDecorator;
|
|
21
|
+
export declare function inject<T>(fn: Injectable<T>, ...mappers: MapFn<T>[]): ParameterDecorator;
|
|
11
22
|
export declare const argsFn: <T = unknown>(predicate: (value: unknown, index: number) => boolean) => InjectFn<T>;
|
|
12
23
|
export declare const args: <T = unknown>(index: number) => InjectFn<T>;
|
|
13
24
|
export declare const resolveArgs: (Target: constructor<unknown>, methodName?: string) => (scope: IContainer, { args, lazy }: ProviderOptions) => unknown[];
|
package/typings/select.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { FunctionToken } from './token/FunctionToken.js';
|
|
|
3
3
|
import { GroupInstanceToken, InstancePredicate } from './token/GroupInstanceToken.js';
|
|
4
4
|
export declare const select: {
|
|
5
5
|
alias: <T>(token: import("./container/IContainer.js").DependencyKey) => import("./token/GroupAliasToken.js").GroupAliasToken<T>;
|
|
6
|
-
token: <T = any>(token: import("
|
|
6
|
+
token: <T = any>(token: import("./token/toToken.js").Injectable<T>) => import(".").InjectionToken<T>;
|
|
7
7
|
instances: (predicate?: InstancePredicate) => GroupInstanceToken;
|
|
8
8
|
scope: {
|
|
9
9
|
current: FunctionToken<IContainer>;
|
|
@@ -2,5 +2,8 @@ import { DependencyKey } from '../container/IContainer.js';
|
|
|
2
2
|
import { InjectionToken } from './InjectionToken.js';
|
|
3
3
|
import { InjectFn } from '../hooks/hook.js';
|
|
4
4
|
import { type constructor } from '../utils/basic.js';
|
|
5
|
-
|
|
5
|
+
import { type MapFn } from '../utils/fp.js';
|
|
6
|
+
export type Injectable<T = any> = InjectFn<T> | InjectionToken<T> | DependencyKey | constructor<T>;
|
|
7
|
+
export declare const toToken: <T = any>(token: Injectable<T>) => InjectionToken<T>;
|
|
6
8
|
export declare const argToToken: (v: unknown) => InjectionToken<unknown>;
|
|
9
|
+
export declare const toMappedToken: <T = any, R = T>(token: Injectable<T>, mappers: MapFn<any, any>[]) => InjectionToken<R>;
|