@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";
@@ -5,6 +5,6 @@
5
5
  */
6
6
  /**
7
7
  * @description
8
- * markup a class as a injectable class
8
+ * Mark a class as an injectable class
9
9
  */
10
10
  export declare const injectable: () => ClassDecorator;
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(`can't use "@injectable()" decorate class "${target.name}" twice`);
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(`only can inject class type in constructor "${target.name}" parameter #${index}`);
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(`The class ${provider.name} has no injection metadata, please make sure the class is decorated with @Injectable().`, resolveRecord);
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(`can't use "@injectable()" decorate class "${target.name}" twice`);
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(`only can inject class type in constructor "${target.name}" parameter #${index}`);
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(`The class ${provider.name} has no injection metadata, please make sure the class is decorated with @Injectable().`, resolveRecord);
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.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.0"
18
+ "@husky-di/core": "1.0.1"
19
19
  },
20
20
  "devDependencies": {
21
21
  "@biomejs/biome": "2.1.3",