@asenajs/asena 0.7.0 → 0.8.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.
Files changed (140) hide show
  1. package/README.md +2 -2
  2. package/dist/lib/adapter/AsenaAdapter.d.ts +5 -3
  3. package/dist/lib/adapter/AsenaAdapter.js.map +1 -1
  4. package/dist/lib/adapter/AsenaContext.d.ts +6 -0
  5. package/dist/lib/adapter/types/ServeOptions.d.ts +16 -0
  6. package/dist/lib/ioc/Container.d.ts +25 -0
  7. package/dist/lib/ioc/Container.js +47 -0
  8. package/dist/lib/ioc/Container.js.map +1 -1
  9. package/dist/lib/ioc/CoreContainer.d.ts +5 -3
  10. package/dist/lib/ioc/CoreContainer.js +9 -3
  11. package/dist/lib/ioc/CoreContainer.js.map +1 -1
  12. package/dist/lib/ioc/IocEngine.js +4 -5
  13. package/dist/lib/ioc/IocEngine.js.map +1 -1
  14. package/dist/lib/ioc/component/decorators/Inject.js +16 -0
  15. package/dist/lib/ioc/component/decorators/Inject.js.map +1 -1
  16. package/dist/lib/ioc/constants/ComponentConstants.d.ts +4 -0
  17. package/dist/lib/ioc/constants/ComponentConstants.js +5 -0
  18. package/dist/lib/ioc/constants/ComponentConstants.js.map +1 -1
  19. package/dist/lib/ioc/types/ICoreServiceNamesType.d.ts +1 -0
  20. package/dist/lib/ioc/types/ICoreServiceNamesType.js +1 -0
  21. package/dist/lib/ioc/types/ICoreServiceNamesType.js.map +1 -1
  22. package/dist/lib/ioc/types/InjectableComponent.d.ts +10 -0
  23. package/dist/lib/ioc/types/decorators/ComponentType.d.ts +2 -1
  24. package/dist/lib/ioc/types/decorators/ComponentType.js +1 -0
  25. package/dist/lib/ioc/types/decorators/ComponentType.js.map +1 -1
  26. package/dist/lib/server/AsenaServer.d.ts +46 -3
  27. package/dist/lib/server/AsenaServer.js +159 -29
  28. package/dist/lib/server/AsenaServer.js.map +1 -1
  29. package/dist/lib/server/AsenaServerFactory.d.ts +38 -3
  30. package/dist/lib/server/AsenaServerFactory.js +21 -2
  31. package/dist/lib/server/AsenaServerFactory.js.map +1 -1
  32. package/dist/lib/server/config/AsenaConfig.d.ts +82 -4
  33. package/dist/lib/server/config/AsenaConfig.js +39 -1
  34. package/dist/lib/server/config/AsenaConfig.js.map +1 -1
  35. package/dist/lib/server/decorators/components/FrontendController.js.map +1 -1
  36. package/dist/lib/server/decorators/components/MessageController.d.ts +49 -0
  37. package/dist/lib/server/decorators/components/MessageController.js +62 -0
  38. package/dist/lib/server/decorators/components/MessageController.js.map +1 -0
  39. package/dist/lib/server/decorators/components/index.d.ts +1 -0
  40. package/dist/lib/server/decorators/components/index.js +1 -0
  41. package/dist/lib/server/decorators/components/index.js.map +1 -1
  42. package/dist/lib/server/event/EventDispatchService.d.ts +3 -7
  43. package/dist/lib/server/event/EventDispatchService.js +9 -40
  44. package/dist/lib/server/event/EventDispatchService.js.map +1 -1
  45. package/dist/lib/server/event/PatternHandlerIndex.d.ts +53 -0
  46. package/dist/lib/server/event/PatternHandlerIndex.js +100 -0
  47. package/dist/lib/server/event/PatternHandlerIndex.js.map +1 -0
  48. package/dist/lib/server/event/decorators/On.d.ts +4 -0
  49. package/dist/lib/server/event/decorators/On.js +6 -0
  50. package/dist/lib/server/event/decorators/On.js.map +1 -1
  51. package/dist/lib/server/event/index.d.ts +1 -0
  52. package/dist/lib/server/event/index.js +2 -0
  53. package/dist/lib/server/event/index.js.map +1 -1
  54. package/dist/lib/server/event/types.d.ts +12 -0
  55. package/dist/lib/server/health/HealthServer.d.ts +26 -0
  56. package/dist/lib/server/health/HealthServer.js +63 -0
  57. package/dist/lib/server/health/HealthServer.js.map +1 -0
  58. package/dist/lib/server/health/index.d.ts +1 -0
  59. package/dist/lib/server/health/index.js +2 -0
  60. package/dist/lib/server/health/index.js.map +1 -0
  61. package/dist/lib/server/messaging/Ulak.d.ts +156 -0
  62. package/dist/lib/server/messaging/Ulak.js +174 -0
  63. package/dist/lib/server/messaging/Ulak.js.map +1 -1
  64. package/dist/lib/server/messaging/types.d.ts +5 -1
  65. package/dist/lib/server/messaging/types.js +5 -0
  66. package/dist/lib/server/messaging/types.js.map +1 -1
  67. package/dist/lib/server/microservice/InMemoryTransport.d.ts +45 -0
  68. package/dist/lib/server/microservice/InMemoryTransport.js +124 -0
  69. package/dist/lib/server/microservice/InMemoryTransport.js.map +1 -0
  70. package/dist/lib/server/microservice/MicroserviceTransport.d.ts +132 -0
  71. package/dist/lib/server/microservice/MicroserviceTransport.js +2 -0
  72. package/dist/lib/server/microservice/MicroserviceTransport.js.map +1 -0
  73. package/dist/lib/server/microservice/decorators/EventPattern.d.ts +38 -0
  74. package/dist/lib/server/microservice/decorators/EventPattern.js +59 -0
  75. package/dist/lib/server/microservice/decorators/EventPattern.js.map +1 -0
  76. package/dist/lib/server/microservice/decorators/MessagePattern.d.ts +31 -0
  77. package/dist/lib/server/microservice/decorators/MessagePattern.js +55 -0
  78. package/dist/lib/server/microservice/decorators/MessagePattern.js.map +1 -0
  79. package/dist/lib/server/microservice/decorators/index.d.ts +2 -0
  80. package/dist/lib/server/microservice/decorators/index.js +3 -0
  81. package/dist/lib/server/microservice/decorators/index.js.map +1 -0
  82. package/dist/lib/server/microservice/index.d.ts +5 -0
  83. package/dist/lib/server/microservice/index.js +11 -0
  84. package/dist/lib/server/microservice/index.js.map +1 -0
  85. package/dist/lib/server/microservice/interceptorChain.d.ts +20 -0
  86. package/dist/lib/server/microservice/interceptorChain.js +39 -0
  87. package/dist/lib/server/microservice/interceptorChain.js.map +1 -0
  88. package/dist/lib/server/microservice/types.d.ts +142 -0
  89. package/dist/lib/server/microservice/types.js +5 -0
  90. package/dist/lib/server/microservice/types.js.map +1 -0
  91. package/dist/lib/server/src/services/PrepareEventService.d.ts +4 -1
  92. package/dist/lib/server/src/services/PrepareEventService.js +10 -3
  93. package/dist/lib/server/src/services/PrepareEventService.js.map +1 -1
  94. package/dist/lib/server/src/services/PrepareFrontendControllerService.d.ts +1 -0
  95. package/dist/lib/server/src/services/PrepareFrontendControllerService.js +1 -1
  96. package/dist/lib/server/src/services/PrepareFrontendControllerService.js.map +1 -1
  97. package/dist/lib/server/src/services/PrepareMicroserviceService.d.ts +66 -0
  98. package/dist/lib/server/src/services/PrepareMicroserviceService.js +193 -0
  99. package/dist/lib/server/src/services/PrepareMicroserviceService.js.map +1 -0
  100. package/dist/lib/server/src/services/PrepareScheduleService.js.map +1 -1
  101. package/dist/lib/server/web/decorators/methods/Connect.js +9 -1
  102. package/dist/lib/server/web/decorators/methods/Connect.js.map +1 -1
  103. package/dist/lib/server/web/decorators/methods/Options.js +9 -1
  104. package/dist/lib/server/web/decorators/methods/Options.js.map +1 -1
  105. package/dist/lib/server/web/websocket/AsenaSocket.js.map +1 -1
  106. package/dist/lib/test/factory/deepMock.d.ts +25 -0
  107. package/dist/lib/test/factory/deepMock.js +105 -0
  108. package/dist/lib/test/factory/deepMock.js.map +1 -0
  109. package/dist/lib/test/factory/ulakStub.d.ts +44 -0
  110. package/dist/lib/test/factory/ulakStub.js +40 -0
  111. package/dist/lib/test/factory/ulakStub.js.map +1 -0
  112. package/dist/lib/test/harness/createTestApp.d.ts +33 -0
  113. package/dist/lib/test/harness/createTestApp.js +105 -0
  114. package/dist/lib/test/harness/createTestApp.js.map +1 -0
  115. package/dist/lib/test/harness/createWebTest.d.ts +28 -0
  116. package/dist/lib/test/harness/createWebTest.js +127 -0
  117. package/dist/lib/test/harness/createWebTest.js.map +1 -0
  118. package/dist/lib/test/harness/silentLogger.d.ts +27 -0
  119. package/dist/lib/test/harness/silentLogger.js +54 -0
  120. package/dist/lib/test/harness/silentLogger.js.map +1 -0
  121. package/dist/lib/test/harness/types.d.ts +147 -0
  122. package/dist/lib/test/harness/types.js +2 -0
  123. package/dist/lib/test/harness/types.js.map +1 -0
  124. package/dist/lib/test/http/TestHttpCall.d.ts +78 -0
  125. package/dist/lib/test/http/TestHttpCall.js +149 -0
  126. package/dist/lib/test/http/TestHttpCall.js.map +1 -0
  127. package/dist/lib/test/http/TestHttpResponse.d.ts +46 -0
  128. package/dist/lib/test/http/TestHttpResponse.js +70 -0
  129. package/dist/lib/test/http/TestHttpResponse.js.map +1 -0
  130. package/dist/lib/test/index.d.ts +9 -0
  131. package/dist/lib/test/index.js +8 -0
  132. package/dist/lib/test/index.js.map +1 -1
  133. package/dist/lib/test/metadata/discovery.d.ts +21 -0
  134. package/dist/lib/test/metadata/discovery.js +37 -8
  135. package/dist/lib/test/metadata/discovery.js.map +1 -1
  136. package/dist/lib/test/mockComponent.d.ts +25 -0
  137. package/dist/lib/test/mockComponent.js +39 -6
  138. package/dist/lib/test/mockComponent.js.map +1 -1
  139. package/dist/lib/test/types.d.ts +13 -0
  140. package/package.json +11 -7
