@asenajs/asena 0.7.1 → 0.8.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.
- package/README.md +2 -2
- package/dist/lib/adapter/AsenaAdapter.d.ts +2 -2
- package/dist/lib/adapter/AsenaAdapter.js.map +1 -1
- package/dist/lib/adapter/types/ServeOptions.d.ts +16 -0
- package/dist/lib/adapter/types/ValidationError.d.ts +53 -0
- package/dist/lib/adapter/types/ValidationError.js +24 -0
- package/dist/lib/adapter/types/ValidationError.js.map +1 -0
- package/dist/lib/adapter/types/index.d.ts +1 -0
- package/dist/lib/adapter/types/index.js +1 -0
- package/dist/lib/adapter/types/index.js.map +1 -1
- package/dist/lib/ioc/Container.d.ts +25 -0
- package/dist/lib/ioc/Container.js +47 -0
- package/dist/lib/ioc/Container.js.map +1 -1
- package/dist/lib/ioc/CoreContainer.d.ts +5 -3
- package/dist/lib/ioc/CoreContainer.js +9 -3
- package/dist/lib/ioc/CoreContainer.js.map +1 -1
- package/dist/lib/ioc/IocEngine.d.ts +50 -4
- package/dist/lib/ioc/IocEngine.js +138 -12
- package/dist/lib/ioc/IocEngine.js.map +1 -1
- package/dist/lib/ioc/component/componentRegistry.d.ts +22 -0
- package/dist/lib/ioc/component/componentRegistry.js +119 -0
- package/dist/lib/ioc/component/componentRegistry.js.map +1 -0
- package/dist/lib/ioc/component/componentUtils.js +4 -0
- package/dist/lib/ioc/component/componentUtils.js.map +1 -1
- package/dist/lib/ioc/component/decorators/Inject.js +16 -0
- package/dist/lib/ioc/component/decorators/Inject.js.map +1 -1
- package/dist/lib/ioc/component/index.d.ts +1 -0
- package/dist/lib/ioc/component/index.js +1 -0
- package/dist/lib/ioc/component/index.js.map +1 -1
- package/dist/lib/ioc/constants/ComponentConstants.d.ts +4 -0
- package/dist/lib/ioc/constants/ComponentConstants.js +5 -0
- package/dist/lib/ioc/constants/ComponentConstants.js.map +1 -1
- package/dist/lib/ioc/helper/fileHelper.d.ts +9 -0
- package/dist/lib/ioc/helper/fileHelper.js +41 -11
- package/dist/lib/ioc/helper/fileHelper.js.map +1 -1
- package/dist/lib/ioc/types/ICoreServiceNamesType.d.ts +1 -0
- package/dist/lib/ioc/types/ICoreServiceNamesType.js +1 -0
- package/dist/lib/ioc/types/ICoreServiceNamesType.js.map +1 -1
- package/dist/lib/ioc/types/InjectableComponent.d.ts +10 -0
- package/dist/lib/ioc/types/IocConfig.d.ts +7 -0
- package/dist/lib/ioc/types/decorators/ComponentType.d.ts +2 -1
- package/dist/lib/ioc/types/decorators/ComponentType.js +1 -0
- package/dist/lib/ioc/types/decorators/ComponentType.js.map +1 -1
- package/dist/lib/server/AsenaServer.d.ts +47 -3
- package/dist/lib/server/AsenaServer.js +167 -28
- package/dist/lib/server/AsenaServer.js.map +1 -1
- package/dist/lib/server/AsenaServerFactory.d.ts +38 -3
- package/dist/lib/server/AsenaServerFactory.js +21 -2
- package/dist/lib/server/AsenaServerFactory.js.map +1 -1
- package/dist/lib/server/config/AsenaConfig.d.ts +82 -4
- package/dist/lib/server/config/AsenaConfig.js +39 -1
- package/dist/lib/server/config/AsenaConfig.js.map +1 -1
- package/dist/lib/server/decorators/components/MessageController.d.ts +49 -0
- package/dist/lib/server/decorators/components/MessageController.js +62 -0
- package/dist/lib/server/decorators/components/MessageController.js.map +1 -0
- package/dist/lib/server/decorators/components/index.d.ts +1 -0
- package/dist/lib/server/decorators/components/index.js +1 -0
- package/dist/lib/server/decorators/components/index.js.map +1 -1
- package/dist/lib/server/event/EventDispatchService.d.ts +3 -7
- package/dist/lib/server/event/EventDispatchService.js +9 -40
- package/dist/lib/server/event/EventDispatchService.js.map +1 -1
- package/dist/lib/server/event/PatternHandlerIndex.d.ts +53 -0
- package/dist/lib/server/event/PatternHandlerIndex.js +100 -0
- package/dist/lib/server/event/PatternHandlerIndex.js.map +1 -0
- package/dist/lib/server/event/decorators/On.d.ts +4 -0
- package/dist/lib/server/event/decorators/On.js +6 -0
- package/dist/lib/server/event/decorators/On.js.map +1 -1
- package/dist/lib/server/event/index.d.ts +1 -0
- package/dist/lib/server/event/index.js +2 -0
- package/dist/lib/server/event/index.js.map +1 -1
- package/dist/lib/server/event/types.d.ts +12 -0
- package/dist/lib/server/health/HealthServer.d.ts +26 -0
- package/dist/lib/server/health/HealthServer.js +63 -0
- package/dist/lib/server/health/HealthServer.js.map +1 -0
- package/dist/lib/server/health/index.d.ts +1 -0
- package/dist/lib/server/health/index.js +2 -0
- package/dist/lib/server/health/index.js.map +1 -0
- package/dist/lib/server/messaging/Ulak.d.ts +156 -0
- package/dist/lib/server/messaging/Ulak.js +174 -0
- package/dist/lib/server/messaging/Ulak.js.map +1 -1
- package/dist/lib/server/messaging/types.d.ts +5 -1
- package/dist/lib/server/messaging/types.js +5 -0
- package/dist/lib/server/messaging/types.js.map +1 -1
- package/dist/lib/server/microservice/InMemoryTransport.d.ts +45 -0
- package/dist/lib/server/microservice/InMemoryTransport.js +124 -0
- package/dist/lib/server/microservice/InMemoryTransport.js.map +1 -0
- package/dist/lib/server/microservice/MicroserviceTransport.d.ts +132 -0
- package/dist/lib/server/microservice/MicroserviceTransport.js +2 -0
- package/dist/lib/server/microservice/MicroserviceTransport.js.map +1 -0
- package/dist/lib/server/microservice/decorators/EventPattern.d.ts +38 -0
- package/dist/lib/server/microservice/decorators/EventPattern.js +59 -0
- package/dist/lib/server/microservice/decorators/EventPattern.js.map +1 -0
- package/dist/lib/server/microservice/decorators/MessagePattern.d.ts +31 -0
- package/dist/lib/server/microservice/decorators/MessagePattern.js +55 -0
- package/dist/lib/server/microservice/decorators/MessagePattern.js.map +1 -0
- package/dist/lib/server/microservice/decorators/index.d.ts +2 -0
- package/dist/lib/server/microservice/decorators/index.js +3 -0
- package/dist/lib/server/microservice/decorators/index.js.map +1 -0
- package/dist/lib/server/microservice/index.d.ts +5 -0
- package/dist/lib/server/microservice/index.js +11 -0
- package/dist/lib/server/microservice/index.js.map +1 -0
- package/dist/lib/server/microservice/interceptorChain.d.ts +20 -0
- package/dist/lib/server/microservice/interceptorChain.js +39 -0
- package/dist/lib/server/microservice/interceptorChain.js.map +1 -0
- package/dist/lib/server/microservice/types.d.ts +142 -0
- package/dist/lib/server/microservice/types.js +5 -0
- package/dist/lib/server/microservice/types.js.map +1 -0
- package/dist/lib/server/src/services/PrepareEventService.d.ts +4 -1
- package/dist/lib/server/src/services/PrepareEventService.js +10 -3
- package/dist/lib/server/src/services/PrepareEventService.js.map +1 -1
- package/dist/lib/server/src/services/PrepareMicroserviceService.d.ts +66 -0
- package/dist/lib/server/src/services/PrepareMicroserviceService.js +193 -0
- package/dist/lib/server/src/services/PrepareMicroserviceService.js.map +1 -0
- package/dist/lib/test/factory/deepMock.d.ts +25 -0
- package/dist/lib/test/factory/deepMock.js +105 -0
- package/dist/lib/test/factory/deepMock.js.map +1 -0
- package/dist/lib/test/factory/ulakStub.d.ts +44 -0
- package/dist/lib/test/factory/ulakStub.js +40 -0
- package/dist/lib/test/factory/ulakStub.js.map +1 -0
- package/dist/lib/test/harness/createTestApp.d.ts +33 -0
- package/dist/lib/test/harness/createTestApp.js +105 -0
- package/dist/lib/test/harness/createTestApp.js.map +1 -0
- package/dist/lib/test/harness/createWebTest.d.ts +28 -0
- package/dist/lib/test/harness/createWebTest.js +127 -0
- package/dist/lib/test/harness/createWebTest.js.map +1 -0
- package/dist/lib/test/harness/silentLogger.d.ts +27 -0
- package/dist/lib/test/harness/silentLogger.js +54 -0
- package/dist/lib/test/harness/silentLogger.js.map +1 -0
- package/dist/lib/test/harness/types.d.ts +147 -0
- package/dist/lib/test/harness/types.js +2 -0
- package/dist/lib/test/harness/types.js.map +1 -0
- package/dist/lib/test/http/TestHttpCall.d.ts +78 -0
- package/dist/lib/test/http/TestHttpCall.js +149 -0
- package/dist/lib/test/http/TestHttpCall.js.map +1 -0
- package/dist/lib/test/http/TestHttpResponse.d.ts +46 -0
- package/dist/lib/test/http/TestHttpResponse.js +70 -0
- package/dist/lib/test/http/TestHttpResponse.js.map +1 -0
- package/dist/lib/test/index.d.ts +9 -0
- package/dist/lib/test/index.js +8 -0
- package/dist/lib/test/index.js.map +1 -1
- package/dist/lib/test/metadata/discovery.d.ts +21 -0
- package/dist/lib/test/metadata/discovery.js +37 -8
- package/dist/lib/test/metadata/discovery.js.map +1 -1
- package/dist/lib/test/mockComponent.d.ts +25 -0
- package/dist/lib/test/mockComponent.js +39 -6
- package/dist/lib/test/mockComponent.js.map +1 -1
- package/dist/lib/test/types.d.ts +13 -0
- package/package.json +11 -7
package/README.md
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
# Asena
|
|
6
6
|
|
|
7
|
-
[](https://asena.sh)
|
|
8
8
|
[](https://opensource.org/licenses/MIT)
|
|
9
|
-
[](https://bun.sh)
|
|
10
10
|
|
|
11
11
|
A high-performance IoC web framework for Bun runtime, bringing Spring Boot's automatic component discovery and field-based dependency injection to TypeScript.
|
|
12
12
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AsenaServeOptions, BaseMiddleware, ErrorHandler, RouteParams, WebsocketRouteParams } from './types';
|
|
1
|
+
import type { AsenaServeOptions, AsenaStartOptions, BaseMiddleware, ErrorHandler, RouteParams, WebsocketRouteParams } from './types';
|
|
2
2
|
import type { Server } from 'bun';
|
|
3
3
|
import type { AsenaWebsocketAdapter } from './AsenaWebsocketAdapter';
|
|
4
4
|
import type { ServerLogger } from '../logger';
|
|
@@ -89,7 +89,7 @@ export declare abstract class AsenaAdapter<C extends AsenaContext<any, any>, VS>
|
|
|
89
89
|
* Initializes and starts the server
|
|
90
90
|
* @returns Server instance
|
|
91
91
|
*/
|
|
92
|
-
abstract start(): Promise<Server<any>> | Server<any>;
|
|
92
|
+
abstract start(options?: AsenaStartOptions): Promise<Server<any>> | Server<any>;
|
|
93
93
|
/**
|
|
94
94
|
* Sets up global error handling
|
|
95
95
|
* @param errorHandler - Error handler implementation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AsenaAdapter.js","sourceRoot":"","sources":["../../../lib/adapter/AsenaAdapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AsenaAdapter.js","sourceRoot":"","sources":["../../../lib/adapter/AsenaAdapter.ts"],"names":[],"mappings":"AAcA;;;;;;GAMG;AACH,MAAM,OAAgB,YAAY;IAChC;;OAEG;IACa,IAAI,CAAS;IAE7B;;OAEG;IACO,IAAI,CAAS;IAEvB;;OAEG;IACO,MAAM,GAAiB,OAAO,CAAC;IAEzC;;OAEG;IACO,gBAAgB,CAAwB;IAElD;;;;OAIG;IACH,YAAsB,MAAoB,EAAE,gBAAwC;QAClF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,IAAI,gBAAgB,EAAE,CAAC;YACrB,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QAC3C,CAAC;IACH,CAAC;IA6FD;;OAEG;IACI,mBAAmB;QACxB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -26,3 +26,19 @@ export interface AsenaServeOptions {
|
|
|
26
26
|
serveOptions?: AsenaServerOptions;
|
|
27
27
|
wsOptions?: WSOptions;
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Options passed to `AsenaAdapter.start()`.
|
|
31
|
+
*
|
|
32
|
+
* Every field is optional and adapters may ignore what they do not support, so adding
|
|
33
|
+
* one stays backwards compatible for third-party adapters.
|
|
34
|
+
*/
|
|
35
|
+
export interface AsenaStartOptions {
|
|
36
|
+
/**
|
|
37
|
+
* Listen on a unix domain socket instead of a TCP port.
|
|
38
|
+
*
|
|
39
|
+
* Test harnesses use this to exercise the real routing pipeline without occupying a
|
|
40
|
+
* port. Adapters implementing it must not pass `hostname` to `Bun.serve` while it is
|
|
41
|
+
* set - Bun rejects that combination with "Cannot specify both hostname and unix".
|
|
42
|
+
*/
|
|
43
|
+
unix?: string;
|
|
44
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description A single field-level validation failure.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the shape of a Zod issue without depending on Zod - the core package
|
|
5
|
+
* stays dependency-free, and each adapter maps its own validator's issues onto this.
|
|
6
|
+
*/
|
|
7
|
+
export interface ValidationIssue {
|
|
8
|
+
/** Path to the offending field, e.g. `['user', 'email']` */
|
|
9
|
+
path: (string | number)[];
|
|
10
|
+
/** Human-readable description of what failed */
|
|
11
|
+
message: string;
|
|
12
|
+
/** Validator-specific issue code, e.g. `invalid_type` */
|
|
13
|
+
code?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Brand used instead of `instanceof`. A project that ends up with two copies of an
|
|
17
|
+
* adapter would have two distinct `ValidationError` classes, and `instanceof` would
|
|
18
|
+
* silently answer false for one of them; a registered symbol does not have that problem.
|
|
19
|
+
*/
|
|
20
|
+
export declare const VALIDATION_ERROR: unique symbol;
|
|
21
|
+
/**
|
|
22
|
+
* @description The contract every adapter's validation error satisfies.
|
|
23
|
+
*
|
|
24
|
+
* Adapters throw their own subclass of their HTTP exception type (so an existing
|
|
25
|
+
* `error instanceof HTTPException` branch keeps answering 400), and implement this
|
|
26
|
+
* on top of it so applications can read the failure in an adapter-agnostic way.
|
|
27
|
+
*/
|
|
28
|
+
export interface ValidationErrorLike extends Error {
|
|
29
|
+
readonly [VALIDATION_ERROR]: true;
|
|
30
|
+
/** Which part of the request failed validation: `json`, `query`, `param`, ... */
|
|
31
|
+
readonly target: string;
|
|
32
|
+
/** The individual field failures */
|
|
33
|
+
readonly issues: ValidationIssue[];
|
|
34
|
+
/** The underlying validator error, untyped here to keep core dependency-free */
|
|
35
|
+
readonly cause: unknown;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* @description Whether an error came from request validation.
|
|
39
|
+
*
|
|
40
|
+
* Use this in `ConfigService.onError` to give validation failures their own response
|
|
41
|
+
* envelope:
|
|
42
|
+
* ```typescript
|
|
43
|
+
* public onError(error: Error, context: Context) {
|
|
44
|
+
* if (isValidationError(error)) {
|
|
45
|
+
* return context.send({ success: false, errors: error.issues }, 400);
|
|
46
|
+
* }
|
|
47
|
+
* return context.send({ success: false, message: 'Internal error' }, 500);
|
|
48
|
+
* }
|
|
49
|
+
* ```
|
|
50
|
+
* @param {unknown} error - The error to test
|
|
51
|
+
* @returns {boolean} True when the error is an adapter validation error
|
|
52
|
+
*/
|
|
53
|
+
export declare const isValidationError: (error: unknown) => error is ValidationErrorLike;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brand used instead of `instanceof`. A project that ends up with two copies of an
|
|
3
|
+
* adapter would have two distinct `ValidationError` classes, and `instanceof` would
|
|
4
|
+
* silently answer false for one of them; a registered symbol does not have that problem.
|
|
5
|
+
*/
|
|
6
|
+
export const VALIDATION_ERROR = Symbol.for('asena.validationError');
|
|
7
|
+
/**
|
|
8
|
+
* @description Whether an error came from request validation.
|
|
9
|
+
*
|
|
10
|
+
* Use this in `ConfigService.onError` to give validation failures their own response
|
|
11
|
+
* envelope:
|
|
12
|
+
* ```typescript
|
|
13
|
+
* public onError(error: Error, context: Context) {
|
|
14
|
+
* if (isValidationError(error)) {
|
|
15
|
+
* return context.send({ success: false, errors: error.issues }, 400);
|
|
16
|
+
* }
|
|
17
|
+
* return context.send({ success: false, message: 'Internal error' }, 500);
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
* @param {unknown} error - The error to test
|
|
21
|
+
* @returns {boolean} True when the error is an adapter validation error
|
|
22
|
+
*/
|
|
23
|
+
export const isValidationError = (error) => typeof error === 'object' && error !== null && error[VALIDATION_ERROR] === true;
|
|
24
|
+
//# sourceMappingURL=ValidationError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValidationError.js","sourceRoot":"","sources":["../../../../lib/adapter/types/ValidationError.ts"],"names":[],"mappings":"AAiBA;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AAsBpE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAAgC,EAAE,CAChF,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAK,KAAiC,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/adapter/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/adapter/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,aAAa,CAAC"}
|
|
@@ -4,6 +4,7 @@ export declare class Container {
|
|
|
4
4
|
private _services;
|
|
5
5
|
private circularDetector;
|
|
6
6
|
private postProcessors;
|
|
7
|
+
private overriddenKeys;
|
|
7
8
|
constructor(services?: {
|
|
8
9
|
[key: string]: ContainerService | ContainerService[];
|
|
9
10
|
});
|
|
@@ -16,7 +17,31 @@ export declare class Container {
|
|
|
16
17
|
* @returns {Promise<void>}
|
|
17
18
|
*/
|
|
18
19
|
registerInstance<T>(key: string, instance: T): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* @description Replace a service with a pre-created test double (Spring's @MockBean).
|
|
22
|
+
*
|
|
23
|
+
* Seeds the container before user components are registered: any later `register()`
|
|
24
|
+
* call for the same key becomes a no-op, so the real class is never constructed and
|
|
25
|
+
* dependents capture the override in their injection closures.
|
|
26
|
+
*
|
|
27
|
+
* @param {string} key - Service identifier to override
|
|
28
|
+
* @param {T} instance - Replacement instance
|
|
29
|
+
* @returns {void}
|
|
30
|
+
*/
|
|
31
|
+
overrideInstance<T>(key: string, instance: T): void;
|
|
32
|
+
/**
|
|
33
|
+
* @description Check whether a key has been replaced by an override
|
|
34
|
+
* @param {string} key - Service key
|
|
35
|
+
* @returns {boolean}
|
|
36
|
+
*/
|
|
37
|
+
isOverridden(key: string): boolean;
|
|
19
38
|
resolve<T>(key: string): Promise<(T | T[]) | null>;
|
|
39
|
+
/**
|
|
40
|
+
* @description Check if a service is registered without resolving it
|
|
41
|
+
* @param {string} key - Service key
|
|
42
|
+
* @returns {boolean}
|
|
43
|
+
*/
|
|
44
|
+
has(key: string): boolean;
|
|
20
45
|
resolveStrategy<T>(key: string): Promise<T[] | null>;
|
|
21
46
|
/**
|
|
22
47
|
* @typeOfComponent is the type of the component
|
|
@@ -6,10 +6,17 @@ export class Container {
|
|
|
6
6
|
_services = {};
|
|
7
7
|
circularDetector = new CircularDependencyDetector();
|
|
8
8
|
postProcessors = [];
|
|
9
|
+
overriddenKeys = new Set();
|
|
9
10
|
constructor(services) {
|
|
10
11
|
this._services = services || {};
|
|
11
12
|
}
|
|
12
13
|
async register(key, Class, singleton) {
|
|
14
|
+
// An overridden key keeps its test double. Returning early means the real class is
|
|
15
|
+
// never instantiated (no @PostConstruct side effects) and the entry never turns
|
|
16
|
+
// into an array, which is what resolve() would otherwise hand back.
|
|
17
|
+
if (this.overriddenKeys.has(key)) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
13
20
|
if (this._services[key]) {
|
|
14
21
|
if (Array.isArray(this._services[key])) {
|
|
15
22
|
this._services[key].push({ Class, instance: singleton ? await this.prepareInstance(Class) : null, singleton });
|
|
@@ -40,6 +47,38 @@ export class Container {
|
|
|
40
47
|
singleton: true,
|
|
41
48
|
};
|
|
42
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* @description Replace a service with a pre-created test double (Spring's @MockBean).
|
|
52
|
+
*
|
|
53
|
+
* Seeds the container before user components are registered: any later `register()`
|
|
54
|
+
* call for the same key becomes a no-op, so the real class is never constructed and
|
|
55
|
+
* dependents capture the override in their injection closures.
|
|
56
|
+
*
|
|
57
|
+
* @param {string} key - Service identifier to override
|
|
58
|
+
* @param {T} instance - Replacement instance
|
|
59
|
+
* @returns {void}
|
|
60
|
+
*/
|
|
61
|
+
overrideInstance(key, instance) {
|
|
62
|
+
if (instance === null || instance === undefined) {
|
|
63
|
+
throw new Error(`Cannot override service '${key}' with ${instance === null ? 'null' : 'undefined'} - ` +
|
|
64
|
+
'an override must be an object instance. ' +
|
|
65
|
+
'A null override would fail later with an opaque "instance cannot be null" error at resolve time.');
|
|
66
|
+
}
|
|
67
|
+
this.overriddenKeys.add(key);
|
|
68
|
+
this._services[key] = {
|
|
69
|
+
Class: (instance.constructor ?? Object),
|
|
70
|
+
instance,
|
|
71
|
+
singleton: true,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* @description Check whether a key has been replaced by an override
|
|
76
|
+
* @param {string} key - Service key
|
|
77
|
+
* @returns {boolean}
|
|
78
|
+
*/
|
|
79
|
+
isOverridden(key) {
|
|
80
|
+
return this.overriddenKeys.has(key);
|
|
81
|
+
}
|
|
43
82
|
async resolve(key) {
|
|
44
83
|
// Check circular dependency
|
|
45
84
|
this.circularDetector.checkCircular(key);
|
|
@@ -58,6 +97,14 @@ export class Container {
|
|
|
58
97
|
this.circularDetector.pop(key);
|
|
59
98
|
}
|
|
60
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* @description Check if a service is registered without resolving it
|
|
102
|
+
* @param {string} key - Service key
|
|
103
|
+
* @returns {boolean}
|
|
104
|
+
*/
|
|
105
|
+
has(key) {
|
|
106
|
+
return this._services[key] !== undefined;
|
|
107
|
+
}
|
|
61
108
|
resolveStrategy(key) {
|
|
62
109
|
return this.resolve(key);
|
|
63
110
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Container.js","sourceRoot":"","sources":["../../../lib/ioc/Container.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,OAAO,SAAS;IACZ,SAAS,GAA6D,EAAE,CAAC;IAEzE,gBAAgB,GAAG,IAAI,0BAA0B,EAAE,CAAC;IAEpD,cAAc,GAA6B,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"Container.js","sourceRoot":"","sources":["../../../lib/ioc/Container.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,11 +14,11 @@ export declare class CoreContainer {
|
|
|
14
14
|
/**
|
|
15
15
|
* @description Bootstrap core framework services
|
|
16
16
|
* Executes Phase 1-5: System-level services
|
|
17
|
-
* @param {AsenaAdapter} adapter - HTTP adapter instance
|
|
17
|
+
* @param {AsenaAdapter | undefined} adapter - HTTP adapter instance (undefined = headless mode)
|
|
18
18
|
* @param {ServerLogger} logger - Logger instance
|
|
19
19
|
* @returns {Promise<void>}
|
|
20
20
|
*/
|
|
21
|
-
bootstrap(adapter: AsenaAdapter<any, any
|
|
21
|
+
bootstrap(adapter: AsenaAdapter<any, any> | undefined, logger: ServerLogger): Promise<void>;
|
|
22
22
|
/**
|
|
23
23
|
* @description Resolve a service from container
|
|
24
24
|
* @param {string} key - Service identifier
|
|
@@ -50,7 +50,9 @@ export declare class CoreContainer {
|
|
|
50
50
|
private registerIocEngine;
|
|
51
51
|
/**
|
|
52
52
|
* @description Phase 4: Register HTTP Adapter
|
|
53
|
-
*
|
|
53
|
+
* In headless mode (no adapter) the phase still advances - phases are
|
|
54
|
+
* bookkeeping, and AsenaServer resolves the adapter lazily via container.has()
|
|
55
|
+
* @param {AsenaAdapter | undefined} adapter - HTTP adapter instance
|
|
54
56
|
* @returns {Promise<void>}
|
|
55
57
|
*/
|
|
56
58
|
private registerAdapters;
|
|
@@ -9,6 +9,7 @@ import { PrepareStaticServeConfigService } from '../server/src/services/PrepareS
|
|
|
9
9
|
import { PrepareEventService } from '../server/src/services/PrepareEventService';
|
|
10
10
|
import { PrepareScheduleService } from '../server/src/services/PrepareScheduleService';
|
|
11
11
|
import { PrepareFrontendControllerService } from '../server/src/services/PrepareFrontendControllerService';
|
|
12
|
+
import { PrepareMicroserviceService } from '../server/src/services/PrepareMicroserviceService';
|
|
12
13
|
import { Ulak } from '../server/messaging';
|
|
13
14
|
import { EventDispatchService } from '../server/event';
|
|
14
15
|
import { EventEmitter } from '../server/event';
|
|
@@ -28,7 +29,7 @@ export class CoreContainer {
|
|
|
28
29
|
/**
|
|
29
30
|
* @description Bootstrap core framework services
|
|
30
31
|
* Executes Phase 1-5: System-level services
|
|
31
|
-
* @param {AsenaAdapter} adapter - HTTP adapter instance
|
|
32
|
+
* @param {AsenaAdapter | undefined} adapter - HTTP adapter instance (undefined = headless mode)
|
|
32
33
|
* @param {ServerLogger} logger - Logger instance
|
|
33
34
|
* @returns {Promise<void>}
|
|
34
35
|
*/
|
|
@@ -92,11 +93,15 @@ export class CoreContainer {
|
|
|
92
93
|
}
|
|
93
94
|
/**
|
|
94
95
|
* @description Phase 4: Register HTTP Adapter
|
|
95
|
-
*
|
|
96
|
+
* In headless mode (no adapter) the phase still advances - phases are
|
|
97
|
+
* bookkeeping, and AsenaServer resolves the adapter lazily via container.has()
|
|
98
|
+
* @param {AsenaAdapter | undefined} adapter - HTTP adapter instance
|
|
96
99
|
* @returns {Promise<void>}
|
|
97
100
|
*/
|
|
98
101
|
async registerAdapters(adapter) {
|
|
99
|
-
|
|
102
|
+
if (adapter) {
|
|
103
|
+
await this._container.registerInstance(ICoreServiceNames.ASENA_ADAPTER, adapter);
|
|
104
|
+
}
|
|
100
105
|
this._phase = CoreBootstrapPhase.PREPARE_SERVICES_INIT;
|
|
101
106
|
}
|
|
102
107
|
/**
|
|
@@ -119,6 +124,7 @@ export class CoreContainer {
|
|
|
119
124
|
{ name: ICoreServiceNames.PREPARE_STATIC_SERVE_CONFIG_SERVICE, Class: PrepareStaticServeConfigService },
|
|
120
125
|
{ name: ICoreServiceNames.PREPARE_EVENT_SERVICE, Class: PrepareEventService },
|
|
121
126
|
{ name: ICoreServiceNames.PREPARE_FRONTEND_CONTROLLER_SERVICE, Class: PrepareFrontendControllerService },
|
|
127
|
+
{ name: ICoreServiceNames.PREPARE_MICROSERVICE_SERVICE, Class: PrepareMicroserviceService },
|
|
122
128
|
// Schedule system (CronRunner must be registered before PrepareScheduleService)
|
|
123
129
|
{ name: ICoreServiceNames.CRON_RUNNER, Class: CronRunner },
|
|
124
130
|
{ name: ICoreServiceNames.PREPARE_SCHEDULE_SERVICE, Class: PrepareScheduleService },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CoreContainer.js","sourceRoot":"","sources":["../../../lib/ioc/CoreContainer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAC3F,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,gDAAgD,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,gDAAgD,CAAC;AACzF,OAAO,EAAE,+BAA+B,EAAE,MAAM,wDAAwD,CAAC;AACzG,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,gCAAgC,EAAE,MAAM,yDAAyD,CAAC;AAC3G,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD;;;GAGG;AACH,MAAM,OAAO,aAAa;IACP,UAAU,CAAY;IAE/B,YAAY,GAAG,KAAK,CAAC;IAErB,MAAM,CAAqB;IAEnC;QACE,IAAI,CAAC,UAAU,GAAG,IAAI,SAAS,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,kBAAkB,CAAC,cAAc,CAAC;IAClD,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"CoreContainer.js","sourceRoot":"","sources":["../../../lib/ioc/CoreContainer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { type ICoreService, type InjectableComponent, type IocConfig } from './types';
|
|
2
2
|
import type { Container } from './Container';
|
|
3
|
-
/**
|
|
4
|
-
* @description IoC Engine - Manages component registration and dependency injection
|
|
5
|
-
* Core service that handles automatic component discovery and registration
|
|
6
|
-
*/
|
|
7
3
|
export declare class IocEngine implements ICoreService {
|
|
8
4
|
serviceName: string;
|
|
9
5
|
private _container;
|
|
10
6
|
private logger;
|
|
11
7
|
private injectables;
|
|
12
8
|
private config?;
|
|
9
|
+
/** Entry files kept out of the scan, empty unless the scan actually ran */
|
|
10
|
+
private entryFiles;
|
|
11
|
+
/** Entry-declared components that existed by the time the scan ran */
|
|
12
|
+
private entryComponents;
|
|
13
13
|
/**
|
|
14
14
|
* @description Set IoC configuration
|
|
15
15
|
* @param {IocConfig} config - IoC configuration object
|
|
@@ -18,10 +18,56 @@ export declare class IocEngine implements ICoreService {
|
|
|
18
18
|
setConfig(config?: IocConfig): void;
|
|
19
19
|
searchAndRegister(components?: InjectableComponent[]): Promise<void>;
|
|
20
20
|
private loadComponents;
|
|
21
|
+
/**
|
|
22
|
+
* @description Report components that were declared in the entry file *after* the
|
|
23
|
+
* bootstrap call. Their decorators had not run yet when the scan read the registry,
|
|
24
|
+
* so they never made it into the container - and without this they would just be
|
|
25
|
+
* quietly missing at runtime.
|
|
26
|
+
* @returns {void}
|
|
27
|
+
*/
|
|
28
|
+
warnAboutLateEntryComponents(): void;
|
|
29
|
+
/**
|
|
30
|
+
* @description Absolute paths of the files that must be kept out of the scan:
|
|
31
|
+
* the entry declared in the config, and the module actually being executed.
|
|
32
|
+
* They are usually the same file, but not always - a project may declare one
|
|
33
|
+
* `rootFile` and start another, or run without a config at all.
|
|
34
|
+
* @returns {Set<string>} Resolved absolute entry paths
|
|
35
|
+
*/
|
|
36
|
+
private resolveEntryFiles;
|
|
37
|
+
/**
|
|
38
|
+
* @description Resolve a scanned path against the working directory. `getAllFiles`
|
|
39
|
+
* mirrors the form of the folder it was given, so a `sourceFolder` configured as an
|
|
40
|
+
* absolute path yields absolute entries that must not be joined onto cwd again.
|
|
41
|
+
* @param {string} file - Path as returned by the scan
|
|
42
|
+
* @returns {string} Absolute path
|
|
43
|
+
*/
|
|
44
|
+
private toAbsolutePath;
|
|
45
|
+
/**
|
|
46
|
+
* @description Collapse components that arrived from more than one source - a class
|
|
47
|
+
* re-exported through a barrel file, or one found by both the scan and the registry.
|
|
48
|
+
*
|
|
49
|
+
* Deduplication is by class identity, not by name: `Container.register` promotes a
|
|
50
|
+
* key to an array when the same name is registered twice, which would construct the
|
|
51
|
+
* component a second time (running @PostConstruct again) and hand every dependent an
|
|
52
|
+
* array instead of an instance.
|
|
53
|
+
* @param {InjectableComponent[]} components - Components from every source
|
|
54
|
+
* @returns {InjectableComponent[]} Components with duplicates removed
|
|
55
|
+
*/
|
|
56
|
+
private dedupeInjectables;
|
|
21
57
|
private validateAndRegisterComponents;
|
|
22
58
|
private register;
|
|
23
59
|
private getInjectables;
|
|
24
60
|
private importFiles;
|
|
61
|
+
/**
|
|
62
|
+
* @description Import a single component file, pointing at it if it takes suspiciously
|
|
63
|
+
* long. A module whose top-level await never settles would otherwise hang the boot with
|
|
64
|
+
* no output at all; the import itself is left alone, only reported.
|
|
65
|
+
* @param {string} filePath - Absolute path to import
|
|
66
|
+
* @param {string} file - Path as scanned, for the message
|
|
67
|
+
* @param {number} timeout - Milliseconds before warning, 0 disables
|
|
68
|
+
* @returns {Promise<any>} The imported module namespace
|
|
69
|
+
*/
|
|
70
|
+
private importFile;
|
|
25
71
|
private processComponents;
|
|
26
72
|
private isValidComponent;
|
|
27
73
|
private createComponentObject;
|