stratal 0.0.6 → 0.0.7
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/dist/application.d.ts +10 -42
- package/dist/application.d.ts.map +1 -1
- package/dist/application.js +36 -77
- package/dist/application.js.map +1 -1
- package/dist/config/config.module.d.ts.map +1 -1
- package/dist/config/config.module.js +2 -1
- package/dist/config/config.module.js.map +1 -1
- package/dist/config/errors/config-module-not-initialized.error.d.ts +10 -0
- package/dist/config/errors/config-module-not-initialized.error.d.ts.map +1 -0
- package/dist/config/errors/config-module-not-initialized.error.js +12 -0
- package/dist/config/errors/config-module-not-initialized.error.js.map +1 -0
- package/dist/config/errors/index.d.ts +1 -0
- package/dist/config/errors/index.d.ts.map +1 -1
- package/dist/config/errors/index.js +1 -0
- package/dist/config/errors/index.js.map +1 -1
- package/dist/di/container.d.ts +5 -267
- package/dist/di/container.d.ts.map +1 -1
- package/dist/di/container.js +13 -288
- package/dist/di/container.js.map +1 -1
- package/dist/di/errors/request-scope-operation-not-allowed.error.d.ts +0 -1
- package/dist/di/errors/request-scope-operation-not-allowed.error.d.ts.map +1 -1
- package/dist/di/errors/request-scope-operation-not-allowed.error.js +0 -1
- package/dist/di/errors/request-scope-operation-not-allowed.error.js.map +1 -1
- package/dist/di/index.d.ts +0 -1
- package/dist/di/index.d.ts.map +1 -1
- package/dist/di/index.js +0 -1
- package/dist/di/index.js.map +1 -1
- package/dist/errors/error-codes.d.ts +2 -0
- package/dist/errors/error-codes.d.ts.map +1 -1
- package/dist/errors/error-codes.js +2 -0
- package/dist/errors/error-codes.js.map +1 -1
- package/dist/events/types.d.ts +1 -1
- package/dist/execution-context.d.ts +4 -0
- package/dist/execution-context.d.ts.map +1 -0
- package/dist/execution-context.js +2 -0
- package/dist/execution-context.js.map +1 -0
- package/dist/i18n/messages/en/errors.d.ts +2 -2
- package/dist/i18n/messages/en/errors.js +2 -2
- package/dist/i18n/messages/en/errors.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/logger/services/logger.service.d.ts +2 -15
- package/dist/logger/services/logger.service.d.ts.map +1 -1
- package/dist/logger/services/logger.service.js +11 -16
- package/dist/logger/services/logger.service.js.map +1 -1
- package/dist/router/errors/hono-app-already-configured.error.d.ts +10 -0
- package/dist/router/errors/hono-app-already-configured.error.d.ts.map +1 -0
- package/dist/router/errors/hono-app-already-configured.error.js +12 -0
- package/dist/router/errors/hono-app-already-configured.error.js.map +1 -0
- package/dist/router/errors/index.d.ts +1 -2
- package/dist/router/errors/index.d.ts.map +1 -1
- package/dist/router/errors/index.js +1 -2
- package/dist/router/errors/index.js.map +1 -1
- package/dist/router/hono-app.d.ts +38 -0
- package/dist/router/hono-app.d.ts.map +1 -0
- package/dist/router/hono-app.js +128 -0
- package/dist/router/hono-app.js.map +1 -0
- package/dist/router/index.d.ts +3 -3
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +6 -4
- package/dist/router/index.js.map +1 -1
- package/dist/router/router.tokens.d.ts +0 -28
- package/dist/router/router.tokens.d.ts.map +1 -1
- package/dist/router/router.tokens.js +0 -28
- package/dist/router/router.tokens.js.map +1 -1
- package/dist/router/services/index.d.ts +0 -1
- package/dist/router/services/index.d.ts.map +1 -1
- package/dist/router/services/index.js +0 -1
- package/dist/router/services/index.js.map +1 -1
- package/dist/stratal.d.ts +9 -26
- package/dist/stratal.d.ts.map +1 -1
- package/dist/stratal.js +22 -50
- package/dist/stratal.js.map +1 -1
- package/package.json +8 -8
- package/dist/di/request-context-store.d.ts +0 -122
- package/dist/di/request-context-store.d.ts.map +0 -1
- package/dist/di/request-context-store.js +0 -135
- package/dist/di/request-context-store.js.map +0 -1
- package/dist/router/errors/router-already-configured.error.d.ts +0 -5
- package/dist/router/errors/router-already-configured.error.d.ts.map +0 -1
- package/dist/router/errors/router-already-configured.error.js +0 -8
- package/dist/router/errors/router-already-configured.error.js.map +0 -1
- package/dist/router/errors/router-not-configured.error.d.ts +0 -5
- package/dist/router/errors/router-not-configured.error.d.ts.map +0 -1
- package/dist/router/errors/router-not-configured.error.js +0 -8
- package/dist/router/errors/router-not-configured.error.js.map +0 -1
- package/dist/router/router.service.d.ts +0 -62
- package/dist/router/router.service.d.ts.map +0 -1
- package/dist/router/router.service.js +0 -166
- package/dist/router/router.service.js.map +0 -1
- package/dist/router/services/request-scope.service.d.ts +0 -42
- package/dist/router/services/request-scope.service.d.ts.map +0 -1
- package/dist/router/services/request-scope.service.js +0 -76
- package/dist/router/services/request-scope.service.js.map +0 -1
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,OAAO,CAAA;AACrB,cAAc,SAAS,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,OAAO,CAAA;AACrB,cAAc,qBAAqB,CAAA;AACnC,cAAc,SAAS,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,OAAO,CAAA;AACrB,cAAc,SAAS,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,OAAO,CAAA;AACrB,cAAc,qBAAqB,CAAA;AACnC,cAAc,SAAS,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA"}
|
|
@@ -5,23 +5,18 @@ import type { ILogTransport } from '../transports/transport.interface';
|
|
|
5
5
|
/**
|
|
6
6
|
* Logger Service
|
|
7
7
|
*
|
|
8
|
-
* Main logging facade
|
|
9
|
-
* Singleton service that can be enriched with request context via `withContext()`.
|
|
8
|
+
* Main logging facade.
|
|
10
9
|
*
|
|
11
10
|
* **Features:**
|
|
12
|
-
* - Optional request context enrichment (userId) via `withContext()`
|
|
13
11
|
* - Async logging via ctx.waitUntil() for non-blocking performance
|
|
14
12
|
* - Multi-transport support (console, future Sentry/Cloudflare Analytics)
|
|
15
13
|
* - Configurable formatters (JSON production, Pretty development)
|
|
16
14
|
* - Log level filtering based on environment
|
|
17
15
|
*
|
|
18
16
|
* **Architecture:**
|
|
19
|
-
* - Singleton service (available during initialization and request handling)
|
|
20
|
-
* - RouterContext optionally set via `withContext()` method
|
|
21
|
-
* - Uses ConfigService for all configuration (NEVER process.env)
|
|
22
17
|
* - Transports and formatters injected via DI
|
|
23
18
|
*
|
|
24
|
-
* @example Basic usage
|
|
19
|
+
* @example Basic usage
|
|
25
20
|
* ```typescript
|
|
26
21
|
* @Transient()
|
|
27
22
|
* export class UserService {
|
|
@@ -35,14 +30,6 @@ import type { ILogTransport } from '../transports/transport.interface';
|
|
|
35
30
|
* }
|
|
36
31
|
* }
|
|
37
32
|
* ```
|
|
38
|
-
*
|
|
39
|
-
* @example With request context (in request container)
|
|
40
|
-
* ```typescript
|
|
41
|
-
* // In RequestScopeService
|
|
42
|
-
* const baseLogger = globalContainer.resolve<LoggerService>(LOGGER_TOKENS.LoggerService)
|
|
43
|
-
* const requestLogger = baseLogger.withContext(routerContext)
|
|
44
|
-
* requestContainer.register(LOGGER_TOKENS.LoggerService, { useValue: requestLogger })
|
|
45
|
-
* ```
|
|
46
33
|
*/
|
|
47
34
|
export declare class LoggerService {
|
|
48
35
|
private readonly logLevel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.service.d.ts","sourceRoot":"","sources":["../../../src/logger/services/logger.service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAsB,UAAU,EAAY,MAAM,cAAc,CAAA;AAC5E,OAAO,EAAsB,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAA;AAEtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAA;AAEtE
|
|
1
|
+
{"version":3,"file":"logger.service.d.ts","sourceRoot":"","sources":["../../../src/logger/services/logger.service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAsB,UAAU,EAAY,MAAM,cAAc,CAAA;AAC5E,OAAO,EAAsB,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAA;AAEtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAA;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBACa,aAAa;IAGtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAGzB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAGjC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAG1B,OAAO,CAAC,QAAQ,CAAC,UAAU;gBATV,QAAQ,EAAE,QAAQ,EAGlB,gBAAgB,EAAE,UAAU,CAAC,gBAAgB,EAG7C,SAAS,EAAE,aAAa,EAGxB,UAAU,EAAE,aAAa,EAAE;IAG9C;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIlD;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIjD;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIjD;;;OAGG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,IAAI;IAajE;;;;OAIG;IACH,OAAO,CAAC,GAAG;IAyCX;;;OAGG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,cAAc;CAOvB"}
|
|
@@ -18,23 +18,18 @@ import { LOGGER_TOKENS } from '../logger.tokens';
|
|
|
18
18
|
/**
|
|
19
19
|
* Logger Service
|
|
20
20
|
*
|
|
21
|
-
* Main logging facade
|
|
22
|
-
* Singleton service that can be enriched with request context via `withContext()`.
|
|
21
|
+
* Main logging facade.
|
|
23
22
|
*
|
|
24
23
|
* **Features:**
|
|
25
|
-
* - Optional request context enrichment (userId) via `withContext()`
|
|
26
24
|
* - Async logging via ctx.waitUntil() for non-blocking performance
|
|
27
25
|
* - Multi-transport support (console, future Sentry/Cloudflare Analytics)
|
|
28
26
|
* - Configurable formatters (JSON production, Pretty development)
|
|
29
27
|
* - Log level filtering based on environment
|
|
30
28
|
*
|
|
31
29
|
* **Architecture:**
|
|
32
|
-
* - Singleton service (available during initialization and request handling)
|
|
33
|
-
* - RouterContext optionally set via `withContext()` method
|
|
34
|
-
* - Uses ConfigService for all configuration (NEVER process.env)
|
|
35
30
|
* - Transports and formatters injected via DI
|
|
36
31
|
*
|
|
37
|
-
* @example Basic usage
|
|
32
|
+
* @example Basic usage
|
|
38
33
|
* ```typescript
|
|
39
34
|
* @Transient()
|
|
40
35
|
* export class UserService {
|
|
@@ -48,14 +43,6 @@ import { LOGGER_TOKENS } from '../logger.tokens';
|
|
|
48
43
|
* }
|
|
49
44
|
* }
|
|
50
45
|
* ```
|
|
51
|
-
*
|
|
52
|
-
* @example With request context (in request container)
|
|
53
|
-
* ```typescript
|
|
54
|
-
* // In RequestScopeService
|
|
55
|
-
* const baseLogger = globalContainer.resolve<LoggerService>(LOGGER_TOKENS.LoggerService)
|
|
56
|
-
* const requestLogger = baseLogger.withContext(routerContext)
|
|
57
|
-
* requestContainer.register(LOGGER_TOKENS.LoggerService, { useValue: requestLogger })
|
|
58
|
-
* ```
|
|
59
46
|
*/
|
|
60
47
|
let LoggerService = class LoggerService {
|
|
61
48
|
logLevel;
|
|
@@ -126,7 +113,15 @@ let LoggerService = class LoggerService {
|
|
|
126
113
|
console.error(`Transport ${transport.name} failed:`, err);
|
|
127
114
|
}));
|
|
128
115
|
// Use waitUntil to ensure logs complete even after response sent
|
|
129
|
-
|
|
116
|
+
const allWrites = Promise.all(writePromises);
|
|
117
|
+
try {
|
|
118
|
+
this.executionContext.waitUntil(allWrites);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
if (!(error instanceof Error) || !error.message.includes('global scope')) {
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
130
125
|
}
|
|
131
126
|
/**
|
|
132
127
|
* Enrich log context with request info and timestamp
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.service.js","sourceRoot":"","sources":["../../../src/logger/services/logger.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAErE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAGhD
|
|
1
|
+
{"version":3,"file":"logger.service.js","sourceRoot":"","sources":["../../../src/logger/services/logger.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ApplicationError } from '../../errors';
|
|
2
|
+
/**
|
|
3
|
+
* Error thrown when HonoApp.configure() is called more than once.
|
|
4
|
+
*
|
|
5
|
+
* HonoApp can only be configured a single time during application bootstrap.
|
|
6
|
+
*/
|
|
7
|
+
export declare class HonoAppAlreadyConfiguredError extends ApplicationError {
|
|
8
|
+
constructor();
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=hono-app-already-configured.error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono-app-already-configured.error.d.ts","sourceRoot":"","sources":["../../../src/router/errors/hono-app-already-configured.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAe,MAAM,cAAc,CAAA;AAE5D;;;;GAIG;AACH,qBAAa,6BAA8B,SAAQ,gBAAgB;;CAOlE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ApplicationError, ERROR_CODES } from '../../errors';
|
|
2
|
+
/**
|
|
3
|
+
* Error thrown when HonoApp.configure() is called more than once.
|
|
4
|
+
*
|
|
5
|
+
* HonoApp can only be configured a single time during application bootstrap.
|
|
6
|
+
*/
|
|
7
|
+
export class HonoAppAlreadyConfiguredError extends ApplicationError {
|
|
8
|
+
constructor() {
|
|
9
|
+
super('errors.honoAppAlreadyConfigured', ERROR_CODES.SYSTEM.CONFIGURATION_ERROR);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=hono-app-already-configured.error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono-app-already-configured.error.js","sourceRoot":"","sources":["../../../src/router/errors/hono-app-already-configured.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE5D;;;;GAIG;AACH,MAAM,OAAO,6BAA8B,SAAQ,gBAAgB;IACjE;QACE,KAAK,CACH,iCAAiC,EACjC,WAAW,CAAC,MAAM,CAAC,mBAAmB,CACvC,CAAA;IACH,CAAC;CACF"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
export { ControllerMethodNotFoundError } from './controller-method-not-found.error';
|
|
2
|
+
export { HonoAppAlreadyConfiguredError } from './hono-app-already-configured.error';
|
|
2
3
|
export { ControllerRegistrationError } from './controller-registration.error';
|
|
3
4
|
export { OpenAPIRouteRegistrationError } from './openapi-route-registration.error';
|
|
4
5
|
export { OpenAPIValidationError } from './openapi-validation.error';
|
|
5
6
|
export { RouteNotFoundError } from './route-not-found.error';
|
|
6
|
-
export * from './router-already-configured.error';
|
|
7
|
-
export * from './router-not-configured.error';
|
|
8
7
|
export { SchemaValidationError } from './schema-validation.error';
|
|
9
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/router/errors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,qCAAqC,CAAA;AACnF,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAA;AAC7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAA;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/router/errors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,qCAAqC,CAAA;AACnF,OAAO,EAAE,6BAA6B,EAAE,MAAM,qCAAqC,CAAA;AACnF,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAA;AAC7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAA;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
export { ControllerMethodNotFoundError } from './controller-method-not-found.error';
|
|
2
|
+
export { HonoAppAlreadyConfiguredError } from './hono-app-already-configured.error';
|
|
2
3
|
export { ControllerRegistrationError } from './controller-registration.error';
|
|
3
4
|
export { OpenAPIRouteRegistrationError } from './openapi-route-registration.error';
|
|
4
5
|
export { OpenAPIValidationError } from './openapi-validation.error';
|
|
5
6
|
export { RouteNotFoundError } from './route-not-found.error';
|
|
6
|
-
export * from './router-already-configured.error';
|
|
7
|
-
export * from './router-not-configured.error';
|
|
8
7
|
export { SchemaValidationError } from './schema-validation.error';
|
|
9
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/router/errors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,qCAAqC,CAAA;AACnF,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAA;AAC7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAA;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/router/errors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,qCAAqC,CAAA;AACnF,OAAO,EAAE,6BAA6B,EAAE,MAAM,qCAAqC,CAAA;AACnF,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAA;AAC7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAA;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Container } from '../di/container';
|
|
2
|
+
import { OpenAPIHono } from '../i18n/validation';
|
|
3
|
+
import type { LoggerService } from '../logger';
|
|
4
|
+
import { type MiddlewareConfigEntry } from '../middleware';
|
|
5
|
+
import type { Constructor } from '../types';
|
|
6
|
+
import type { IController } from './controller';
|
|
7
|
+
import type { RouterEnv } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* HonoApp — extends OpenAPIHono with Stratal-specific setup
|
|
10
|
+
*
|
|
11
|
+
* Absorbs all Hono-related setup from the former RouterService and RequestScopeService:
|
|
12
|
+
* - Request scope middleware (child container per request)
|
|
13
|
+
* - Global middleware (CORS, logging, error handling)
|
|
14
|
+
* - defaultHook for validation errors
|
|
15
|
+
* - `use()` overload for Stratal middleware classes
|
|
16
|
+
* - `configure()` for module middleware, OpenAPI, routes, and 404
|
|
17
|
+
*/
|
|
18
|
+
export declare class HonoApp extends OpenAPIHono<RouterEnv> {
|
|
19
|
+
private configured;
|
|
20
|
+
private readonly _container;
|
|
21
|
+
private readonly _logger;
|
|
22
|
+
/**
|
|
23
|
+
* Reference to the original Hono `use` implementation.
|
|
24
|
+
* Captured in constructor after super() sets it as an instance property.
|
|
25
|
+
* Used by private methods to register middleware without going through the override.
|
|
26
|
+
*/
|
|
27
|
+
private nativeUse;
|
|
28
|
+
constructor(container: Container, logger: LoggerService);
|
|
29
|
+
/**
|
|
30
|
+
* Configure module middleware, OpenAPI endpoints, controller routes, and 404 handler.
|
|
31
|
+
* Called once by Application.initialize().
|
|
32
|
+
*/
|
|
33
|
+
configure(middlewareConfigs: MiddlewareConfigEntry[], controllers: Constructor<IController>[]): void;
|
|
34
|
+
private setupRequestScope;
|
|
35
|
+
private setupGlobalMiddleware;
|
|
36
|
+
private applyMiddlewareClasses;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=hono-app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono-app.d.ts","sourceRoot":"","sources":["../../src/router/hono-app.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAGhD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,eAAe,CAAA;AAEtB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAQ/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAOxC;;;;;;;;;GASG;AACH,qBAAa,OAAQ,SAAQ,WAAW,CAAC,SAAS,CAAC;IACjD,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAW;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IAEvC;;;;OAIG;IACH,OAAO,CAAC,SAAS,CAAkB;gBAGjC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,aAAa;IAwCvB;;;OAGG;IACH,SAAS,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,EAAE,WAAW,EAAE,WAAW,CAAC,WAAW,CAAC,EAAE,GAAG,IAAI;IAqBpG,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,sBAAsB;CAiB/B"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { cors } from 'hono/cors';
|
|
2
|
+
import { DI_TOKENS } from '../di/tokens';
|
|
3
|
+
import { getHttpStatus } from '../errors';
|
|
4
|
+
import { OpenAPIHono } from '../i18n/validation';
|
|
5
|
+
import { MiddlewareConfigurationService, } from '../middleware';
|
|
6
|
+
import { OPENAPI_TOKENS } from '../openapi';
|
|
7
|
+
import { ROUTER_CONTEXT_KEYS } from './constants';
|
|
8
|
+
import { RouteNotFoundError } from './errors';
|
|
9
|
+
import { HonoAppAlreadyConfiguredError } from './errors/hono-app-already-configured.error';
|
|
10
|
+
import { SchemaValidationError } from './errors/schema-validation.error';
|
|
11
|
+
import { createLoggerMiddleware } from './middleware';
|
|
12
|
+
import { RouterContext } from './router-context';
|
|
13
|
+
import { RouteRegistrationService } from './services/route-registration.service';
|
|
14
|
+
const isMiddlewareClass = (arg) =>
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
16
|
+
typeof arg === 'function' && arg.prototype && 'handle' in arg.prototype;
|
|
17
|
+
/**
|
|
18
|
+
* HonoApp — extends OpenAPIHono with Stratal-specific setup
|
|
19
|
+
*
|
|
20
|
+
* Absorbs all Hono-related setup from the former RouterService and RequestScopeService:
|
|
21
|
+
* - Request scope middleware (child container per request)
|
|
22
|
+
* - Global middleware (CORS, logging, error handling)
|
|
23
|
+
* - defaultHook for validation errors
|
|
24
|
+
* - `use()` overload for Stratal middleware classes
|
|
25
|
+
* - `configure()` for module middleware, OpenAPI, routes, and 404
|
|
26
|
+
*/
|
|
27
|
+
export class HonoApp extends OpenAPIHono {
|
|
28
|
+
configured = false;
|
|
29
|
+
_container;
|
|
30
|
+
_logger;
|
|
31
|
+
/**
|
|
32
|
+
* Reference to the original Hono `use` implementation.
|
|
33
|
+
* Captured in constructor after super() sets it as an instance property.
|
|
34
|
+
* Used by private methods to register middleware without going through the override.
|
|
35
|
+
*/
|
|
36
|
+
nativeUse;
|
|
37
|
+
constructor(container, logger) {
|
|
38
|
+
super({
|
|
39
|
+
defaultHook: (result, c) => {
|
|
40
|
+
if (!result.success) {
|
|
41
|
+
const requestContainer = c.get(ROUTER_CONTEXT_KEYS.REQUEST_CONTAINER);
|
|
42
|
+
const errorHandler = requestContainer.resolve(DI_TOKENS.ErrorHandler);
|
|
43
|
+
const validationError = new SchemaValidationError(result.error);
|
|
44
|
+
const errorResponse = errorHandler.handle(validationError);
|
|
45
|
+
return c.json(errorResponse, getHttpStatus(errorResponse.code));
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
this._container = container;
|
|
50
|
+
this._logger = logger;
|
|
51
|
+
// Capture Hono's original `use` (set by super() as an instance property)
|
|
52
|
+
this.nativeUse = this.use;
|
|
53
|
+
// Override `use` to support Stratal middleware classes alongside Hono-native handlers
|
|
54
|
+
this.use = ((...args) => {
|
|
55
|
+
if (isMiddlewareClass(args[0])) {
|
|
56
|
+
this.applyMiddlewareClasses('*', args);
|
|
57
|
+
return this;
|
|
58
|
+
}
|
|
59
|
+
if (typeof args[0] === 'string' && args.length > 1 && isMiddlewareClass(args[1])) {
|
|
60
|
+
this.applyMiddlewareClasses(args[0], args.slice(1));
|
|
61
|
+
return this;
|
|
62
|
+
}
|
|
63
|
+
return this.nativeUse(...args);
|
|
64
|
+
});
|
|
65
|
+
// Internal setup — uses nativeUse to bypass the override
|
|
66
|
+
this.setupRequestScope();
|
|
67
|
+
this.setupGlobalMiddleware();
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Configure module middleware, OpenAPI endpoints, controller routes, and 404 handler.
|
|
71
|
+
* Called once by Application.initialize().
|
|
72
|
+
*/
|
|
73
|
+
configure(middlewareConfigs, controllers) {
|
|
74
|
+
if (this.configured)
|
|
75
|
+
throw new HonoAppAlreadyConfiguredError();
|
|
76
|
+
// Module middleware
|
|
77
|
+
const middlewareConfigService = new MiddlewareConfigurationService(this._logger);
|
|
78
|
+
middlewareConfigService.applyMiddlewares(this, middlewareConfigs, controllers, this._container);
|
|
79
|
+
// OpenAPI endpoints
|
|
80
|
+
const openAPIService = this._container.resolve(OPENAPI_TOKENS.OpenAPIService);
|
|
81
|
+
openAPIService.setupEndpoints(this, controllers);
|
|
82
|
+
// Controller routes
|
|
83
|
+
const routeRegistrationService = new RouteRegistrationService(this._logger);
|
|
84
|
+
routeRegistrationService.configure(this, controllers);
|
|
85
|
+
// 404 handler (must be last)
|
|
86
|
+
this.notFound((c) => { throw new RouteNotFoundError(c.req.path, c.req.method); });
|
|
87
|
+
this.configured = true;
|
|
88
|
+
}
|
|
89
|
+
setupRequestScope() {
|
|
90
|
+
this.nativeUse('*', async (c, next) => {
|
|
91
|
+
const routerContext = new RouterContext(c);
|
|
92
|
+
const requestContainer = this._container.createRequestScope(routerContext);
|
|
93
|
+
c.set(ROUTER_CONTEXT_KEYS.REQUEST_CONTAINER, requestContainer);
|
|
94
|
+
try {
|
|
95
|
+
await next();
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
await requestContainer.dispose();
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
setupGlobalMiddleware() {
|
|
103
|
+
this.nativeUse('*', cors());
|
|
104
|
+
this.nativeUse('*', createLoggerMiddleware(this._logger));
|
|
105
|
+
this.onError((err, c) => {
|
|
106
|
+
const requestContainer = c.get(ROUTER_CONTEXT_KEYS.REQUEST_CONTAINER);
|
|
107
|
+
const errorHandler = requestContainer.resolve(DI_TOKENS.ErrorHandler);
|
|
108
|
+
const errorResponse = errorHandler.handle(err);
|
|
109
|
+
return c.json(errorResponse, getHttpStatus(errorResponse.code));
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
applyMiddlewareClasses(path, classes) {
|
|
113
|
+
this.nativeUse(path, async (c, next) => {
|
|
114
|
+
const requestContainer = c.get(ROUTER_CONTEXT_KEYS.REQUEST_CONTAINER);
|
|
115
|
+
const ctx = new RouterContext(c);
|
|
116
|
+
// Build chain from end to start
|
|
117
|
+
let current = next;
|
|
118
|
+
for (let i = classes.length - 1; i >= 0; i--) {
|
|
119
|
+
const prevNext = current;
|
|
120
|
+
const middleware = requestContainer.resolve(classes[i]);
|
|
121
|
+
current = () => middleware.handle(ctx, prevNext);
|
|
122
|
+
}
|
|
123
|
+
await current();
|
|
124
|
+
});
|
|
125
|
+
return this;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=hono-app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono-app.js","sourceRoot":"","sources":["../../src/router/hono-app.ts"],"names":[],"mappings":"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"}
|
package/dist/router/index.d.ts
CHANGED
|
@@ -3,11 +3,11 @@ export type { Middleware } from './middleware.interface';
|
|
|
3
3
|
export type { ControllerOptions, RouteConfig, RouterEnv, RouteResponse, RouterVariables, SecurityScheme } from './types';
|
|
4
4
|
export { HTTP_METHODS, ROUTE_METADATA_KEYS, ROUTER_CONTEXT_KEYS, SECURITY_SCHEMES } from './constants';
|
|
5
5
|
export { RouterContext } from './router-context';
|
|
6
|
-
export {
|
|
7
|
-
export {
|
|
6
|
+
export { HonoApp } from './hono-app';
|
|
7
|
+
export { RouteRegistrationService } from './services';
|
|
8
8
|
export { ROUTER_TOKENS } from './router.tokens';
|
|
9
9
|
export { Controller, getControllerOptions, getControllerRoute } from './decorators/controller.decorator';
|
|
10
10
|
export { getDecoratedMethods, getRouteConfig, Route } from './decorators/route.decorator';
|
|
11
11
|
export * from './schemas';
|
|
12
|
-
export { ControllerRegistrationError, OpenAPIRouteRegistrationError, OpenAPIValidationError, RouteNotFoundError } from './errors';
|
|
12
|
+
export { ControllerRegistrationError, HonoAppAlreadyConfiguredError, OpenAPIRouteRegistrationError, OpenAPIValidationError, RouteNotFoundError } from './errors';
|
|
13
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAIA,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAGxH,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAGtG,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAGhD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAGpC,OAAO,EACL,wBAAwB,EACzB,MAAM,YAAY,CAAA;AAGnB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAG/C,OAAO,EACL,UAAU,EAAE,oBAAoB,EAAE,kBAAkB,EACrD,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAA;AAGzF,cAAc,WAAW,CAAA;AAGzB,OAAO,EACL,2BAA2B,EAAE,6BAA6B,EAAE,6BAA6B,EAAE,sBAAsB,EAAE,kBAAkB,EACtI,MAAM,UAAU,CAAA"}
|
package/dist/router/index.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
+
// eslint-disable-next-line @typescript-eslint/triple-slash-reference
|
|
2
|
+
/// <reference path="./hono-middleware-augment.d.ts" />
|
|
1
3
|
// Router constants
|
|
2
4
|
export { HTTP_METHODS, ROUTE_METADATA_KEYS, ROUTER_CONTEXT_KEYS, SECURITY_SCHEMES } from './constants';
|
|
3
5
|
// Router context
|
|
4
6
|
export { RouterContext } from './router-context';
|
|
5
|
-
//
|
|
6
|
-
export {
|
|
7
|
+
// HonoApp
|
|
8
|
+
export { HonoApp } from './hono-app';
|
|
7
9
|
// Router services
|
|
8
|
-
export {
|
|
10
|
+
export { RouteRegistrationService } from './services';
|
|
9
11
|
// Router tokens
|
|
10
12
|
export { ROUTER_TOKENS } from './router.tokens';
|
|
11
13
|
// Decorators
|
|
@@ -14,5 +16,5 @@ export { getDecoratedMethods, getRouteConfig, Route } from './decorators/route.d
|
|
|
14
16
|
// Schemas
|
|
15
17
|
export * from './schemas';
|
|
16
18
|
// Errors
|
|
17
|
-
export { ControllerRegistrationError, OpenAPIRouteRegistrationError, OpenAPIValidationError, RouteNotFoundError } from './errors';
|
|
19
|
+
export { ControllerRegistrationError, HonoAppAlreadyConfiguredError, OpenAPIRouteRegistrationError, OpenAPIValidationError, RouteNotFoundError } from './errors';
|
|
18
20
|
//# sourceMappingURL=index.js.map
|
package/dist/router/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,uDAAuD;AAOvD,mBAAmB;AACnB,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEtG,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD,UAAU;AACV,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEpC,kBAAkB;AAClB,OAAO,EACL,wBAAwB,EACzB,MAAM,YAAY,CAAA;AAEnB,gBAAgB;AAChB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,aAAa;AACb,OAAO,EACL,UAAU,EAAE,oBAAoB,EAAE,kBAAkB,EACrD,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAA;AAEzF,UAAU;AACV,cAAc,WAAW,CAAA;AAEzB,SAAS;AACT,OAAO,EACL,2BAA2B,EAAE,6BAA6B,EAAE,6BAA6B,EAAE,sBAAsB,EAAE,kBAAkB,EACtI,MAAM,UAAU,CAAA"}
|
|
@@ -1,35 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Dependency injection tokens for the router system
|
|
3
|
-
*
|
|
4
|
-
* Controllers and middlewares are exposed via module methods (getControllers() and getMiddlewares())
|
|
5
|
-
* rather than DI tokens. The Application collects them by iterating through modules.
|
|
6
|
-
*
|
|
7
|
-
* ## Service Instantiation Pattern
|
|
8
|
-
*
|
|
9
|
-
* Router services (RouteRegistrationService, OpenAPIService) are manually instantiated in RouterService
|
|
10
|
-
* rather than resolved from the DI container. This is intentional and provides several benefits:
|
|
11
|
-
*
|
|
12
|
-
* 1. **Lifecycle Control**: Services are created once during router initialization and reused across
|
|
13
|
-
* all requests, ensuring singleton behavior without relying on DI container scope management.
|
|
14
|
-
*
|
|
15
|
-
* 2. **Performance**: Avoiding container resolution on each request reduces overhead. These services
|
|
16
|
-
* don't need request-scoped data and can safely be singletons.
|
|
17
|
-
*
|
|
18
|
-
* 3. **Dependency Injection Still Works**: Constructor injection still works perfectly - the container
|
|
19
|
-
* resolves dependencies (like Logger) when we call `new RouteRegistrationService()`. We're only
|
|
20
|
-
* bypassing the container for the top-level service itself.
|
|
21
|
-
*
|
|
22
|
-
* 4. **Clarity**: Makes it explicit that these are singleton services that manage router configuration,
|
|
23
|
-
* not request-scoped services that handle individual requests.
|
|
24
|
-
*
|
|
25
|
-
* This pattern is safe and recommended for stateless utility services that don't need request context.
|
|
26
|
-
* Request-scoped services (like controllers) are still resolved from the container on each request.
|
|
27
3
|
*/
|
|
28
4
|
export declare const ROUTER_TOKENS: {
|
|
29
|
-
/**
|
|
30
|
-
* Token for RouterService singleton
|
|
31
|
-
*/
|
|
32
|
-
readonly RouterService: symbol;
|
|
33
5
|
/**
|
|
34
6
|
* Token for RouterContext (request-scoped)
|
|
35
7
|
* Contains Hono context wrapper with helper methods
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.tokens.d.ts","sourceRoot":"","sources":["../../src/router/router.tokens.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"router.tokens.d.ts","sourceRoot":"","sources":["../../src/router/router.tokens.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,aAAa;IACxB;;;OAGG;;CAEK,CAAA"}
|
|
@@ -1,35 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Dependency injection tokens for the router system
|
|
3
|
-
*
|
|
4
|
-
* Controllers and middlewares are exposed via module methods (getControllers() and getMiddlewares())
|
|
5
|
-
* rather than DI tokens. The Application collects them by iterating through modules.
|
|
6
|
-
*
|
|
7
|
-
* ## Service Instantiation Pattern
|
|
8
|
-
*
|
|
9
|
-
* Router services (RouteRegistrationService, OpenAPIService) are manually instantiated in RouterService
|
|
10
|
-
* rather than resolved from the DI container. This is intentional and provides several benefits:
|
|
11
|
-
*
|
|
12
|
-
* 1. **Lifecycle Control**: Services are created once during router initialization and reused across
|
|
13
|
-
* all requests, ensuring singleton behavior without relying on DI container scope management.
|
|
14
|
-
*
|
|
15
|
-
* 2. **Performance**: Avoiding container resolution on each request reduces overhead. These services
|
|
16
|
-
* don't need request-scoped data and can safely be singletons.
|
|
17
|
-
*
|
|
18
|
-
* 3. **Dependency Injection Still Works**: Constructor injection still works perfectly - the container
|
|
19
|
-
* resolves dependencies (like Logger) when we call `new RouteRegistrationService()`. We're only
|
|
20
|
-
* bypassing the container for the top-level service itself.
|
|
21
|
-
*
|
|
22
|
-
* 4. **Clarity**: Makes it explicit that these are singleton services that manage router configuration,
|
|
23
|
-
* not request-scoped services that handle individual requests.
|
|
24
|
-
*
|
|
25
|
-
* This pattern is safe and recommended for stateless utility services that don't need request context.
|
|
26
|
-
* Request-scoped services (like controllers) are still resolved from the container on each request.
|
|
27
3
|
*/
|
|
28
4
|
export const ROUTER_TOKENS = {
|
|
29
|
-
/**
|
|
30
|
-
* Token for RouterService singleton
|
|
31
|
-
*/
|
|
32
|
-
RouterService: Symbol.for('RouterService'),
|
|
33
5
|
/**
|
|
34
6
|
* Token for RouterContext (request-scoped)
|
|
35
7
|
* Contains Hono context wrapper with helper methods
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.tokens.js","sourceRoot":"","sources":["../../src/router/router.tokens.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"router.tokens.js","sourceRoot":"","sources":["../../src/router/router.tokens.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC;CAClC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/router/services/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/router/services/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/router/services/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/router/services/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAA"}
|
package/dist/stratal.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import 'reflect-metadata';
|
|
2
|
-
import {
|
|
2
|
+
import { type ApplicationConfig } from './application';
|
|
3
3
|
import type { StratalEnv } from './env';
|
|
4
|
+
import type { HonoApp } from './router/hono-app';
|
|
4
5
|
/**
|
|
5
6
|
* Stratal — Hono-style entry point for Cloudflare Workers.
|
|
6
7
|
*
|
|
7
|
-
*
|
|
8
|
-
* for
|
|
9
|
-
* initialization from simultaneous requests.
|
|
8
|
+
* Eagerly bootstraps the Application at construction time, dynamically
|
|
9
|
+
* importing `cloudflare:workers` for env and waitUntil.
|
|
10
10
|
*
|
|
11
11
|
* @example
|
|
12
12
|
* ```typescript
|
|
@@ -17,32 +17,15 @@ import type { StratalEnv } from './env';
|
|
|
17
17
|
* ```
|
|
18
18
|
*/
|
|
19
19
|
export declare class Stratal<Env extends StratalEnv = StratalEnv> {
|
|
20
|
-
private readonly config;
|
|
21
20
|
private app;
|
|
22
21
|
private initPromise;
|
|
23
22
|
constructor(config: ApplicationConfig);
|
|
24
|
-
/**
|
|
25
|
-
* Handle HTTP requests via RouterService.
|
|
26
|
-
*/
|
|
27
23
|
fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response>;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
queue(batch: MessageBatch, env: Env, ctx: ExecutionContext): Promise<void>;
|
|
32
|
-
/**
|
|
33
|
-
* Handle scheduled cron triggers.
|
|
34
|
-
*/
|
|
35
|
-
scheduled(controller: ScheduledController, env: Env, ctx: ExecutionContext): Promise<void>;
|
|
36
|
-
/**
|
|
37
|
-
* Get or lazily initialize the Application singleton.
|
|
38
|
-
* The first call's `env`/`ctx` are used for initialization;
|
|
39
|
-
* subsequent calls return the cached instance.
|
|
40
|
-
*/
|
|
41
|
-
getApplication(env: Env, ctx: ExecutionContext): Promise<Application>;
|
|
42
|
-
/**
|
|
43
|
-
* Shut down the application and release all resources.
|
|
44
|
-
*/
|
|
24
|
+
queue(batch: MessageBatch): Promise<void>;
|
|
25
|
+
scheduled(controller: ScheduledController): Promise<void>;
|
|
26
|
+
get hono(): Promise<HonoApp>;
|
|
45
27
|
shutdown(): Promise<void>;
|
|
46
|
-
private
|
|
28
|
+
private ensureReady;
|
|
29
|
+
private prepareApp;
|
|
47
30
|
}
|
|
48
31
|
//# sourceMappingURL=stratal.d.ts.map
|
package/dist/stratal.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stratal.d.ts","sourceRoot":"","sources":["../src/stratal.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAA;AAEzB,OAAO,
|
|
1
|
+
{"version":3,"file":"stratal.d.ts","sourceRoot":"","sources":["../src/stratal.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAA;AAEzB,OAAO,EAAe,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAEhD;;;;;;;;;;;;;GAaG;AACH,qBAAa,OAAO,CAAC,GAAG,SAAS,UAAU,GAAG,UAAU;IACtD,OAAO,CAAC,GAAG,CAA2B;IACtC,OAAO,CAAC,WAAW,CAAsB;gBAE7B,MAAM,EAAE,iBAAiB;IAQ/B,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK3E,KAAK,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzC,SAAS,CAAC,UAAU,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/D,IAAI,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAE3B;IAEK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAQjB,WAAW;YAKX,UAAU;CAMzB"}
|