@@ -5,6 +5,13 @@ import type { MockComponentOptions, MockedComponent } from './types';
5
5
  * This is the main API for testing Asena components. It discovers all @Inject decorated
6
6
  * fields, generates mock objects for them, and injects them into a new instance.
7
7
  *
8
+ * What each field receives depends on how it was injected:
9
+ * - `@Inject(UserService)` - a mock shaped like the class: every method becomes a bun mock
10
+ * - `@Inject(ulak('/chat'))` and other expression injections - the expression is evaluated
11
+ * against a deep mock, so any call chain works and every call stays assertable
12
+ * - `@Inject('UserService')` - a plain `{}`, because a string carries no class reference.
13
+ * Pass `overrides` for those fields.
14
+ *
8
15
  * @template T - Type of the component being mocked
9
16
  * @param ComponentClass - Component class to instantiate and mock
10
17
  * @param options - Optional configuration for mocking behavior
@@ -52,6 +59,24 @@ import type { MockComponentOptions, MockedComponent } from './types';
52
59
  * }
53
60
  * });
54
61
  * ```
62
+ *
63
+ * @example
64
+ * ```typescript
65
+ * // Expression-based injections (e.g. the ulak() helper) work automatically:
66
+ * // the expression is evaluated against a deep mock, so the field behaves
67
+ * // like a real namespace and every method call is assertable
68
+ * const { instance, mocks } = mockComponent(ChatService);
69
+ *
70
+ * await instance.sendAnnouncement('hello');
71
+ *
72
+ * expect(mocks.chat.broadcast).toHaveBeenCalledWith({ type: 'announcement', text: 'hello' });
73
+ *
74
+ * // A field present in overrides is used as-is - its expression is skipped
75
+ * const stub = createTestUlakStub('/chat');
76
+ * const { instance: withStub } = mockComponent(ChatService, {
77
+ * overrides: { chat: stub },
78
+ * });
79
+ * ```
55
80
  */
56
81
  export declare function mockComponent<T extends object>(ComponentClass: new (...args: any[]) => T, options?: MockComponentOptions): MockedComponent<T>;
57
82
  /**
@@ -1,11 +1,19 @@
1
1
  import { discoverInjectedFields } from './metadata/discovery';
2
2
  import { createMockFromClass } from './factory/mockFactory';
3
+ import { createDeepMock } from './factory/deepMock';
3
4
  /**
4
5
  * Creates a test instance of a component with all @Inject dependencies automatically mocked
5
6
  *
6
7
  * This is the main API for testing Asena components. It discovers all @Inject decorated
7
8
  * fields, generates mock objects for them, and injects them into a new instance.
8
9
  *
10
+ * What each field receives depends on how it was injected:
11
+ * - `@Inject(UserService)` - a mock shaped like the class: every method becomes a bun mock
12
+ * - `@Inject(ulak('/chat'))` and other expression injections - the expression is evaluated
13
+ * against a deep mock, so any call chain works and every call stays assertable
14
+ * - `@Inject('UserService')` - a plain `{}`, because a string carries no class reference.
15
+ * Pass `overrides` for those fields.
16
+ *
9
17
  * @template T - Type of the component being mocked
10
18
  * @param ComponentClass - Component class to instantiate and mock
11
19
  * @param options - Optional configuration for mocking behavior
@@ -53,6 +61,24 @@ import { createMockFromClass } from './factory/mockFactory';
53
61
  * }
54
62
  * });
55
63
  * ```
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * // Expression-based injections (e.g. the ulak() helper) work automatically:
68
+ * // the expression is evaluated against a deep mock, so the field behaves
69
+ * // like a real namespace and every method call is assertable
70
+ * const { instance, mocks } = mockComponent(ChatService);
71
+ *
72
+ * await instance.sendAnnouncement('hello');
73
+ *
74
+ * expect(mocks.chat.broadcast).toHaveBeenCalledWith({ type: 'announcement', text: 'hello' });
75
+ *
76
+ * // A field present in overrides is used as-is - its expression is skipped
77
+ * const stub = createTestUlakStub('/chat');
78
+ * const { instance: withStub } = mockComponent(ChatService, {
79
+ * overrides: { chat: stub },
80
+ * });
81
+ * ```
56
82
  */
57
83
  export function mockComponent(ComponentClass, options = {}) {
58
84
  if (!ComponentClass || typeof ComponentClass !== 'function') {
@@ -65,16 +91,23 @@ export function mockComponent(ComponentClass, options = {}) {
65
91
  : allInjectedFields;
66
92
  const mocks = {};
67
93
  for (const field of fieldsToMock) {
68
- const { fieldName, expression } = field;
94
+ const { fieldName, expression, serviceClass } = field;
69
95
  let mockValue;
70
- if (options.overrides?.[fieldName]) {
96
+ if (options.overrides && Object.hasOwn(options.overrides, fieldName)) {
97
+ // Overrides are the FINAL field value: the expression is intentionally
98
+ // skipped and falsy values (0, '', null) are respected
71
99
  mockValue = options.overrides[fieldName];
72
100
  }
73
- else {
74
- mockValue = createMockFromClass(undefined);
101
+ else if (expression) {
102
+ // Expression fields (e.g. @Inject(ulak('/chat'))) receive a deep mock
103
+ // so any call chain the expression performs works without a running app
104
+ mockValue = expression(createDeepMock());
75
105
  }
76
- if (expression) {
77
- mockValue = expression(mockValue);
106
+ else {
107
+ // Class injections (@Inject(UserService)) get a mock shaped like the real class:
108
+ // every method becomes a bun mock. String injections (@Inject('UserService'))
109
+ // carry no class reference, so they degrade to {} and need an explicit override
110
+ mockValue = createMockFromClass(serviceClass);
78
111
  }
79
112
  instance[fieldName] = mockValue;
80
113
  mocks[fieldName] = mockValue;
@@ -1 +1 @@
1
- {"version":3,"file":"mockComponent.js","sourceRoot":"","sources":["../../../lib/test/mockComponent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,MAAM,UAAU,aAAa,CAC3B,cAAyC,EACzC,UAAgC,EAAE;IAElC,IAAI,CAAC,cAAc,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,4DAA4D,OAAO,cAAc,EAAE,CAAC,CAAC;IACvG,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;IACtC,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAE3D,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU;QACrC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACnF,CAAC,CAAC,iBAAiB,CAAC;IAEtB,MAAM,KAAK,GAAwB,EAAE,CAAC;IAEtC,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;QAExC,IAAI,SAAc,CAAC;QAEnB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;QAEA,QAAgB,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;QACzC,KAAK,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IAC/B,CAAC;IAED,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;YAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAQ,CAAC;QACzD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,cAAyC,EACzC,UAAgC,EAAE;IAElC,MAAM,MAAM,GAAG,aAAa,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAEtD,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"mockComponent.js","sourceRoot":"","sources":["../../../lib/test/mockComponent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8EG;AACH,MAAM,UAAU,aAAa,CAC3B,cAAyC,EACzC,UAAgC,EAAE;IAElC,IAAI,CAAC,cAAc,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,4DAA4D,OAAO,cAAc,EAAE,CAAC,CAAC;IACvG,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;IACtC,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAE3D,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU;QACrC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACnF,CAAC,CAAC,iBAAiB,CAAC;IAEtB,MAAM,KAAK,GAAwB,EAAE,CAAC;IAEtC,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;QAEtD,IAAI,SAAc,CAAC;QAEnB,IAAI,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;YACrE,uEAAuE;YACvE,uDAAuD;YACvD,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC3C,CAAC;aAAM,IAAI,UAAU,EAAE,CAAC;YACtB,sEAAsE;YACtE,wEAAwE;YACxE,SAAS,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,iFAAiF;YACjF,8EAA8E;YAC9E,gFAAgF;YAChF,SAAS,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAChD,CAAC;QAEA,QAAgB,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;QACzC,KAAK,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IAC/B,CAAC;IAED,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;YAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAQ,CAAC;QACzD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,cAAyC,EACzC,UAAgC,EAAE;IAElC,MAAM,MAAM,GAAG,aAAa,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAEtD,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -17,6 +17,11 @@ export interface MockComponentOptions {
17
17
  /**
18
18
  * Provide custom mocks instead of auto-generated ones (optional)
19
19
  *
20
+ * An override is the FINAL value injected into the field. For expression-based
21
+ * injections (e.g. @Inject(ulak('/chat'))) the expression is skipped entirely
22
+ * when the field is overridden. Presence is checked with Object.hasOwn, so
23
+ * falsy values (0, '', null, undefined) are injected as-is rather than ignored.
24
+ *
20
25
  * @example
21
26
  * ```typescript
