stratal 0.0.5 → 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/README.md +2 -7
- package/dist/application.d.ts +16 -44
- package/dist/application.d.ts.map +1 -1
- package/dist/application.js +38 -79
- 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 +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -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 +31 -0
- package/dist/stratal.d.ts.map +1 -0
- package/dist/stratal.js +62 -0
- package/dist/stratal.js.map +1 -0
- package/package.json +12 -12
- package/CHANGELOG.md +0 -121
- 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/worker/index.d.ts +0 -2
- package/dist/worker/index.d.ts.map +0 -1
- package/dist/worker/index.js +0 -2
- package/dist/worker/index.js.map +0 -1
- package/dist/worker/stratal-worker.d.ts +0 -49
- package/dist/worker/stratal-worker.d.ts.map +0 -1
- package/dist/worker/stratal-worker.js +0 -89
- package/dist/worker/stratal-worker.js.map +0 -1
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
};
|
|
7
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
-
};
|
|
10
|
-
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
-
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
-
};
|
|
13
|
-
import { cors } from 'hono/cors';
|
|
14
|
-
import { inject } from 'tsyringe';
|
|
15
|
-
import { CONTAINER_TOKEN } from '../di';
|
|
16
|
-
import { Transient } from '../di/decorators';
|
|
17
|
-
import { DI_TOKENS } from '../di/tokens';
|
|
18
|
-
import { getHttpStatus } from '../errors';
|
|
19
|
-
import { OpenAPIHono } from '../i18n/validation';
|
|
20
|
-
import { LOGGER_TOKENS } from '../logger';
|
|
21
|
-
import { MiddlewareConfigurationService, } from '../middleware';
|
|
22
|
-
import { OPENAPI_TOKENS } from '../openapi';
|
|
23
|
-
import { ROUTER_CONTEXT_KEYS } from './constants';
|
|
24
|
-
import { RouteNotFoundError, RouterAlreadyConfiguredError, RouterNotConfiguredError } from './errors';
|
|
25
|
-
import { SchemaValidationError } from './errors/schema-validation.error';
|
|
26
|
-
import { createLoggerMiddleware } from './middleware';
|
|
27
|
-
import { ROUTER_TOKENS } from './router.tokens';
|
|
28
|
-
import { RequestScopeService } from './services/request-scope.service';
|
|
29
|
-
import { RouteRegistrationService } from './services/route-registration.service';
|
|
30
|
-
/**
|
|
31
|
-
* RouterService manages HTTP routing and request handling with OpenAPI support
|
|
32
|
-
*
|
|
33
|
-
* Responsibilities:
|
|
34
|
-
* - Creates and configures OpenAPIHono application
|
|
35
|
-
* - Delegates to specialized services:
|
|
36
|
-
* - RequestScopeService: Request-scoped container setup
|
|
37
|
-
* - OpenAPIService: OpenAPI spec and documentation endpoints
|
|
38
|
-
* - RouteRegistrationService: Controller and route registration
|
|
39
|
-
* - Registers global middleware (CORS, logging, error handling)
|
|
40
|
-
* - Handles fetch requests via Hono
|
|
41
|
-
*
|
|
42
|
-
* Note: Route access control (domain-based enforcement) is handled by
|
|
43
|
-
* RouteAccessMiddleware in the tenancy module, applied via TenancyModule.configure().
|
|
44
|
-
*
|
|
45
|
-
* The service is registered as a singleton in the DI container
|
|
46
|
-
* and accessed by the Backend worker's fetch() method.
|
|
47
|
-
*/
|
|
48
|
-
let RouterService = class RouterService {
|
|
49
|
-
logger;
|
|
50
|
-
container;
|
|
51
|
-
app;
|
|
52
|
-
configured = false;
|
|
53
|
-
constructor(logger, container) {
|
|
54
|
-
this.logger = logger;
|
|
55
|
-
this.container = container;
|
|
56
|
-
this.app = new OpenAPIHono({
|
|
57
|
-
defaultHook: (result, c) => {
|
|
58
|
-
if (!result.success) {
|
|
59
|
-
// Get request container (created by RequestScopeService)
|
|
60
|
-
const requestContainer = c.get(ROUTER_CONTEXT_KEYS.REQUEST_CONTAINER);
|
|
61
|
-
// Resolve GlobalErrorHandler from request container for i18n support
|
|
62
|
-
const errorHandler = requestContainer.resolve(DI_TOKENS.ErrorHandler);
|
|
63
|
-
// Convert ZodError to SchemaValidationError
|
|
64
|
-
const validationError = new SchemaValidationError(result.error);
|
|
65
|
-
// Process through global error handler for consistent formatting
|
|
66
|
-
const errorResponse = errorHandler.handle(validationError);
|
|
67
|
-
// Get HTTP status code from error code
|
|
68
|
-
const status = getHttpStatus(errorResponse.code);
|
|
69
|
-
return c.json(errorResponse, status);
|
|
70
|
-
}
|
|
71
|
-
// Validation succeeded, continue to handler
|
|
72
|
-
return;
|
|
73
|
-
},
|
|
74
|
-
});
|
|
75
|
-
this.setupMiddleware();
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Setup all middleware in correct order
|
|
79
|
-
* Note: OpenAPI setup is deferred to configure() because it needs controllers
|
|
80
|
-
*/
|
|
81
|
-
setupMiddleware() {
|
|
82
|
-
// 1. Request-scoped container setup (MUST be FIRST)
|
|
83
|
-
const requestScopeService = new RequestScopeService(this.container);
|
|
84
|
-
requestScopeService.setupMiddleware(this.app);
|
|
85
|
-
// 2. Global middleware (CORS, logging, error handling)
|
|
86
|
-
this.setupGlobalMiddleware();
|
|
87
|
-
// 3. OpenAPI documentation endpoints - deferred to configure()
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Setup global middleware that runs for all requests
|
|
91
|
-
*/
|
|
92
|
-
setupGlobalMiddleware() {
|
|
93
|
-
// CORS middleware
|
|
94
|
-
this.app.use('*', cors());
|
|
95
|
-
// Request logger middleware (uses our Logger service)
|
|
96
|
-
this.app.use('*', createLoggerMiddleware(this.logger));
|
|
97
|
-
// Global error handler
|
|
98
|
-
this.app.onError((err, c) => {
|
|
99
|
-
// Resolve GlobalErrorHandler from request container (has I18nService for translation)
|
|
100
|
-
const requestContainer = c.get(ROUTER_CONTEXT_KEYS.REQUEST_CONTAINER);
|
|
101
|
-
const errorHandler = requestContainer.resolve(DI_TOKENS.ErrorHandler);
|
|
102
|
-
// Handle all errors via GlobalErrorHandler
|
|
103
|
-
const errorResponse = errorHandler.handle(err);
|
|
104
|
-
const status = getHttpStatus(errorResponse.code);
|
|
105
|
-
return c.json(errorResponse, status);
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Configure router with middlewares and controllers atomically
|
|
110
|
-
* This MUST be called immediately after RouterService construction
|
|
111
|
-
* and can only be called once.
|
|
112
|
-
*
|
|
113
|
-
* @param middlewareConfigs - Array of middleware configuration entries from modules
|
|
114
|
-
* @param controllers - Array of controller classes from modules
|
|
115
|
-
*/
|
|
116
|
-
configure(middlewareConfigs, controllers) {
|
|
117
|
-
if (this.configured) {
|
|
118
|
-
throw new RouterAlreadyConfiguredError();
|
|
119
|
-
}
|
|
120
|
-
this.logger.info('Configuring router', {
|
|
121
|
-
middlewareConfigCount: middlewareConfigs.length,
|
|
122
|
-
controllerCount: controllers.length,
|
|
123
|
-
});
|
|
124
|
-
// 3. Apply middleware configurations FIRST (includes LocaleExtractionMiddleware, RouteAccessMiddleware)
|
|
125
|
-
// Middleware must run before OpenAPI endpoints so locale and route context are available
|
|
126
|
-
const middlewareConfigService = new MiddlewareConfigurationService(this.logger);
|
|
127
|
-
middlewareConfigService.applyMiddlewares(this.app, middlewareConfigs, controllers, this.container);
|
|
128
|
-
// 4. OpenAPI documentation endpoints (needs middleware to run first for i18n and route filtering)
|
|
129
|
-
const openAPIService = this.container.resolve(OPENAPI_TOKENS.OpenAPIService);
|
|
130
|
-
openAPIService.setupEndpoints(this.app, controllers);
|
|
131
|
-
// 5. Register controllers and routes
|
|
132
|
-
const routeRegistrationService = new RouteRegistrationService(this.logger);
|
|
133
|
-
routeRegistrationService.configure(this.app, controllers);
|
|
134
|
-
// 6. Register 404 handler last
|
|
135
|
-
this.app.notFound((c) => {
|
|
136
|
-
throw new RouteNotFoundError(c.req.path, c.req.method);
|
|
137
|
-
});
|
|
138
|
-
this.configured = true;
|
|
139
|
-
this.logger.info('Router configuration complete');
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Handle incoming fetch request via Hono
|
|
143
|
-
*
|
|
144
|
-
* This method is called by the Backend worker's fetch() method.
|
|
145
|
-
* The request-scoped container is created in RequestScopeService.
|
|
146
|
-
*
|
|
147
|
-
* @param request - Incoming Request object
|
|
148
|
-
* @param env - Cloudflare environment bindings
|
|
149
|
-
* @param ctx - Cloudflare execution context
|
|
150
|
-
* @returns Response object
|
|
151
|
-
*/
|
|
152
|
-
fetch(request, env, ctx) {
|
|
153
|
-
if (!this.configured) {
|
|
154
|
-
throw new RouterNotConfiguredError();
|
|
155
|
-
}
|
|
156
|
-
return this.app.fetch(request, env, ctx);
|
|
157
|
-
}
|
|
158
|
-
};
|
|
159
|
-
RouterService = __decorate([
|
|
160
|
-
Transient(ROUTER_TOKENS.RouterService),
|
|
161
|
-
__param(0, inject(LOGGER_TOKENS.LoggerService)),
|
|
162
|
-
__param(1, inject(CONTAINER_TOKEN)),
|
|
163
|
-
__metadata("design:paramtypes", [Function, Function])
|
|
164
|
-
], RouterService);
|
|
165
|
-
export { RouterService };
|
|
166
|
-
//# sourceMappingURL=router.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"router.service.js","sourceRoot":"","sources":["../../src/router/router.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,eAAe,EAAkB,MAAM,OAAO,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC,OAAO,EAAsB,aAAa,EAAE,MAAM,WAAW,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAsB,MAAM,WAAW,CAAA;AAC7D,OAAO,EACL,8BAA8B,GAE/B,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,cAAc,EAAuB,MAAM,YAAY,CAAA;AAEhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD,OAAO,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AACrG,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAA;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAA;AAGhF;;;;;;;;;;;;;;;;;GAiBG;AAEI,IAAM,aAAa,GAAnB,MAAM,aAAa;IAMd;IAEA;IAPF,GAAG,CAAwB;IAC3B,UAAU,GAAG,KAAK,CAAA;IAE1B,YAEU,MAAqB,EAErB,SAAoB;QAFpB,WAAM,GAAN,MAAM,CAAe;QAErB,cAAS,GAAT,SAAS,CAAW;QAE5B,IAAI,CAAC,GAAG,GAAG,IAAI,WAAW,CAAY;YACpC,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACzB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpB,yDAAyD;oBACzD,MAAM,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAA;oBAErE,qEAAqE;oBACrE,MAAM,YAAY,GAAG,gBAAgB,CAAC,OAAO,CAAqB,SAAS,CAAC,YAAY,CAAC,CAAA;oBAEzF,4CAA4C;oBAC5C,MAAM,eAAe,GAAG,IAAI,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;oBAE/D,iEAAiE;oBACjE,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;oBAE1D,uCAAuC;oBACvC,MAAM,MAAM,GAAG,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;oBAEhD,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;gBACtC,CAAC;gBACD,4CAA4C;gBAC5C,OAAM;YACR,CAAC;SACF,CAAC,CAAA;QAEF,IAAI,CAAC,eAAe,EAAE,CAAA;IACxB,CAAC;IAED;;;OAGG;IACK,eAAe;QACrB,oDAAoD;QACpD,MAAM,mBAAmB,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACnE,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAE7C,uDAAuD;QACvD,IAAI,CAAC,qBAAqB,EAAE,CAAA;QAE5B,+DAA+D;IACjE,CAAC;IAED;;OAEG;IACK,qBAAqB;QAC3B,kBAAkB;QAClB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAA;QAEzB,sDAAsD;QACtD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QAEtD,uBAAuB;QACvB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAC1B,sFAAsF;YACtF,MAAM,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAA;YACrE,MAAM,YAAY,GAAG,gBAAgB,CAAC,OAAO,CAAqB,SAAS,CAAC,YAAY,CAAC,CAAA;YAEzF,2CAA2C;YAC3C,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC9C,MAAM,MAAM,GAAG,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;YAChD,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;QACtC,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,SAAS,CAAC,iBAA0C,EAAE,WAAuC;QAC3F,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,4BAA4B,EAAE,CAAA;QAC1C,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;YACrC,qBAAqB,EAAE,iBAAiB,CAAC,MAAM;YAC/C,eAAe,EAAE,WAAW,CAAC,MAAM;SACpC,CAAC,CAAA;QAEF,wGAAwG;QACxG,yFAAyF;QACzF,MAAM,uBAAuB,GAAG,IAAI,8BAA8B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC/E,uBAAuB,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,EAAE,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QAElG,kGAAkG;QAClG,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAiB,cAAc,CAAC,cAAc,CAAC,CAAA;QAC5F,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;QAEpD,qCAAqC;QACrC,MAAM,wBAAwB,GAAG,IAAI,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC1E,wBAAwB,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;QAEzD,+BAA+B;QAC/B,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE;YACtB,MAAM,IAAI,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACxD,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;IACnD,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,OAAgB,EAAE,GAAe,EAAE,GAAqB;QAC5D,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,wBAAwB,EAAE,CAAA;QACtC,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IAC1C,CAAC;CACF,CAAA;AArIY,aAAa;IADzB,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC;IAMlC,WAAA,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAA;IAEnC,WAAA,MAAM,CAAC,eAAe,CAAC,CAAA;;GAPf,aAAa,CAqIzB"}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import type { OpenAPIHono } from '../../i18n/validation';
|
|
2
|
-
import { Container } from '../../di';
|
|
3
|
-
import type { RouterEnv } from '../types';
|
|
4
|
-
/**
|
|
5
|
-
* Request Scope Service
|
|
6
|
-
*
|
|
7
|
-
* Manages request-scoped container setup and lifecycle.
|
|
8
|
-
* Creates context-enriched instances of `@RequestScoped` services.
|
|
9
|
-
*
|
|
10
|
-
* **Two-Tier Container Architecture:**
|
|
11
|
-
* ```
|
|
12
|
-
* Container (manages global container)
|
|
13
|
-
* ↓
|
|
14
|
-
* container.createRequestScope(routerContext)
|
|
15
|
-
* ↓
|
|
16
|
-
* Request Container (child, per request)
|
|
17
|
-
* ↓
|
|
18
|
-
* Context-enriched instances via withContext(routerContext)
|
|
19
|
-
* ```
|
|
20
|
-
*
|
|
21
|
-
* **Responsibilities:**
|
|
22
|
-
* - Setup request-scoped container middleware
|
|
23
|
-
* - Create context-enriched instances of `@RequestScoped` services
|
|
24
|
-
*
|
|
25
|
-
* **Note:**
|
|
26
|
-
* - AuthContext registration is handled by AuthModule's AuthContextMiddleware
|
|
27
|
-
* - Locale extraction is handled by I18nModule's LocaleExtractionMiddleware
|
|
28
|
-
* - Zod i18n context is handled by I18nModule's I18nContextMiddleware
|
|
29
|
-
* - Session verification is handled by AuthModule's SessionVerificationMiddleware
|
|
30
|
-
*/
|
|
31
|
-
export declare class RequestScopeService {
|
|
32
|
-
private readonly container;
|
|
33
|
-
constructor(container: Container);
|
|
34
|
-
/**
|
|
35
|
-
* Setup request-scoped container middleware
|
|
36
|
-
*
|
|
37
|
-
* This MUST run before all other middleware and routes.
|
|
38
|
-
* Creates a child container with context-enriched service instances.
|
|
39
|
-
*/
|
|
40
|
-
setupMiddleware(app: OpenAPIHono<RouterEnv>): void;
|
|
41
|
-
}
|
|
42
|
-
//# sourceMappingURL=request-scope.service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"request-scope.service.d.ts","sourceRoot":"","sources":["../../../src/router/services/request-scope.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAExD,OAAO,EAAE,SAAS,EAAmB,MAAM,UAAU,CAAA;AAIrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBACa,mBAAmB;IAG5B,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAGvC;;;;;OAKG;IACH,eAAe,CAAC,GAAG,EAAE,WAAW,CAAC,SAAS,CAAC,GAAG,IAAI;CAgBnD"}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
};
|
|
7
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
-
};
|
|
10
|
-
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
-
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
-
};
|
|
13
|
-
import { inject } from 'tsyringe';
|
|
14
|
-
import { Container, CONTAINER_TOKEN } from '../../di';
|
|
15
|
-
import { Transient } from '../../di/decorators';
|
|
16
|
-
import { ROUTER_CONTEXT_KEYS } from '../constants';
|
|
17
|
-
import { RouterContext } from '../router-context';
|
|
18
|
-
/**
|
|
19
|
-
* Request Scope Service
|
|
20
|
-
*
|
|
21
|
-
* Manages request-scoped container setup and lifecycle.
|
|
22
|
-
* Creates context-enriched instances of `@RequestScoped` services.
|
|
23
|
-
*
|
|
24
|
-
* **Two-Tier Container Architecture:**
|
|
25
|
-
* ```
|
|
26
|
-
* Container (manages global container)
|
|
27
|
-
* ↓
|
|
28
|
-
* container.createRequestScope(routerContext)
|
|
29
|
-
* ↓
|
|
30
|
-
* Request Container (child, per request)
|
|
31
|
-
* ↓
|
|
32
|
-
* Context-enriched instances via withContext(routerContext)
|
|
33
|
-
* ```
|
|
34
|
-
*
|
|
35
|
-
* **Responsibilities:**
|
|
36
|
-
* - Setup request-scoped container middleware
|
|
37
|
-
* - Create context-enriched instances of `@RequestScoped` services
|
|
38
|
-
*
|
|
39
|
-
* **Note:**
|
|
40
|
-
* - AuthContext registration is handled by AuthModule's AuthContextMiddleware
|
|
41
|
-
* - Locale extraction is handled by I18nModule's LocaleExtractionMiddleware
|
|
42
|
-
* - Zod i18n context is handled by I18nModule's I18nContextMiddleware
|
|
43
|
-
* - Session verification is handled by AuthModule's SessionVerificationMiddleware
|
|
44
|
-
*/
|
|
45
|
-
let RequestScopeService = class RequestScopeService {
|
|
46
|
-
container;
|
|
47
|
-
constructor(container) {
|
|
48
|
-
this.container = container;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Setup request-scoped container middleware
|
|
52
|
-
*
|
|
53
|
-
* This MUST run before all other middleware and routes.
|
|
54
|
-
* Creates a child container with context-enriched service instances.
|
|
55
|
-
*/
|
|
56
|
-
setupMiddleware(app) {
|
|
57
|
-
app.use('*', async (c, next) => {
|
|
58
|
-
// Create RouterContext
|
|
59
|
-
const routerContext = new RouterContext(c);
|
|
60
|
-
// Create request scope using Container
|
|
61
|
-
const requestContainer = this.container.createRequestScope(routerContext);
|
|
62
|
-
// Store in Hono context
|
|
63
|
-
c.set(ROUTER_CONTEXT_KEYS.REQUEST_CONTAINER, requestContainer);
|
|
64
|
-
// Run request within AsyncLocalStorage context
|
|
65
|
-
// Cleanup is automatic in runWithContextStore
|
|
66
|
-
await requestContainer.runWithContextStore(() => next());
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
RequestScopeService = __decorate([
|
|
71
|
-
Transient(),
|
|
72
|
-
__param(0, inject(CONTAINER_TOKEN)),
|
|
73
|
-
__metadata("design:paramtypes", [Container])
|
|
74
|
-
], RequestScopeService);
|
|
75
|
-
export { RequestScopeService };
|
|
76
|
-
//# sourceMappingURL=request-scope.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"request-scope.service.js","sourceRoot":"","sources":["../../../src/router/services/request-scope.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAGjD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAGX;IAFnB,YAEmB,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;IACpC,CAAC;IAEJ;;;;;OAKG;IACH,eAAe,CAAC,GAA2B;QACzC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;YAC7B,uBAAuB;YACvB,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,CAAuB,CAAC,CAAA;YAEhE,uCAAuC;YACvC,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAA;YAEzE,wBAAwB;YACxB,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAA;YAE9D,+CAA+C;YAC/C,8CAA8C;YAC9C,MAAM,gBAAgB,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;QAC1D,CAAC,CAAC,CAAA;IACJ,CAAC;CACF,CAAA;AA5BY,mBAAmB;IAD/B,SAAS,EAAE;IAGP,WAAA,MAAM,CAAC,eAAe,CAAC,CAAA;qCACI,SAAS;GAH5B,mBAAmB,CA4B/B"}
|
package/dist/worker/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/worker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA"}
|
package/dist/worker/index.js
DELETED
package/dist/worker/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/worker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import 'reflect-metadata';
|
|
2
|
-
import { WorkerEntrypoint } from 'cloudflare:workers';
|
|
3
|
-
import { Application, type ApplicationConfig } from '../application';
|
|
4
|
-
import type { StratalEnv } from '../env';
|
|
5
|
-
/**
|
|
6
|
-
* Base class for Cloudflare Workers using the modules framework.
|
|
7
|
-
* Handles Application singleton management and provides default handlers.
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* ```typescript
|
|
11
|
-
* export default class Backend extends StratalWorker<Cloudflare.Env> {
|
|
12
|
-
* protected configure() {
|
|
13
|
-
* return {
|
|
14
|
-
* module: AppModule,
|
|
15
|
-
* logging: { level: LogLevel.INFO },
|
|
16
|
-
* }
|
|
17
|
-
* }
|
|
18
|
-
* }
|
|
19
|
-
* ```
|
|
20
|
-
*/
|
|
21
|
-
export declare abstract class StratalWorker<Env extends StratalEnv = StratalEnv> extends WorkerEntrypoint<Env> {
|
|
22
|
-
/**
|
|
23
|
-
* Configure the Application.
|
|
24
|
-
* Access `this.env` and `this.ctx` for environment-dependent config.
|
|
25
|
-
*/
|
|
26
|
-
protected abstract configure(): ApplicationConfig;
|
|
27
|
-
/**
|
|
28
|
-
* Get or initialize the Application singleton.
|
|
29
|
-
* Handles concurrent initialization guards automatically.
|
|
30
|
-
*/
|
|
31
|
-
protected getApp(): Promise<Application>;
|
|
32
|
-
private initializeApp;
|
|
33
|
-
/**
|
|
34
|
-
* Handle HTTP requests via RouterService.
|
|
35
|
-
* Override for custom request handling.
|
|
36
|
-
*/
|
|
37
|
-
fetch(request: Request): Promise<Response>;
|
|
38
|
-
/**
|
|
39
|
-
* Handle queue batches.
|
|
40
|
-
* Override for custom queue handling.
|
|
41
|
-
*/
|
|
42
|
-
queue(batch: MessageBatch): Promise<void>;
|
|
43
|
-
/**
|
|
44
|
-
* Handle scheduled cron triggers.
|
|
45
|
-
* Override for custom scheduled handling.
|
|
46
|
-
*/
|
|
47
|
-
scheduled(controller: ScheduledController): Promise<void>;
|
|
48
|
-
}
|
|
49
|
-
//# sourceMappingURL=stratal-worker.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stratal-worker.d.ts","sourceRoot":"","sources":["../../src/worker/stratal-worker.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAA;AAEzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAaxC;;;;;;;;;;;;;;;GAeG;AACH,8BAAsB,aAAa,CAClC,GAAG,SAAS,UAAU,GAAG,UAAU,CAClC,SAAQ,gBAAgB,CAAC,GAAG,CAAC;IAC9B;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,SAAS,IAAI,iBAAiB;IAEjD;;;OAGG;cACa,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC;YA8BhC,aAAa;IAO3B;;;OAGG;IACG,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAMhD;;;OAGG;IACG,KAAK,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/C;;;OAGG;IACG,SAAS,CAAC,UAAU,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;CAI/D"}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import 'reflect-metadata';
|
|
2
|
-
import { WorkerEntrypoint } from 'cloudflare:workers';
|
|
3
|
-
import { Application } from '../application';
|
|
4
|
-
import { ROUTER_TOKENS } from '../router';
|
|
5
|
-
/**
|
|
6
|
-
* Per-class singleton registry
|
|
7
|
-
* Key: Worker class constructor
|
|
8
|
-
* Value: { app, promise } for singleton + concurrent init guard
|
|
9
|
-
*/
|
|
10
|
-
const registry = new Map();
|
|
11
|
-
/**
|
|
12
|
-
* Base class for Cloudflare Workers using the modules framework.
|
|
13
|
-
* Handles Application singleton management and provides default handlers.
|
|
14
|
-
*
|
|
15
|
-
* @example
|
|
16
|
-
* ```typescript
|
|
17
|
-
* export default class Backend extends StratalWorker<Cloudflare.Env> {
|
|
18
|
-
* protected configure() {
|
|
19
|
-
* return {
|
|
20
|
-
* module: AppModule,
|
|
21
|
-
* logging: { level: LogLevel.INFO },
|
|
22
|
-
* }
|
|
23
|
-
* }
|
|
24
|
-
* }
|
|
25
|
-
* ```
|
|
26
|
-
*/
|
|
27
|
-
export class StratalWorker extends WorkerEntrypoint {
|
|
28
|
-
/**
|
|
29
|
-
* Get or initialize the Application singleton.
|
|
30
|
-
* Handles concurrent initialization guards automatically.
|
|
31
|
-
*/
|
|
32
|
-
async getApp() {
|
|
33
|
-
const key = this.constructor;
|
|
34
|
-
let state = registry.get(key);
|
|
35
|
-
if (!state) {
|
|
36
|
-
state = { app: null, promise: null };
|
|
37
|
-
registry.set(key, state);
|
|
38
|
-
}
|
|
39
|
-
// Fast path: already initialized
|
|
40
|
-
if (state.app) {
|
|
41
|
-
return state.app;
|
|
42
|
-
}
|
|
43
|
-
// Concurrent initialization guard
|
|
44
|
-
if (state.promise) {
|
|
45
|
-
return state.promise;
|
|
46
|
-
}
|
|
47
|
-
// Start initialization
|
|
48
|
-
state.promise = this.initializeApp();
|
|
49
|
-
try {
|
|
50
|
-
state.app = await state.promise;
|
|
51
|
-
return state.app;
|
|
52
|
-
}
|
|
53
|
-
finally {
|
|
54
|
-
state.promise = null;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
async initializeApp() {
|
|
58
|
-
const config = this.configure();
|
|
59
|
-
const app = new Application(this.env, this.ctx, config);
|
|
60
|
-
await app.initialize();
|
|
61
|
-
return app;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Handle HTTP requests via RouterService.
|
|
65
|
-
* Override for custom request handling.
|
|
66
|
-
*/
|
|
67
|
-
async fetch(request) {
|
|
68
|
-
const app = await this.getApp();
|
|
69
|
-
const router = app.resolve(ROUTER_TOKENS.RouterService);
|
|
70
|
-
return router.fetch(request, this.env, this.ctx);
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Handle queue batches.
|
|
74
|
-
* Override for custom queue handling.
|
|
75
|
-
*/
|
|
76
|
-
async queue(batch) {
|
|
77
|
-
const app = await this.getApp();
|
|
78
|
-
return app.handleQueue(batch, batch.queue);
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Handle scheduled cron triggers.
|
|
82
|
-
* Override for custom scheduled handling.
|
|
83
|
-
*/
|
|
84
|
-
async scheduled(controller) {
|
|
85
|
-
const app = await this.getApp();
|
|
86
|
-
return app.handleScheduled(controller);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
//# sourceMappingURL=stratal-worker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stratal-worker.js","sourceRoot":"","sources":["../../src/worker/stratal-worker.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAA;AAEzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,WAAW,EAA0B,MAAM,gBAAgB,CAAA;AAEpE,OAAO,EAAE,aAAa,EAAsB,MAAM,WAAW,CAAA;AAE7D;;;;GAIG;AACH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAGrB,CAAA;AAEH;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAgB,aAEpB,SAAQ,gBAAqB;IAO9B;;;OAGG;IACO,KAAK,CAAC,MAAM;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAA;QAC5B,IAAI,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAE7B,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,KAAK,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;YACpC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACzB,CAAC;QAED,iCAAiC;QACjC,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;YACf,OAAO,KAAK,CAAC,GAAG,CAAA;QACjB,CAAC;QAED,kCAAkC;QAClC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC,OAAO,CAAA;QACrB,CAAC;QAED,uBAAuB;QACvB,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAA;QAEpC,IAAI,CAAC;YACJ,KAAK,CAAC,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,CAAA;YAC/B,OAAO,KAAK,CAAC,GAAG,CAAA;QACjB,CAAC;gBAAS,CAAC;YACV,KAAK,CAAC,OAAO,GAAG,IAAI,CAAA;QACrB,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,aAAa;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;QAC/B,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QACvD,MAAM,GAAG,CAAC,UAAU,EAAE,CAAA;QACtB,OAAO,GAAG,CAAA;IACX,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK,CAAC,OAAgB;QAC3B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;QAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAgB,aAAa,CAAC,aAAa,CAAC,CAAA;QACtE,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;IACjD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK,CAAC,KAAmB;QAC9B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;QAC/B,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;IAC3C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CAAC,UAA+B;QAC9C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;QAC/B,OAAO,GAAG,CAAC,eAAe,CAAC,UAAU,CAAC,CAAA;IACvC,CAAC;CACD"}
|