@husky-di/decorator 1.0.0 → 1.0.1
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.
|
@@ -1,8 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @overview
|
|
3
|
+
* Metadata key constants used for storing and retrieving dependency injection metadata
|
|
3
4
|
* @author AEPKILL
|
|
4
5
|
* @created 2021-10-03 20:55:17
|
|
5
6
|
*/
|
|
7
|
+
/**
|
|
8
|
+
* TypeScript's built-in metadata key for constructor parameter types.
|
|
9
|
+
*
|
|
10
|
+
* @see {@link https://www.typescriptlang.org/tsconfig/#Language_and_Environment_6254}
|
|
11
|
+
*/
|
|
6
12
|
export declare const ParamsMetadataKeyConst = "design:paramtypes";
|
|
13
|
+
/**
|
|
14
|
+
* Custom metadata key for storing injection metadata of a class.
|
|
15
|
+
* Contains information about how each constructor parameter should be resolved,
|
|
16
|
+
* including service identifiers and injection options.
|
|
17
|
+
*
|
|
18
|
+
* @remarks
|
|
19
|
+
* Stores: `Array<InjectionMetadata<T> | undefined>`
|
|
20
|
+
*
|
|
21
|
+
*/
|
|
7
22
|
export declare const InjectionMetadataKeyConst = "husky-di.injection-metadata";
|
|
8
|
-
export declare const InjectionParamsMetadataKeyConst = "husky-di.injection-params-metadata";
|
package/dist/index.cjs
CHANGED
|
@@ -43,7 +43,7 @@ const inject = (serviceIdentifier, options)=>tagged({
|
|
|
43
43
|
const InjectionMetadataMap = "undefined" == typeof WeakMap ? Map : WeakMap;
|
|
44
44
|
const injectionMetadataMap = new InjectionMetadataMap();
|
|
45
45
|
const injectable = ()=>(target)=>{
|
|
46
|
-
if (injectionMetadataMap.has(target)) throw new Error(`
|
|
46
|
+
if (injectionMetadataMap.has(target)) throw new Error(`Class '${target.name}' is already decorated with @Injectable()`);
|
|
47
47
|
const parametersServiceIdentifiers = Reflect.getMetadata(ParamsMetadataKeyConst, target) || [];
|
|
48
48
|
const parametersMetadata = Reflect.getMetadata(InjectionMetadataKeyConst, target) || [];
|
|
49
49
|
const metadata = [];
|
|
@@ -54,7 +54,7 @@ const injectable = ()=>(target)=>{
|
|
|
54
54
|
continue;
|
|
55
55
|
}
|
|
56
56
|
const serviceIdentifier = parametersServiceIdentifiers[index];
|
|
57
|
-
if ("function" != typeof serviceIdentifier) throw new Error(`
|
|
57
|
+
if ("function" != typeof serviceIdentifier) throw new Error(`Constructor '${target.name}' parameter #${index} must be a class type`);
|
|
58
58
|
metadata.push({
|
|
59
59
|
serviceIdentifier
|
|
60
60
|
});
|
|
@@ -68,8 +68,9 @@ const decoratorMiddleware = {
|
|
|
68
68
|
const { registration, resolveRecord } = params;
|
|
69
69
|
if (registration.type !== core_namespaceObject.RegistrationTypeEnum["class"]) return next(params);
|
|
70
70
|
const provider = registration.provider;
|
|
71
|
+
if (isPrimitiveConstructor(provider)) return new provider();
|
|
71
72
|
const parametersMetadata = injectionMetadataMap.get(provider);
|
|
72
|
-
if (!parametersMetadata) throw new core_namespaceObject.ResolveException(`
|
|
73
|
+
if (!parametersMetadata) throw new core_namespaceObject.ResolveException(`Class '${provider.name}' must be decorated with @Injectable()`, resolveRecord);
|
|
73
74
|
const parameters = parametersMetadata.map((metadata, index)=>{
|
|
74
75
|
const { serviceIdentifier, ...options } = metadata;
|
|
75
76
|
resolveRecord._internalStashCurrent();
|
|
@@ -84,6 +85,9 @@ const decoratorMiddleware = {
|
|
|
84
85
|
return new provider(...parameters);
|
|
85
86
|
}
|
|
86
87
|
};
|
|
88
|
+
function isPrimitiveConstructor(value) {
|
|
89
|
+
return value === String || value === Number || value === Boolean || value === Symbol || value === BigInt;
|
|
90
|
+
}
|
|
87
91
|
exports.decoratorMiddleware = __webpack_exports__.decoratorMiddleware;
|
|
88
92
|
exports.inject = __webpack_exports__.inject;
|
|
89
93
|
exports.injectable = __webpack_exports__.injectable;
|
package/dist/index.js
CHANGED
|
@@ -13,7 +13,7 @@ const inject = (serviceIdentifier, options)=>tagged({
|
|
|
13
13
|
const InjectionMetadataMap = "undefined" == typeof WeakMap ? Map : WeakMap;
|
|
14
14
|
const injectionMetadataMap = new InjectionMetadataMap();
|
|
15
15
|
const injectable = ()=>(target)=>{
|
|
16
|
-
if (injectionMetadataMap.has(target)) throw new Error(`
|
|
16
|
+
if (injectionMetadataMap.has(target)) throw new Error(`Class '${target.name}' is already decorated with @Injectable()`);
|
|
17
17
|
const parametersServiceIdentifiers = Reflect.getMetadata(ParamsMetadataKeyConst, target) || [];
|
|
18
18
|
const parametersMetadata = Reflect.getMetadata(InjectionMetadataKeyConst, target) || [];
|
|
19
19
|
const metadata = [];
|
|
@@ -24,7 +24,7 @@ const injectable = ()=>(target)=>{
|
|
|
24
24
|
continue;
|
|
25
25
|
}
|
|
26
26
|
const serviceIdentifier = parametersServiceIdentifiers[index];
|
|
27
|
-
if ("function" != typeof serviceIdentifier) throw new Error(`
|
|
27
|
+
if ("function" != typeof serviceIdentifier) throw new Error(`Constructor '${target.name}' parameter #${index} must be a class type`);
|
|
28
28
|
metadata.push({
|
|
29
29
|
serviceIdentifier
|
|
30
30
|
});
|
|
@@ -37,8 +37,9 @@ const decoratorMiddleware = {
|
|
|
37
37
|
const { registration, resolveRecord } = params;
|
|
38
38
|
if (registration.type !== RegistrationTypeEnum["class"]) return next(params);
|
|
39
39
|
const provider = registration.provider;
|
|
40
|
+
if (isPrimitiveConstructor(provider)) return new provider();
|
|
40
41
|
const parametersMetadata = injectionMetadataMap.get(provider);
|
|
41
|
-
if (!parametersMetadata) throw new ResolveException(`
|
|
42
|
+
if (!parametersMetadata) throw new ResolveException(`Class '${provider.name}' must be decorated with @Injectable()`, resolveRecord);
|
|
42
43
|
const parameters = parametersMetadata.map((metadata, index)=>{
|
|
43
44
|
const { serviceIdentifier, ...options } = metadata;
|
|
44
45
|
resolveRecord._internalStashCurrent();
|
|
@@ -53,4 +54,7 @@ const decoratorMiddleware = {
|
|
|
53
54
|
return new provider(...parameters);
|
|
54
55
|
}
|
|
55
56
|
};
|
|
57
|
+
function isPrimitiveConstructor(value) {
|
|
58
|
+
return value === String || value === Number || value === Boolean || value === Symbol || value === BigInt;
|
|
59
|
+
}
|
|
56
60
|
export { decoratorMiddleware, inject, injectable, tagged };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@husky-di/decorator",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"dist"
|
|
16
16
|
],
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@husky-di/core": "1.0.
|
|
18
|
+
"@husky-di/core": "1.0.1"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
21
|
"@biomejs/biome": "2.1.3",
|