22
27
  * mockComponent(AuthService, {
@@ -75,6 +80,14 @@ export interface FieldMetadata {
75
80
  * Service name (from @Inject decorator)
76
81
  */
77
82
  serviceName: string;
83
+ /**
84
+ * Class reference the field was injected with.
85
+ *
86
+ * Only present for class-based injections (`@Inject(UserService)`). String-based
87
+ * injections (`@Inject('UserService')`) carry no class reference, so this is
88
+ * undefined and auto-mocking degrades to an empty object.
89
+ */
90
+ serviceClass?: any;
78
91
  /**
79
92
  * Optional expression function for transformation
80
93
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asenajs/asena",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "author": "LibirSoft",
5
5
  "repository": {
6
6
  "type": "git",
@@ -12,15 +12,15 @@
12
12
  "reflect-metadata": "^0.2.2"
13
13
  },
14
14
  "devDependencies": {
15
- "@changesets/cli": "^2.30.0",
15
+ "@changesets/cli": "^2.31.1",
16
16
  "@types/bun": "latest",
17
- "@typescript-eslint/eslint-plugin": "^8.57.2",
18
- "@typescript-eslint/parser": "^8.57.2",
19
- "eslint": "^9.39.4",
17
+ "@typescript-eslint/eslint-plugin": "^8.65.0",
18
+ "@typescript-eslint/parser": "^8.65.0",
19
+ "eslint": "^9.39.5",
20
20
  "eslint-config-prettier": "^9.1.2",
21
- "prettier": "^3.8.1",
21
+ "prettier": "^3.9.6",
22
22
  "typescript": "^5.9.3",
23
- "typescript-eslint": "^8.57.2"
23
+ "typescript-eslint": "^8.65.0"
24
24
  },
25
25
  "exports": {
26
26
  ".": {
@@ -83,6 +83,10 @@
83
83
  "import": "./dist/lib/server/messaging/index.js",
84
84
  "types": "./dist/lib/server/messaging/index.d.ts"
85
85
  },
86
+ "./microservice": {
87
+ "import": "./dist/lib/server/microservice/index.js",
88
+ "types": "./dist/lib/server/microservice/index.d.ts"
89
+ },
86
90
  "./event": {
87
91
  "import": "./dist/lib/server/event/index.js",
88
92
  "types": "./dist/lib/server/event/index.d.ts"