@ooneex/app 1.3.8 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/index.js +49 -30
- package/dist/index.js.map +5 -5
- package/package.json +16 -16
package/README.md
CHANGED
|
@@ -101,7 +101,7 @@ OPENAI_API_KEY=your_openai_key
|
|
|
101
101
|
ANTHROPIC_API_KEY=your_anthropic_key
|
|
102
102
|
CACHE_REDIS_URL=redis://localhost:6379
|
|
103
103
|
DATABASE_URL=postgresql://user:pass@localhost:5432/db
|
|
104
|
-
|
|
104
|
+
ANALYTICS_POSTHOG_PROJECT_TOKEN=your_posthog_key
|
|
105
105
|
```
|
|
106
106
|
|
|
107
107
|
### Creating a Module
|
|
@@ -114,7 +114,10 @@ import type { ModuleType } from '@ooneex/module';
|
|
|
114
114
|
|
|
115
115
|
export const UserModule: ModuleType = {
|
|
116
116
|
controllers: [UserController],
|
|
117
|
-
entities: [UserEntity]
|
|
117
|
+
entities: [UserEntity],
|
|
118
|
+
middlewares: [],
|
|
119
|
+
cronJobs: [],
|
|
120
|
+
events: [],
|
|
118
121
|
};
|
|
119
122
|
```
|
|
120
123
|
|
package/dist/index.js
CHANGED
|
@@ -45,7 +45,8 @@ var checkAllowedUsers = (context) => {
|
|
|
45
45
|
if (allowedUsers && allowedUsers.length > 0 && !allowedUsers.includes(context.user.email)) {
|
|
46
46
|
return {
|
|
47
47
|
message: `User "${context.user.email}" is not allowed in "${context.env.APP_ENV}" environment`,
|
|
48
|
-
status: HttpStatus.Code.Forbidden
|
|
48
|
+
status: HttpStatus.Code.Forbidden,
|
|
49
|
+
key: "USER_NOT_ALLOWED"
|
|
49
50
|
};
|
|
50
51
|
}
|
|
51
52
|
return null;
|
|
@@ -128,7 +129,7 @@ var buildHttpContext = async (ctx) => {
|
|
|
128
129
|
files: request.files,
|
|
129
130
|
ip: request.ip,
|
|
130
131
|
host: request.host,
|
|
131
|
-
|
|
132
|
+
lang: request.lang,
|
|
132
133
|
user: null
|
|
133
134
|
};
|
|
134
135
|
return context;
|
|
@@ -140,7 +141,8 @@ var validateRouteAccess = async (context, route, currentEnv) => {
|
|
|
140
141
|
if (error) {
|
|
141
142
|
return {
|
|
142
143
|
message: `Invalid parameter "${paramName}": ${error}`,
|
|
143
|
-
status: HttpStatus.Code.BadRequest
|
|
144
|
+
status: HttpStatus.Code.BadRequest,
|
|
145
|
+
key: "INVALID_PARAMETER"
|
|
144
146
|
};
|
|
145
147
|
}
|
|
146
148
|
}
|
|
@@ -150,7 +152,8 @@ var validateRouteAccess = async (context, route, currentEnv) => {
|
|
|
150
152
|
if (error) {
|
|
151
153
|
return {
|
|
152
154
|
message: `Invalid query parameters: ${error}`,
|
|
153
|
-
status: HttpStatus.Code.BadRequest
|
|
155
|
+
status: HttpStatus.Code.BadRequest,
|
|
156
|
+
key: "INVALID_QUERY"
|
|
154
157
|
};
|
|
155
158
|
}
|
|
156
159
|
}
|
|
@@ -159,33 +162,38 @@ var validateRouteAccess = async (context, route, currentEnv) => {
|
|
|
159
162
|
if (error) {
|
|
160
163
|
return {
|
|
161
164
|
message: `Invalid payload: ${error}`,
|
|
162
|
-
status: HttpStatus.Code.BadRequest
|
|
165
|
+
status: HttpStatus.Code.BadRequest,
|
|
166
|
+
key: "INVALID_PAYLOAD"
|
|
163
167
|
};
|
|
164
168
|
}
|
|
165
169
|
}
|
|
166
170
|
if (route.env && route.env.length > 0 && !route.env.includes(currentEnv)) {
|
|
167
171
|
return {
|
|
168
172
|
message: `Route "${route.name}" is not available in "${currentEnv}" environment`,
|
|
169
|
-
status: HttpStatus.Code.NotAcceptable
|
|
173
|
+
status: HttpStatus.Code.NotAcceptable,
|
|
174
|
+
key: "ROUTE_ENV_NOT_ALLOWED"
|
|
170
175
|
};
|
|
171
176
|
}
|
|
172
177
|
if (route.ip && route.ip.length > 0 && (!context.ip || !route.ip.includes(context.ip))) {
|
|
173
178
|
return {
|
|
174
179
|
message: `Route "${route.name}" is not available for IP "${context.ip}"`,
|
|
175
|
-
status: HttpStatus.Code.NotAcceptable
|
|
180
|
+
status: HttpStatus.Code.NotAcceptable,
|
|
181
|
+
key: "ROUTE_IP_NOT_ALLOWED"
|
|
176
182
|
};
|
|
177
183
|
}
|
|
178
184
|
if (route.host && route.host.length > 0 && !route.host.includes(context.host)) {
|
|
179
185
|
return {
|
|
180
186
|
message: `Route "${route.name}" is not available for host "${context.host}"`,
|
|
181
|
-
status: HttpStatus.Code.NotAcceptable
|
|
187
|
+
status: HttpStatus.Code.NotAcceptable,
|
|
188
|
+
key: "ROUTE_HOST_NOT_ALLOWED"
|
|
182
189
|
};
|
|
183
190
|
}
|
|
184
191
|
if (route.roles && route.roles.length > 0) {
|
|
185
192
|
if (!context.user || !context.user.roles || context.user.roles.length === 0) {
|
|
186
193
|
return {
|
|
187
194
|
message: `Route "${route.name}" requires authentication`,
|
|
188
|
-
status: HttpStatus.Code.Forbidden
|
|
195
|
+
status: HttpStatus.Code.Forbidden,
|
|
196
|
+
key: "AUTHENTICATION_REQUIRED"
|
|
189
197
|
};
|
|
190
198
|
}
|
|
191
199
|
const role = new Role;
|
|
@@ -193,7 +201,8 @@ var validateRouteAccess = async (context, route, currentEnv) => {
|
|
|
193
201
|
if (!hasRequiredRole) {
|
|
194
202
|
return {
|
|
195
203
|
message: `Route "${route.name}" is not accessible for user roles`,
|
|
196
|
-
status: HttpStatus.Code.NotAcceptable
|
|
204
|
+
status: HttpStatus.Code.NotAcceptable,
|
|
205
|
+
key: "ROLE_NOT_ALLOWED"
|
|
197
206
|
};
|
|
198
207
|
}
|
|
199
208
|
}
|
|
@@ -205,14 +214,15 @@ var validateResponse = (route, data) => {
|
|
|
205
214
|
if (error) {
|
|
206
215
|
return {
|
|
207
216
|
message: `Invalid response: ${error}`,
|
|
208
|
-
status: HttpStatus.Code.NotAcceptable
|
|
217
|
+
status: HttpStatus.Code.NotAcceptable,
|
|
218
|
+
key: "INVALID_RESPONSE"
|
|
209
219
|
};
|
|
210
220
|
}
|
|
211
221
|
}
|
|
212
222
|
return null;
|
|
213
223
|
};
|
|
214
|
-
var buildExceptionResponse = (context, message, status, env) => {
|
|
215
|
-
return context.response.exception(message, { status }).get(env);
|
|
224
|
+
var buildExceptionResponse = (context, message, status, env, key) => {
|
|
225
|
+
return context.response.exception(message, { status, ...key ? { key } : {} }).get(env);
|
|
216
226
|
};
|
|
217
227
|
var logRequest = (context) => {
|
|
218
228
|
const path = context.route?.path || "";
|
|
@@ -262,32 +272,35 @@ var executeController = async (controller, context) => {
|
|
|
262
272
|
return [response, null];
|
|
263
273
|
} catch (error) {
|
|
264
274
|
if (error instanceof Exception) {
|
|
265
|
-
return [null, { message: error.message, status: error.status }];
|
|
275
|
+
return [null, { message: error.message, status: error.status, key: error.key }];
|
|
266
276
|
}
|
|
267
277
|
if (error instanceof Error) {
|
|
268
|
-
return [null, { message: error.message, status: HttpStatus.Code.InternalServerError }];
|
|
278
|
+
return [null, { message: error.message, status: HttpStatus.Code.InternalServerError, key: "INTERNAL_ERROR" }];
|
|
269
279
|
}
|
|
270
|
-
return [
|
|
280
|
+
return [
|
|
281
|
+
null,
|
|
282
|
+
{ message: "An unknown error occurred", status: HttpStatus.Code.InternalServerError, key: "UNKNOWN_ERROR" }
|
|
283
|
+
];
|
|
271
284
|
}
|
|
272
285
|
};
|
|
273
286
|
var httpRouteHandler = async ({ context, route }) => {
|
|
274
287
|
const currentEnv = context.env.APP_ENV;
|
|
275
288
|
const validationError = await validateRouteAccess(context, route, currentEnv);
|
|
276
289
|
if (validationError) {
|
|
277
|
-
const httpResponse2 = buildExceptionResponse(context, validationError.message, validationError.status, currentEnv);
|
|
290
|
+
const httpResponse2 = buildExceptionResponse(context, validationError.message, validationError.status, currentEnv, validationError.key);
|
|
278
291
|
logRequest(context);
|
|
279
292
|
return httpResponse2;
|
|
280
293
|
}
|
|
281
294
|
const controller = container.get(route.controller);
|
|
282
295
|
const [response, controllerError] = await executeController(controller, context);
|
|
283
296
|
if (controllerError) {
|
|
284
|
-
const httpResponse2 = buildExceptionResponse(context, controllerError.message, controllerError.status, currentEnv);
|
|
297
|
+
const httpResponse2 = buildExceptionResponse(context, controllerError.message, controllerError.status, currentEnv, controllerError.key);
|
|
285
298
|
logRequest(context);
|
|
286
299
|
return httpResponse2;
|
|
287
300
|
}
|
|
288
301
|
const responseValidationError = validateResponse(route, response.getData());
|
|
289
302
|
if (responseValidationError) {
|
|
290
|
-
const httpResponse2 = buildExceptionResponse(context, responseValidationError.message, responseValidationError.status, currentEnv);
|
|
303
|
+
const httpResponse2 = buildExceptionResponse(context, responseValidationError.message, responseValidationError.status, currentEnv, responseValidationError.key);
|
|
291
304
|
logRequest(context);
|
|
292
305
|
return httpResponse2;
|
|
293
306
|
}
|
|
@@ -317,13 +330,14 @@ var formatHttpRoutes = (httpRoutes, middlewares = [], prefix) => {
|
|
|
317
330
|
} catch (error) {
|
|
318
331
|
const env = context.env.APP_ENV;
|
|
319
332
|
const status = error instanceof Exception ? error.status : HttpStatus.Code.InternalServerError;
|
|
320
|
-
const
|
|
333
|
+
const key = error instanceof Exception ? error.key : null;
|
|
334
|
+
const httpResponse = buildExceptionResponse(context, error.message, status, env, key);
|
|
321
335
|
logRequest(context);
|
|
322
336
|
return httpResponse;
|
|
323
337
|
}
|
|
324
338
|
const allowedUsersError = checkAllowedUsers(context);
|
|
325
339
|
if (allowedUsersError) {
|
|
326
|
-
const httpResponse = buildExceptionResponse(context, allowedUsersError.message, allowedUsersError.status, context.env.APP_ENV);
|
|
340
|
+
const httpResponse = buildExceptionResponse(context, allowedUsersError.message, allowedUsersError.status, context.env.APP_ENV, allowedUsersError.key);
|
|
327
341
|
logRequest(context);
|
|
328
342
|
return httpResponse;
|
|
329
343
|
}
|
|
@@ -418,8 +432,8 @@ var runMiddlewares2 = async (context, middlewares) => {
|
|
|
418
432
|
}
|
|
419
433
|
return currentContext;
|
|
420
434
|
};
|
|
421
|
-
var sendException = (context, message, status) => {
|
|
422
|
-
context.response.exception(message, { status });
|
|
435
|
+
var sendException = (context, message, status, key) => {
|
|
436
|
+
context.response.exception(message, { status, ...key ? { key } : {} });
|
|
423
437
|
return context.channel.send(context.response);
|
|
424
438
|
};
|
|
425
439
|
var logSocketRequest = (context, status, path) => {
|
|
@@ -495,23 +509,24 @@ var socketRouteHandler = async ({
|
|
|
495
509
|
const requestData = JSON.parse(message);
|
|
496
510
|
context.queries = requestData.queries;
|
|
497
511
|
context.payload = requestData.payload;
|
|
498
|
-
context.
|
|
512
|
+
context.lang = requestData.lang;
|
|
499
513
|
try {
|
|
500
514
|
context = await runMiddlewares2(context, middlewares);
|
|
501
515
|
} catch (error) {
|
|
502
516
|
const status = error instanceof Exception2 ? error.status : HttpStatus2.Code.InternalServerError;
|
|
517
|
+
const key = error instanceof Exception2 ? error.key : null;
|
|
503
518
|
logSocketRequest(context, status, route.path);
|
|
504
|
-
return sendException(context, error.message, status);
|
|
519
|
+
return sendException(context, error.message, status, key);
|
|
505
520
|
}
|
|
506
521
|
const allowedUsersError = checkAllowedUsers(context);
|
|
507
522
|
if (allowedUsersError) {
|
|
508
523
|
logSocketRequest(context, allowedUsersError.status, route.path);
|
|
509
|
-
return sendException(context, allowedUsersError.message, allowedUsersError.status);
|
|
524
|
+
return sendException(context, allowedUsersError.message, allowedUsersError.status, allowedUsersError.key);
|
|
510
525
|
}
|
|
511
526
|
const validationError = await validateRouteAccess(context, route, currentEnv);
|
|
512
527
|
if (validationError) {
|
|
513
528
|
logSocketRequest(context, validationError.status, route.path);
|
|
514
|
-
return sendException(context, validationError.message, validationError.status);
|
|
529
|
+
return sendException(context, validationError.message, validationError.status, validationError.key);
|
|
515
530
|
}
|
|
516
531
|
if (route.permission) {
|
|
517
532
|
const permission = container2.get(route.permission);
|
|
@@ -522,14 +537,15 @@ var socketRouteHandler = async ({
|
|
|
522
537
|
context.response = await controller.index(context);
|
|
523
538
|
} catch (error) {
|
|
524
539
|
const status = error instanceof Exception2 ? error.status : HttpStatus2.Code.InternalServerError;
|
|
540
|
+
const key = error instanceof Exception2 ? error.key : null;
|
|
525
541
|
const message2 = error instanceof Error ? error.message : "An unknown error occurred";
|
|
526
542
|
logSocketRequest(context, status, route.path);
|
|
527
|
-
return sendException(context, message2, status);
|
|
543
|
+
return sendException(context, message2, status, key);
|
|
528
544
|
}
|
|
529
545
|
const responseValidationError = validateResponse(route, context.response.getData());
|
|
530
546
|
if (responseValidationError) {
|
|
531
547
|
logSocketRequest(context, responseValidationError.status, route.path);
|
|
532
|
-
return sendException(context, responseValidationError.message, responseValidationError.status);
|
|
548
|
+
return sendException(context, responseValidationError.message, responseValidationError.status, responseValidationError.key);
|
|
533
549
|
}
|
|
534
550
|
logSocketRequest(context, HttpStatus2.Code.OK, route.path);
|
|
535
551
|
return context.channel.send(context.response);
|
|
@@ -613,6 +629,7 @@ class App {
|
|
|
613
629
|
const appEnvResult = appEnvValidator.validate(env.APP_ENV);
|
|
614
630
|
if (!appEnvResult.isValid) {
|
|
615
631
|
throw new Exception3(`Invalid APP_ENV: ${appEnvResult.message}`, {
|
|
632
|
+
key: "INVALID_APP_ENV",
|
|
616
633
|
status: HttpStatus3.Code.InternalServerError,
|
|
617
634
|
data: { appEnv: env.APP_ENV }
|
|
618
635
|
});
|
|
@@ -621,6 +638,7 @@ class App {
|
|
|
621
638
|
const portResult = portValidator.validate(env.PORT);
|
|
622
639
|
if (!portResult.isValid) {
|
|
623
640
|
throw new Exception3(`Invalid PORT: ${portResult.message}`, {
|
|
641
|
+
key: "INVALID_PORT",
|
|
624
642
|
status: HttpStatus3.Code.InternalServerError,
|
|
625
643
|
data: { port: env.PORT }
|
|
626
644
|
});
|
|
@@ -629,6 +647,7 @@ class App {
|
|
|
629
647
|
const hostnameResult = hostnameValidator.validate(env.HOST_NAME);
|
|
630
648
|
if (!hostnameResult.isValid) {
|
|
631
649
|
throw new Exception3(`Invalid HOST_NAME: ${hostnameResult.message}`, {
|
|
650
|
+
key: "INVALID_HOST_NAME",
|
|
632
651
|
status: HttpStatus3.Code.InternalServerError,
|
|
633
652
|
data: { hostname: env.HOST_NAME }
|
|
634
653
|
});
|
|
@@ -730,4 +749,4 @@ export {
|
|
|
730
749
|
App
|
|
731
750
|
};
|
|
732
751
|
|
|
733
|
-
//# debugId=
|
|
752
|
+
//# debugId=B3D952CDB8F3E74864756E2164756E21
|
package/dist/index.js.map
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["src/App.ts", "src/httpRouteUtils.ts", "src/logger.ts", "src/socketRouteUtils.ts", "src/generateRouteDoc.ts", "src/generateRouteType.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { AppEnv, type IAppEnv } from \"@ooneex/app-env\";\nimport { container } from \"@ooneex/container\";\nimport type { ICron } from \"@ooneex/cron\";\nimport { Exception, type IException } from \"@ooneex/exception\";\nimport { HttpStatus } from \"@ooneex/http-status\";\nimport { type ILogger, type LogsEntity, TerminalLogger } from \"@ooneex/logger\";\nimport type { MiddlewareClassType, SocketMiddlewareClassType } from \"@ooneex/middleware\";\nimport type { IPubSub } from \"@ooneex/pub-sub\";\nimport { router } from \"@ooneex/routing\";\nimport type { ScalarType } from \"@ooneex/types\";\nimport { AssertAppEnv, AssertHostname, AssertPort } from \"@ooneex/validation/constraints\";\nimport type { BunRequest, Server, ServerWebSocket } from \"bun\";\nimport { buildHttpContext, formatHttpRoutes, logRequest, runMiddlewares } from \"./httpRouteUtils\";\nimport { logger as loggerFunc } from \"./logger\";\nimport { formatSocketRoutes, socketRouteHandler } from \"./socketRouteUtils\";\nimport type { AppConfigType } from \"./types\";\n\nexport class App {\n constructor(private readonly config: AppConfigType) {\n const { loggers, cronJobs, events, analytics, cache, database, storage, mailer, rateLimiter, onException } =\n this.config;\n\n if (!container.has(AppEnv)) {\n container.add(AppEnv);\n }\n\n loggers.forEach((log) => {\n if (!container.has(log)) {\n container.add(log);\n }\n const logger = container.get<ILogger<Record<string, ScalarType>> | ILogger<LogsEntity>>(log);\n logger.init();\n });\n container.addConstant(\"logger\", loggerFunc(loggers, container));\n\n if (!container.has(database)) {\n container.add(database);\n }\n container.addAlias(\"database\", database);\n\n if (onException) {\n if (!container.has(onException)) {\n container.add(onException);\n }\n container.addConstant(\"exception.logger\", onException);\n }\n\n if (analytics) {\n if (!container.has(analytics)) {\n container.add(analytics);\n }\n container.addAlias(\"analytics\", analytics);\n }\n\n if (cache) {\n if (!container.has(cache)) {\n container.add(cache);\n }\n container.addAlias(\"cache\", cache);\n }\n\n if (storage) {\n if (!container.has(storage)) {\n container.add(storage);\n }\n container.addAlias(\"storage\", storage);\n }\n\n if (mailer) {\n if (!container.has(mailer)) {\n container.add(mailer);\n }\n container.addAlias(\"mailer\", mailer);\n }\n\n if (rateLimiter) {\n if (!container.has(rateLimiter)) {\n container.add(rateLimiter);\n }\n container.addAlias(\"rateLimiter\", rateLimiter);\n }\n\n cronJobs?.forEach((cronJob) => {\n if (!container.has(cronJob)) {\n container.add(cronJob);\n }\n const cron = container.get<ICron>(cronJob);\n cron.start();\n });\n\n events?.forEach((event) => {\n if (!container.has(event)) {\n container.add(event);\n }\n const e = container.get<IPubSub>(event);\n e.subscribe();\n });\n }\n\n public async init(): Promise<App> {\n const env = container.get<IAppEnv>(AppEnv);\n\n const appEnvValidator = new AssertAppEnv();\n const appEnvResult = appEnvValidator.validate(env.APP_ENV);\n if (!appEnvResult.isValid) {\n throw new Exception(`Invalid APP_ENV: ${appEnvResult.message}`, {\n status: HttpStatus.Code.InternalServerError,\n data: { appEnv: env.APP_ENV },\n });\n }\n\n const portValidator = new AssertPort();\n const portResult = portValidator.validate(env.PORT);\n if (!portResult.isValid) {\n throw new Exception(`Invalid PORT: ${portResult.message}`, {\n status: HttpStatus.Code.InternalServerError,\n data: { port: env.PORT },\n });\n }\n\n const hostnameValidator = new AssertHostname();\n const hostnameResult = hostnameValidator.validate(env.HOST_NAME);\n if (!hostnameResult.isValid) {\n throw new Exception(`Invalid HOST_NAME: ${hostnameResult.message}`, {\n status: HttpStatus.Code.InternalServerError,\n data: { hostname: env.HOST_NAME },\n });\n }\n\n return this;\n }\n\n public async run(): Promise<App> {\n const logger = new TerminalLogger();\n\n try {\n await this.init();\n } catch (error: unknown) {\n logger.error(error as IException);\n process.exit(1);\n }\n\n const env = container.get<IAppEnv>(AppEnv);\n let hostname = env.HOST_NAME;\n\n const { middlewares = [], routing } = this.config;\n const prefix = routing?.prefix;\n\n const routes = {\n ...formatHttpRoutes(router.getHttpRoutes(), middlewares as MiddlewareClassType[], prefix),\n ...formatSocketRoutes(router.getSocketRoutes(), prefix),\n };\n\n const port = env.PORT;\n\n const server = Bun.serve({\n port,\n hostname,\n development: env.isLocal,\n routes: {\n ...routes,\n \"/*\": async (req: BunRequest, server: Server<unknown>) => {\n let context = await buildHttpContext({ req, server });\n context.response.notFound(\"Not Found\");\n\n if (this.config.cors) {\n context = await runMiddlewares(context, [this.config.cors]);\n }\n\n logRequest(context);\n\n return context.response.get();\n },\n },\n websocket: {\n perMessageDeflate: true,\n async message(ws: ServerWebSocket<{ id: string }>, message: string) {\n await socketRouteHandler({\n message,\n ws,\n server,\n middlewares: middlewares as SocketMiddlewareClassType[],\n });\n },\n async close(ws: ServerWebSocket<{ id: string }>) {\n container.removeConstant(ws.data.id);\n },\n },\n });\n\n hostname = server.hostname || \"0.0.0.0\";\n\n if (hostname === \"0.0.0.0\") {\n hostname = \"localhost\";\n }\n\n logger.info(`Server running at ${server.protocol}//${hostname}:${server.port}`);\n\n if (this.config.check?.health) {\n const healthCheckUrl = `${server.protocol}//${hostname}:${server.port}${prefix ?? \"\"}${this.config.check.health}`;\n const response = await fetch(healthCheckUrl);\n\n if (response.ok) {\n logger.info(`Health check passed at ${this.config.check.health}`);\n } else {\n logger.warn(`Health check failed at ${this.config.check.health} with status ${response.status}`);\n }\n }\n\n return this;\n }\n}\n",
|
|
6
|
-
"import type { IAnalytics } from \"@ooneex/analytics\";\nimport { AppEnv, type EnvironmentNameType, type IAppEnv } from \"@ooneex/app-env\";\nimport type { ICache } from \"@ooneex/cache\";\nimport { container } from \"@ooneex/container\";\nimport type { ContextType } from \"@ooneex/controller\";\nimport type { IDatabase } from \"@ooneex/database\";\nimport { Exception } from \"@ooneex/exception\";\nimport { HttpRequest } from \"@ooneex/http-request\";\nimport { HttpResponse, type IResponse } from \"@ooneex/http-response\";\nimport { HttpStatus, type StatusCodeType } from \"@ooneex/http-status\";\nimport type { ILogger } from \"@ooneex/logger\";\nimport { LogsEntity } from \"@ooneex/logger\";\nimport type { IMailer } from \"@ooneex/mailer\";\nimport type { IMiddleware, MiddlewareClassType } from \"@ooneex/middleware\";\nimport type { IRateLimiter } from \"@ooneex/rate-limit\";\nimport { ERole, Role } from \"@ooneex/role\";\nimport type { RouteConfigType } from \"@ooneex/routing\";\nimport type { IStorage } from \"@ooneex/storage\";\nimport type { ScalarType } from \"@ooneex/types\";\nimport { type AssertType, type IAssert, type } from \"@ooneex/validation\";\nimport type { BunRequest, Server } from \"bun\";\n\nexport const checkAllowedUsers = (context: ContextType): RouteValidationError | null => {\n if (!context.user) {\n return null;\n }\n\n const systemUsers = context.env.SYSTEM_USERS;\n if (systemUsers?.includes(context.user.email)) {\n if (!context.user.roles.includes(ERole.SYSTEM)) {\n context.user.roles.push(ERole.SYSTEM);\n }\n }\n\n const superAdminUsers = context.env.SUPER_ADMIN_USERS;\n if (superAdminUsers?.includes(context.user.email)) {\n if (!context.user.roles.includes(ERole.SUPER_ADMIN)) {\n context.user.roles.push(ERole.SUPER_ADMIN);\n }\n }\n\n const adminUsers = context.env.ADMIN_USERS;\n if (adminUsers?.includes(context.user.email)) {\n if (!context.user.roles.includes(ERole.ADMIN)) {\n context.user.roles.push(ERole.ADMIN);\n }\n }\n\n const allowedUsersKey = `${context.env.APP_ENV.toUpperCase()}_ALLOWED_USERS` as keyof typeof context.env;\n const allowedUsers = context.env[allowedUsersKey] as string[] | undefined;\n\n if (allowedUsers && allowedUsers.length > 0 && !allowedUsers.includes(context.user.email)) {\n return {\n message: `User \"${context.user.email}\" is not allowed in \"${context.env.APP_ENV}\" environment`,\n status: HttpStatus.Code.Forbidden,\n };\n }\n\n return null;\n};\n\ntype HttpRouteHandler = (req: BunRequest, server: Server<unknown>) => Promise<Response>;\ntype HttpMethodHandlers = Partial<Record<string, HttpRouteHandler | Response>>;\ntype HttpRoutesMap = Record<string, HttpMethodHandlers>;\n\nexport const validateConstraint = (constraint: AssertType | IAssert, value: unknown): string | null => {\n if (\n constraint !== null &&\n typeof constraint === \"object\" &&\n \"validate\" in constraint &&\n typeof constraint.validate === \"function\"\n ) {\n const result = constraint.validate(value);\n if (!result.isValid) {\n return result.message || \"Validation failed\";\n }\n } else if (typeof constraint === \"function\") {\n const result = constraint(value);\n if (result instanceof type.errors) {\n return result.summary;\n }\n }\n\n return null;\n};\n\nexport const buildHttpContext = async (ctx: {\n req: BunRequest;\n server: Server<unknown>;\n route?: RouteConfigType;\n}): Promise<ContextType> => {\n const { req, server, route } = ctx;\n\n const address = server.requestIP(req);\n const ip = address?.address ?? \"unknown\";\n\n const response = new HttpResponse();\n\n let payload = {};\n let form: FormData | null = null;\n const contentType = req.headers.get(\"content-type\");\n if (contentType?.includes(\"application/json\")) {\n try {\n payload = await req.json();\n } catch (_e) {}\n } else {\n try {\n form = await req.formData();\n } catch (_e) {}\n }\n\n const request = new HttpRequest(req, {\n params: req.params,\n payload,\n form,\n ip,\n });\n\n const tryGet = <T>(key: string): T | undefined => {\n try {\n return container.get<T>(key);\n } catch {\n return undefined;\n }\n };\n\n const exceptionLogger = container.hasConstant(\"exception.logger\")\n ? container.getConstant<ILogger>(\"exception.logger\")\n : undefined;\n const analytics = tryGet<IAnalytics>(\"analytics\");\n const cache = tryGet<ICache>(\"cache\");\n const storage = tryGet<IStorage>(\"storage\");\n const mailer = tryGet<IMailer>(\"mailer\");\n const rateLimiter = tryGet<IRateLimiter>(\"rateLimiter\");\n const database: IDatabase = container.get(\"database\");\n\n const context: ContextType = {\n logger: container.get(\"logger\"),\n ...(exceptionLogger && { exceptionLogger }),\n ...(analytics && { analytics }),\n ...(cache && { cache }),\n ...(storage && { storage }),\n ...(mailer && { mailer }),\n ...(rateLimiter && { rateLimiter }),\n database,\n route: route\n ? {\n name: route.name,\n path: route.path,\n method: route.method,\n version: route.version,\n description: route.description ?? \"\",\n }\n : null,\n env: container.get<IAppEnv>(AppEnv),\n response,\n request,\n params: request.params,\n payload: request.payload,\n queries: request.queries,\n method: request.method,\n header: request.header,\n files: request.files,\n ip: request.ip,\n host: request.host,\n language: request.language,\n user: null,\n };\n\n return context;\n};\n\ntype ControllerError = { message: string; status: StatusCodeType };\ntype RouteValidationError = { message: string; status: StatusCodeType };\n\nexport const validateRouteAccess = async (\n context: ContextType,\n route: RouteConfigType,\n currentEnv: EnvironmentNameType,\n): Promise<RouteValidationError | null> => {\n // Check params\n if (route.params) {\n for (const [paramName, constraint] of Object.entries(route.params)) {\n const error = validateConstraint(constraint, context.params?.[paramName]);\n if (error) {\n return {\n message: `Invalid parameter \"${paramName}\": ${error}`,\n status: HttpStatus.Code.BadRequest,\n };\n }\n }\n }\n\n // Check queries\n if (route.queries) {\n const error = validateConstraint(route.queries, context.queries);\n if (error) {\n return {\n message: `Invalid query parameters: ${error}`,\n status: HttpStatus.Code.BadRequest,\n };\n }\n }\n\n // Check payload\n if (route.payload) {\n const error = validateConstraint(route.payload, context.payload);\n if (error) {\n return {\n message: `Invalid payload: ${error}`,\n status: HttpStatus.Code.BadRequest,\n };\n }\n }\n\n // Check env\n if (route.env && route.env.length > 0 && !route.env.includes(currentEnv)) {\n return {\n message: `Route \"${route.name}\" is not available in \"${currentEnv}\" environment`,\n status: HttpStatus.Code.NotAcceptable,\n };\n }\n\n // Check ip\n if (route.ip && route.ip.length > 0 && (!context.ip || !route.ip.includes(context.ip))) {\n return {\n message: `Route \"${route.name}\" is not available for IP \"${context.ip}\"`,\n status: HttpStatus.Code.NotAcceptable,\n };\n }\n\n // Check host\n if (route.host && route.host.length > 0 && !route.host.includes(context.host)) {\n return {\n message: `Route \"${route.name}\" is not available for host \"${context.host}\"`,\n status: HttpStatus.Code.NotAcceptable,\n };\n }\n\n // Check roles\n if (route.roles && route.roles.length > 0) {\n if (!context.user || !context.user.roles || context.user.roles.length === 0) {\n return {\n message: `Route \"${route.name}\" requires authentication`,\n status: HttpStatus.Code.Forbidden,\n };\n }\n\n const role = new Role();\n const hasRequiredRole = route.roles.some((requiredRole) =>\n context.user?.roles.some((userRole) => role.hasRole(userRole, requiredRole)),\n );\n\n if (!hasRequiredRole) {\n return {\n message: `Route \"${route.name}\" is not accessible for user roles`,\n status: HttpStatus.Code.NotAcceptable,\n };\n }\n }\n\n return null;\n};\n\nexport const validateResponse = (route: RouteConfigType, data: unknown): RouteValidationError | null => {\n if (route.response) {\n const error = validateConstraint(route.response, data);\n if (error) {\n return {\n message: `Invalid response: ${error}`,\n status: HttpStatus.Code.NotAcceptable,\n };\n }\n }\n return null;\n};\n\nconst buildExceptionResponse = (\n context: ContextType,\n message: string,\n status: StatusCodeType,\n env: EnvironmentNameType,\n): Response => {\n return context.response.exception(message, { status }).get(env);\n};\n\nexport const logRequest = (context: ContextType): void => {\n const path = context.route?.path || \"\";\n const logger = context.logger as {\n success: (message: string, data?: LogsEntity) => void;\n info: (message: string, data?: LogsEntity) => void;\n warn: (message: string, data?: LogsEntity) => void;\n error: (message: string, data?: LogsEntity) => void;\n };\n\n if (!logger) {\n return;\n }\n\n const status = context.response.getStatus();\n const logData = new LogsEntity();\n logData.date = new Date();\n logData.status = status;\n logData.method = context.method;\n logData.path = path;\n logData.params = context.params as Record<string, ScalarType>;\n logData.payload = context.payload as Record<string, unknown>;\n logData.queries = context.queries as Record<string, ScalarType>;\n\n if (context.ip) logData.ip = context.ip;\n\n const userAgent = context.header.get(\"User-Agent\");\n if (userAgent) logData.userAgent = userAgent;\n\n const referer = context.header.getReferer();\n if (referer) logData.referer = referer;\n\n if (context.user?.id) logData.userId = context.user.id;\n if (context.user?.email) logData.email = context.user.email;\n if (context.user?.lastName) logData.lastName = context.user.lastName;\n if (context.user?.firstName) logData.firstName = context.user.firstName;\n\n const message = `${context.method} ${path}`;\n\n if (status >= 500) {\n logger.error(message, logData);\n } else if (status >= 400) {\n logger.warn(message, logData);\n } else if (status >= 300) {\n logger.info(message, logData);\n } else {\n logger.success(message, logData);\n }\n};\n\nconst executeController = async (\n controller: { index: (context: ContextType) => Promise<IResponse> | IResponse },\n context: ContextType,\n): Promise<[IResponse, null] | [null, ControllerError]> => {\n try {\n const response = await controller.index(context);\n return [response, null];\n } catch (error: unknown) {\n if (error instanceof Exception) {\n return [null, { message: error.message, status: error.status as StatusCodeType }];\n }\n if (error instanceof Error) {\n return [null, { message: error.message, status: HttpStatus.Code.InternalServerError }];\n }\n return [null, { message: \"An unknown error occurred\", status: HttpStatus.Code.InternalServerError }];\n }\n};\n\ntype HttpRouteHandlerOptions = {\n context: ContextType;\n route: RouteConfigType;\n};\n\nexport const httpRouteHandler = async ({ context, route }: HttpRouteHandlerOptions): Promise<Response> => {\n const currentEnv = context.env.APP_ENV;\n\n const validationError = await validateRouteAccess(context, route, currentEnv);\n if (validationError) {\n const httpResponse = buildExceptionResponse(context, validationError.message, validationError.status, currentEnv);\n logRequest(context);\n return httpResponse;\n }\n\n const controller = container.get(route.controller);\n\n const [response, controllerError] = await executeController(controller, context);\n if (controllerError) {\n const httpResponse = buildExceptionResponse(context, controllerError.message, controllerError.status, currentEnv);\n logRequest(context);\n return httpResponse;\n }\n\n const responseValidationError = validateResponse(route, response.getData());\n if (responseValidationError) {\n const httpResponse = buildExceptionResponse(\n context,\n responseValidationError.message,\n responseValidationError.status,\n currentEnv,\n );\n logRequest(context);\n return httpResponse;\n }\n\n const httpResponse = response.get(currentEnv);\n logRequest(context);\n\n return httpResponse;\n};\n\nexport const runMiddlewares = async (\n context: ContextType,\n middlewares: MiddlewareClassType[],\n): Promise<ContextType> => {\n let currentContext = context;\n\n for (const MiddlewareClass of middlewares) {\n const middleware = container.get<IMiddleware>(MiddlewareClass);\n currentContext = await middleware.handler(currentContext);\n }\n\n return currentContext;\n};\n\nexport const formatHttpRoutes = (\n httpRoutes: Map<string, RouteConfigType[]>,\n middlewares: MiddlewareClassType[] = [],\n prefix?: string,\n): HttpRoutesMap => {\n const routes: HttpRoutesMap = {};\n\n for (const [path, routeConfigs] of httpRoutes) {\n for (const route of routeConfigs) {\n const versionedPath = `/${prefix ? `${prefix}/` : \"\"}v${route.version}${path}`;\n\n routes[versionedPath] ??= {};\n const methodHandlers = routes[versionedPath];\n\n methodHandlers[route.method] = async (req: BunRequest, server: Server<unknown>) => {\n let context = await buildHttpContext({ req, server, route });\n\n try {\n context = await runMiddlewares(context, middlewares);\n } catch (error: unknown) {\n const env: EnvironmentNameType = context.env.APP_ENV;\n const status = (\n error instanceof Exception ? error.status : HttpStatus.Code.InternalServerError\n ) as StatusCodeType;\n const httpResponse = buildExceptionResponse(context, (error as Error).message, status, env);\n logRequest(context);\n return httpResponse;\n }\n\n // Check allowed users\n const allowedUsersError = checkAllowedUsers(context);\n if (allowedUsersError) {\n const httpResponse = buildExceptionResponse(\n context,\n allowedUsersError.message,\n allowedUsersError.status,\n context.env.APP_ENV,\n );\n logRequest(context);\n return httpResponse;\n }\n\n if (route.permission) {\n const permission = container.get(route.permission);\n context.permission = permission.allow().setUserPermissions(context.user).build();\n }\n\n return httpRouteHandler({ context, route });\n };\n }\n }\n\n return routes;\n};\n",
|
|
5
|
+
"import { AppEnv, type IAppEnv } from \"@ooneex/app-env\";\nimport { container } from \"@ooneex/container\";\nimport type { ICron } from \"@ooneex/cron\";\nimport { Exception, type IException } from \"@ooneex/exception\";\nimport { HttpStatus } from \"@ooneex/http-status\";\nimport { type ILogger, type LogsEntity, TerminalLogger } from \"@ooneex/logger\";\nimport type { MiddlewareClassType, SocketMiddlewareClassType } from \"@ooneex/middleware\";\nimport type { IPubSub } from \"@ooneex/pub-sub\";\nimport { router } from \"@ooneex/routing\";\nimport type { ScalarType } from \"@ooneex/types\";\nimport { AssertAppEnv, AssertHostname, AssertPort } from \"@ooneex/validation/constraints\";\nimport type { BunRequest, Server, ServerWebSocket } from \"bun\";\nimport { buildHttpContext, formatHttpRoutes, logRequest, runMiddlewares } from \"./httpRouteUtils\";\nimport { logger as loggerFunc } from \"./logger\";\nimport { formatSocketRoutes, socketRouteHandler } from \"./socketRouteUtils\";\nimport type { AppConfigType } from \"./types\";\n\nexport class App {\n constructor(private readonly config: AppConfigType) {\n const { loggers, cronJobs, events, analytics, cache, database, storage, mailer, rateLimiter, onException } =\n this.config;\n\n if (!container.has(AppEnv)) {\n container.add(AppEnv);\n }\n\n loggers.forEach((log) => {\n if (!container.has(log)) {\n container.add(log);\n }\n const logger = container.get<ILogger<Record<string, ScalarType>> | ILogger<LogsEntity>>(log);\n logger.init();\n });\n container.addConstant(\"logger\", loggerFunc(loggers, container));\n\n if (!container.has(database)) {\n container.add(database);\n }\n container.addAlias(\"database\", database);\n\n if (onException) {\n if (!container.has(onException)) {\n container.add(onException);\n }\n container.addConstant(\"exception.logger\", onException);\n }\n\n if (analytics) {\n if (!container.has(analytics)) {\n container.add(analytics);\n }\n container.addAlias(\"analytics\", analytics);\n }\n\n if (cache) {\n if (!container.has(cache)) {\n container.add(cache);\n }\n container.addAlias(\"cache\", cache);\n }\n\n if (storage) {\n if (!container.has(storage)) {\n container.add(storage);\n }\n container.addAlias(\"storage\", storage);\n }\n\n if (mailer) {\n if (!container.has(mailer)) {\n container.add(mailer);\n }\n container.addAlias(\"mailer\", mailer);\n }\n\n if (rateLimiter) {\n if (!container.has(rateLimiter)) {\n container.add(rateLimiter);\n }\n container.addAlias(\"rateLimiter\", rateLimiter);\n }\n\n cronJobs?.forEach((cronJob) => {\n if (!container.has(cronJob)) {\n container.add(cronJob);\n }\n const cron = container.get<ICron>(cronJob);\n cron.start();\n });\n\n events?.forEach((event) => {\n if (!container.has(event)) {\n container.add(event);\n }\n const e = container.get<IPubSub>(event);\n e.subscribe();\n });\n }\n\n public async init(): Promise<App> {\n const env = container.get<IAppEnv>(AppEnv);\n\n const appEnvValidator = new AssertAppEnv();\n const appEnvResult = appEnvValidator.validate(env.APP_ENV);\n if (!appEnvResult.isValid) {\n throw new Exception(`Invalid APP_ENV: ${appEnvResult.message}`, {\n key: \"INVALID_APP_ENV\",\n status: HttpStatus.Code.InternalServerError,\n data: { appEnv: env.APP_ENV },\n });\n }\n\n const portValidator = new AssertPort();\n const portResult = portValidator.validate(env.PORT);\n if (!portResult.isValid) {\n throw new Exception(`Invalid PORT: ${portResult.message}`, {\n key: \"INVALID_PORT\",\n status: HttpStatus.Code.InternalServerError,\n data: { port: env.PORT },\n });\n }\n\n const hostnameValidator = new AssertHostname();\n const hostnameResult = hostnameValidator.validate(env.HOST_NAME);\n if (!hostnameResult.isValid) {\n throw new Exception(`Invalid HOST_NAME: ${hostnameResult.message}`, {\n key: \"INVALID_HOST_NAME\",\n status: HttpStatus.Code.InternalServerError,\n data: { hostname: env.HOST_NAME },\n });\n }\n\n return this;\n }\n\n public async run(): Promise<App> {\n const logger = new TerminalLogger();\n\n try {\n await this.init();\n } catch (error: unknown) {\n logger.error(error as IException);\n process.exit(1);\n }\n\n const env = container.get<IAppEnv>(AppEnv);\n let hostname = env.HOST_NAME;\n\n const { middlewares = [], routing } = this.config;\n const prefix = routing?.prefix;\n\n const routes = {\n ...formatHttpRoutes(router.getHttpRoutes(), middlewares as MiddlewareClassType[], prefix),\n ...formatSocketRoutes(router.getSocketRoutes(), prefix),\n };\n\n const port = env.PORT;\n\n const server = Bun.serve({\n port,\n hostname,\n development: env.isLocal,\n routes: {\n ...routes,\n \"/*\": async (req: BunRequest, server: Server<unknown>) => {\n let context = await buildHttpContext({ req, server });\n context.response.notFound(\"Not Found\");\n\n if (this.config.cors) {\n context = await runMiddlewares(context, [this.config.cors]);\n }\n\n logRequest(context);\n\n return context.response.get();\n },\n },\n websocket: {\n perMessageDeflate: true,\n async message(ws: ServerWebSocket<{ id: string }>, message: string) {\n await socketRouteHandler({\n message,\n ws,\n server,\n middlewares: middlewares as SocketMiddlewareClassType[],\n });\n },\n async close(ws: ServerWebSocket<{ id: string }>) {\n container.removeConstant(ws.data.id);\n },\n },\n });\n\n hostname = server.hostname || \"0.0.0.0\";\n\n if (hostname === \"0.0.0.0\") {\n hostname = \"localhost\";\n }\n\n logger.info(`Server running at ${server.protocol}//${hostname}:${server.port}`);\n\n if (this.config.check?.health) {\n const healthCheckUrl = `${server.protocol}//${hostname}:${server.port}${prefix ?? \"\"}${this.config.check.health}`;\n const response = await fetch(healthCheckUrl);\n\n if (response.ok) {\n logger.info(`Health check passed at ${this.config.check.health}`);\n } else {\n logger.warn(`Health check failed at ${this.config.check.health} with status ${response.status}`);\n }\n }\n\n return this;\n }\n}\n",
|
|
6
|
+
"import type { IAnalytics } from \"@ooneex/analytics\";\nimport { AppEnv, type EnvironmentNameType, type IAppEnv } from \"@ooneex/app-env\";\nimport type { ICache } from \"@ooneex/cache\";\nimport { container } from \"@ooneex/container\";\nimport type { ContextType } from \"@ooneex/controller\";\nimport type { IDatabase } from \"@ooneex/database\";\nimport { Exception } from \"@ooneex/exception\";\nimport { HttpRequest } from \"@ooneex/http-request\";\nimport { HttpResponse, type IResponse } from \"@ooneex/http-response\";\nimport { HttpStatus, type StatusCodeType } from \"@ooneex/http-status\";\nimport type { ILogger } from \"@ooneex/logger\";\nimport { LogsEntity } from \"@ooneex/logger\";\nimport type { IMailer } from \"@ooneex/mailer\";\nimport type { IMiddleware, MiddlewareClassType } from \"@ooneex/middleware\";\nimport type { IRateLimiter } from \"@ooneex/rate-limit\";\nimport { ERole, Role } from \"@ooneex/role\";\nimport type { RouteConfigType } from \"@ooneex/routing\";\nimport type { IStorage } from \"@ooneex/storage\";\nimport type { ScalarType } from \"@ooneex/types\";\nimport { type AssertType, type IAssert, type } from \"@ooneex/validation\";\nimport type { BunRequest, Server } from \"bun\";\n\nexport const checkAllowedUsers = (context: ContextType): RouteValidationError | null => {\n if (!context.user) {\n return null;\n }\n\n const systemUsers = context.env.SYSTEM_USERS;\n if (systemUsers?.includes(context.user.email)) {\n if (!context.user.roles.includes(ERole.SYSTEM)) {\n context.user.roles.push(ERole.SYSTEM);\n }\n }\n\n const superAdminUsers = context.env.SUPER_ADMIN_USERS;\n if (superAdminUsers?.includes(context.user.email)) {\n if (!context.user.roles.includes(ERole.SUPER_ADMIN)) {\n context.user.roles.push(ERole.SUPER_ADMIN);\n }\n }\n\n const adminUsers = context.env.ADMIN_USERS;\n if (adminUsers?.includes(context.user.email)) {\n if (!context.user.roles.includes(ERole.ADMIN)) {\n context.user.roles.push(ERole.ADMIN);\n }\n }\n\n const allowedUsersKey = `${context.env.APP_ENV.toUpperCase()}_ALLOWED_USERS` as keyof typeof context.env;\n const allowedUsers = context.env[allowedUsersKey] as string[] | undefined;\n\n if (allowedUsers && allowedUsers.length > 0 && !allowedUsers.includes(context.user.email)) {\n return {\n message: `User \"${context.user.email}\" is not allowed in \"${context.env.APP_ENV}\" environment`,\n status: HttpStatus.Code.Forbidden,\n key: \"USER_NOT_ALLOWED\",\n };\n }\n\n return null;\n};\n\ntype HttpRouteHandler = (req: BunRequest, server: Server<unknown>) => Promise<Response>;\ntype HttpMethodHandlers = Partial<Record<string, HttpRouteHandler | Response>>;\ntype HttpRoutesMap = Record<string, HttpMethodHandlers>;\n\nexport const validateConstraint = (constraint: AssertType | IAssert, value: unknown): string | null => {\n if (\n constraint !== null &&\n typeof constraint === \"object\" &&\n \"validate\" in constraint &&\n typeof constraint.validate === \"function\"\n ) {\n const result = constraint.validate(value);\n if (!result.isValid) {\n return result.message || \"Validation failed\";\n }\n } else if (typeof constraint === \"function\") {\n const result = constraint(value);\n if (result instanceof type.errors) {\n return result.summary;\n }\n }\n\n return null;\n};\n\nexport const buildHttpContext = async (ctx: {\n req: BunRequest;\n server: Server<unknown>;\n route?: RouteConfigType;\n}): Promise<ContextType> => {\n const { req, server, route } = ctx;\n\n const address = server.requestIP(req);\n const ip = address?.address ?? \"unknown\";\n\n const response = new HttpResponse();\n\n let payload = {};\n let form: FormData | null = null;\n const contentType = req.headers.get(\"content-type\");\n if (contentType?.includes(\"application/json\")) {\n try {\n payload = await req.json();\n } catch (_e) {}\n } else {\n try {\n form = await req.formData();\n } catch (_e) {}\n }\n\n const request = new HttpRequest(req, {\n params: req.params,\n payload,\n form,\n ip,\n });\n\n const tryGet = <T>(key: string): T | undefined => {\n try {\n return container.get<T>(key);\n } catch {\n return undefined;\n }\n };\n\n const exceptionLogger = container.hasConstant(\"exception.logger\")\n ? container.getConstant<ILogger>(\"exception.logger\")\n : undefined;\n const analytics = tryGet<IAnalytics>(\"analytics\");\n const cache = tryGet<ICache>(\"cache\");\n const storage = tryGet<IStorage>(\"storage\");\n const mailer = tryGet<IMailer>(\"mailer\");\n const rateLimiter = tryGet<IRateLimiter>(\"rateLimiter\");\n const database: IDatabase = container.get(\"database\");\n\n const context: ContextType = {\n logger: container.get(\"logger\"),\n ...(exceptionLogger && { exceptionLogger }),\n ...(analytics && { analytics }),\n ...(cache && { cache }),\n ...(storage && { storage }),\n ...(mailer && { mailer }),\n ...(rateLimiter && { rateLimiter }),\n database,\n route: route\n ? {\n name: route.name,\n path: route.path,\n method: route.method,\n version: route.version,\n description: route.description ?? \"\",\n }\n : null,\n env: container.get<IAppEnv>(AppEnv),\n response,\n request,\n params: request.params,\n payload: request.payload,\n queries: request.queries,\n method: request.method,\n header: request.header,\n files: request.files,\n ip: request.ip,\n host: request.host,\n lang: request.lang,\n user: null,\n };\n\n return context;\n};\n\ntype ControllerError = { message: string; status: StatusCodeType; key?: string | null };\ntype RouteValidationError = { message: string; status: StatusCodeType; key?: string | null };\n\nexport const validateRouteAccess = async (\n context: ContextType,\n route: RouteConfigType,\n currentEnv: EnvironmentNameType,\n): Promise<RouteValidationError | null> => {\n // Check params\n if (route.params) {\n for (const [paramName, constraint] of Object.entries(route.params)) {\n const error = validateConstraint(constraint, context.params?.[paramName]);\n if (error) {\n return {\n message: `Invalid parameter \"${paramName}\": ${error}`,\n status: HttpStatus.Code.BadRequest,\n key: \"INVALID_PARAMETER\",\n };\n }\n }\n }\n\n // Check queries\n if (route.queries) {\n const error = validateConstraint(route.queries, context.queries);\n if (error) {\n return {\n message: `Invalid query parameters: ${error}`,\n status: HttpStatus.Code.BadRequest,\n key: \"INVALID_QUERY\",\n };\n }\n }\n\n // Check payload\n if (route.payload) {\n const error = validateConstraint(route.payload, context.payload);\n if (error) {\n return {\n message: `Invalid payload: ${error}`,\n status: HttpStatus.Code.BadRequest,\n key: \"INVALID_PAYLOAD\",\n };\n }\n }\n\n // Check env\n if (route.env && route.env.length > 0 && !route.env.includes(currentEnv)) {\n return {\n message: `Route \"${route.name}\" is not available in \"${currentEnv}\" environment`,\n status: HttpStatus.Code.NotAcceptable,\n key: \"ROUTE_ENV_NOT_ALLOWED\",\n };\n }\n\n // Check ip\n if (route.ip && route.ip.length > 0 && (!context.ip || !route.ip.includes(context.ip))) {\n return {\n message: `Route \"${route.name}\" is not available for IP \"${context.ip}\"`,\n status: HttpStatus.Code.NotAcceptable,\n key: \"ROUTE_IP_NOT_ALLOWED\",\n };\n }\n\n // Check host\n if (route.host && route.host.length > 0 && !route.host.includes(context.host)) {\n return {\n message: `Route \"${route.name}\" is not available for host \"${context.host}\"`,\n status: HttpStatus.Code.NotAcceptable,\n key: \"ROUTE_HOST_NOT_ALLOWED\",\n };\n }\n\n // Check roles\n if (route.roles && route.roles.length > 0) {\n if (!context.user || !context.user.roles || context.user.roles.length === 0) {\n return {\n message: `Route \"${route.name}\" requires authentication`,\n status: HttpStatus.Code.Forbidden,\n key: \"AUTHENTICATION_REQUIRED\",\n };\n }\n\n const role = new Role();\n const hasRequiredRole = route.roles.some((requiredRole) =>\n context.user?.roles.some((userRole) => role.hasRole(userRole, requiredRole)),\n );\n\n if (!hasRequiredRole) {\n return {\n message: `Route \"${route.name}\" is not accessible for user roles`,\n status: HttpStatus.Code.NotAcceptable,\n key: \"ROLE_NOT_ALLOWED\",\n };\n }\n }\n\n return null;\n};\n\nexport const validateResponse = (route: RouteConfigType, data: unknown): RouteValidationError | null => {\n if (route.response) {\n const error = validateConstraint(route.response, data);\n if (error) {\n return {\n message: `Invalid response: ${error}`,\n status: HttpStatus.Code.NotAcceptable,\n key: \"INVALID_RESPONSE\",\n };\n }\n }\n return null;\n};\n\nconst buildExceptionResponse = (\n context: ContextType,\n message: string,\n status: StatusCodeType,\n env: EnvironmentNameType,\n key?: string | null,\n): Response => {\n return context.response.exception(message, { status, ...(key ? { key } : {}) }).get(env);\n};\n\nexport const logRequest = (context: ContextType): void => {\n const path = context.route?.path || \"\";\n const logger = context.logger as {\n success: (message: string, data?: LogsEntity) => void;\n info: (message: string, data?: LogsEntity) => void;\n warn: (message: string, data?: LogsEntity) => void;\n error: (message: string, data?: LogsEntity) => void;\n };\n\n if (!logger) {\n return;\n }\n\n const status = context.response.getStatus();\n const logData = new LogsEntity();\n logData.date = new Date();\n logData.status = status;\n logData.method = context.method;\n logData.path = path;\n logData.params = context.params as Record<string, ScalarType>;\n logData.payload = context.payload as Record<string, unknown>;\n logData.queries = context.queries as Record<string, ScalarType>;\n\n if (context.ip) logData.ip = context.ip;\n\n const userAgent = context.header.get(\"User-Agent\");\n if (userAgent) logData.userAgent = userAgent;\n\n const referer = context.header.getReferer();\n if (referer) logData.referer = referer;\n\n if (context.user?.id) logData.userId = context.user.id;\n if (context.user?.email) logData.email = context.user.email;\n if (context.user?.lastName) logData.lastName = context.user.lastName;\n if (context.user?.firstName) logData.firstName = context.user.firstName;\n\n const message = `${context.method} ${path}`;\n\n if (status >= 500) {\n logger.error(message, logData);\n } else if (status >= 400) {\n logger.warn(message, logData);\n } else if (status >= 300) {\n logger.info(message, logData);\n } else {\n logger.success(message, logData);\n }\n};\n\nconst executeController = async (\n controller: { index: (context: ContextType) => Promise<IResponse> | IResponse },\n context: ContextType,\n): Promise<[IResponse, null] | [null, ControllerError]> => {\n try {\n const response = await controller.index(context);\n return [response, null];\n } catch (error: unknown) {\n if (error instanceof Exception) {\n return [null, { message: error.message, status: error.status as StatusCodeType, key: error.key }];\n }\n if (error instanceof Error) {\n return [null, { message: error.message, status: HttpStatus.Code.InternalServerError, key: \"INTERNAL_ERROR\" }];\n }\n return [\n null,\n { message: \"An unknown error occurred\", status: HttpStatus.Code.InternalServerError, key: \"UNKNOWN_ERROR\" },\n ];\n }\n};\n\ntype HttpRouteHandlerOptions = {\n context: ContextType;\n route: RouteConfigType;\n};\n\nexport const httpRouteHandler = async ({ context, route }: HttpRouteHandlerOptions): Promise<Response> => {\n const currentEnv = context.env.APP_ENV;\n\n const validationError = await validateRouteAccess(context, route, currentEnv);\n if (validationError) {\n const httpResponse = buildExceptionResponse(\n context,\n validationError.message,\n validationError.status,\n currentEnv,\n validationError.key,\n );\n logRequest(context);\n return httpResponse;\n }\n\n const controller = container.get(route.controller);\n\n const [response, controllerError] = await executeController(controller, context);\n if (controllerError) {\n const httpResponse = buildExceptionResponse(\n context,\n controllerError.message,\n controllerError.status,\n currentEnv,\n controllerError.key,\n );\n logRequest(context);\n return httpResponse;\n }\n\n const responseValidationError = validateResponse(route, response.getData());\n if (responseValidationError) {\n const httpResponse = buildExceptionResponse(\n context,\n responseValidationError.message,\n responseValidationError.status,\n currentEnv,\n responseValidationError.key,\n );\n logRequest(context);\n return httpResponse;\n }\n\n const httpResponse = response.get(currentEnv);\n logRequest(context);\n\n return httpResponse;\n};\n\nexport const runMiddlewares = async (\n context: ContextType,\n middlewares: MiddlewareClassType[],\n): Promise<ContextType> => {\n let currentContext = context;\n\n for (const MiddlewareClass of middlewares) {\n const middleware = container.get<IMiddleware>(MiddlewareClass);\n currentContext = await middleware.handler(currentContext);\n }\n\n return currentContext;\n};\n\nexport const formatHttpRoutes = (\n httpRoutes: Map<string, RouteConfigType[]>,\n middlewares: MiddlewareClassType[] = [],\n prefix?: string,\n): HttpRoutesMap => {\n const routes: HttpRoutesMap = {};\n\n for (const [path, routeConfigs] of httpRoutes) {\n for (const route of routeConfigs) {\n const versionedPath = `/${prefix ? `${prefix}/` : \"\"}v${route.version}${path}`;\n\n routes[versionedPath] ??= {};\n const methodHandlers = routes[versionedPath];\n\n methodHandlers[route.method] = async (req: BunRequest, server: Server<unknown>) => {\n let context = await buildHttpContext({ req, server, route });\n\n try {\n context = await runMiddlewares(context, middlewares);\n } catch (error: unknown) {\n const env: EnvironmentNameType = context.env.APP_ENV;\n const status = (\n error instanceof Exception ? error.status : HttpStatus.Code.InternalServerError\n ) as StatusCodeType;\n const key = error instanceof Exception ? error.key : null;\n const httpResponse = buildExceptionResponse(context, (error as Error).message, status, env, key);\n logRequest(context);\n return httpResponse;\n }\n\n // Check allowed users\n const allowedUsersError = checkAllowedUsers(context);\n if (allowedUsersError) {\n const httpResponse = buildExceptionResponse(\n context,\n allowedUsersError.message,\n allowedUsersError.status,\n context.env.APP_ENV,\n allowedUsersError.key,\n );\n logRequest(context);\n return httpResponse;\n }\n\n if (route.permission) {\n const permission = container.get(route.permission);\n context.permission = permission.allow().setUserPermissions(context.user).build();\n }\n\n return httpRouteHandler({ context, route });\n };\n }\n }\n\n return routes;\n};\n",
|
|
7
7
|
"import type { IContainer } from \"@ooneex/container\";\nimport type { IException } from \"@ooneex/exception\";\nimport type { ILogger, LoggerClassType, LogsEntity } from \"@ooneex/logger\";\nimport type { ScalarType } from \"@ooneex/types\";\n\nexport const logger = (loggers: LoggerClassType[], container: IContainer) => ({\n error: (message: string | IException, data?: Record<string, ScalarType> & LogsEntity) => {\n loggers.forEach((logger) => {\n const log = container.get<ILogger<Record<string, ScalarType>> | ILogger<LogsEntity>>(logger);\n if (log) {\n log.error(message, data);\n }\n });\n },\n warn: (message: string, data?: Record<string, ScalarType> & LogsEntity) => {\n loggers.forEach((logger) => {\n const log = container.get<ILogger<Record<string, ScalarType>> | ILogger<LogsEntity>>(logger);\n if (log) {\n log.warn(message, data);\n }\n });\n },\n info: (message: string, data?: Record<string, ScalarType> & LogsEntity) => {\n loggers.forEach((logger) => {\n const log = container.get<ILogger<Record<string, ScalarType>> | ILogger<LogsEntity>>(logger);\n if (log) {\n log.info(message, data);\n }\n });\n },\n debug: (message: string, data?: Record<string, ScalarType> & LogsEntity) => {\n loggers.forEach((logger) => {\n const log = container.get<ILogger<Record<string, ScalarType>> | ILogger<LogsEntity>>(logger);\n if (log) {\n log.debug(message, data);\n }\n });\n },\n log: (message: string, data?: Record<string, ScalarType> & LogsEntity) => {\n loggers.forEach((logger) => {\n const log = container.get<ILogger<Record<string, ScalarType>> | ILogger<LogsEntity>>(logger);\n if (log) {\n log.log(message, data);\n }\n });\n },\n success: (message: string, data?: Record<string, ScalarType> & LogsEntity) => {\n loggers.forEach((logger) => {\n const log = container.get<ILogger<Record<string, ScalarType>> | ILogger<LogsEntity>>(logger);\n if (log) {\n log.success(message, data);\n }\n });\n },\n});\n",
|
|
8
|
-
"import type { EnvironmentNameType } from \"@ooneex/app-env\";\nimport { container } from \"@ooneex/container\";\nimport { Exception } from \"@ooneex/exception\";\nimport type { IResponse } from \"@ooneex/http-response\";\nimport { HttpStatus, type StatusCodeType } from \"@ooneex/http-status\";\nimport { LogsEntity } from \"@ooneex/logger\";\nimport type { ISocketMiddleware, SocketMiddlewareClassType } from \"@ooneex/middleware\";\nimport type { RouteConfigType } from \"@ooneex/routing\";\nimport type { ContextType } from \"@ooneex/socket\";\nimport type { RequestDataType } from \"@ooneex/socket-client\";\nimport type { LocaleInfoType } from \"@ooneex/translation\";\nimport type { ScalarType } from \"@ooneex/types\";\nimport { random } from \"@ooneex/utils\";\nimport type { BunRequest, Server, ServerWebSocket } from \"bun\";\nimport { buildHttpContext, checkAllowedUsers, validateResponse, validateRouteAccess } from \"./httpRouteUtils\";\n\ntype SocketRouteHandler = (req: BunRequest, server: Server<unknown>) => Promise<undefined>;\ntype SocketRoutesMap = Record<string, SocketRouteHandler>;\n\nexport const formatSocketRoutes = (socketRoutes: Map<string, RouteConfigType>, prefix?: string): SocketRoutesMap => {\n const routes: SocketRoutesMap = {};\n\n for (const [path, route] of socketRoutes) {\n const versionedPath = `/${prefix ? `${prefix}/` : \"\"}v${route.version}${path}`;\n routes[versionedPath] = async (req: BunRequest, server: Server<unknown>) => {\n const context = await buildHttpContext({ req, server, route });\n const id = random.nanoid(30);\n container.addConstant(id, { context, route });\n server.upgrade(req, { data: { id } });\n\n return undefined;\n };\n }\n\n return routes;\n};\n\nconst runMiddlewares = async (context: ContextType, middlewares: SocketMiddlewareClassType[]): Promise<ContextType> => {\n let currentContext = context;\n\n for (const MiddlewareClass of middlewares) {\n const middleware = container.get<ISocketMiddleware>(MiddlewareClass);\n currentContext = await middleware.handler(currentContext);\n }\n\n return currentContext;\n};\n\nconst sendException = (context: ContextType
|
|
8
|
+
"import type { EnvironmentNameType } from \"@ooneex/app-env\";\nimport { container } from \"@ooneex/container\";\nimport { Exception } from \"@ooneex/exception\";\nimport type { IResponse } from \"@ooneex/http-response\";\nimport { HttpStatus, type StatusCodeType } from \"@ooneex/http-status\";\nimport { LogsEntity } from \"@ooneex/logger\";\nimport type { ISocketMiddleware, SocketMiddlewareClassType } from \"@ooneex/middleware\";\nimport type { RouteConfigType } from \"@ooneex/routing\";\nimport type { ContextType } from \"@ooneex/socket\";\nimport type { RequestDataType } from \"@ooneex/socket-client\";\nimport type { LocaleInfoType } from \"@ooneex/translation\";\nimport type { ScalarType } from \"@ooneex/types\";\nimport { random } from \"@ooneex/utils\";\nimport type { BunRequest, Server, ServerWebSocket } from \"bun\";\nimport { buildHttpContext, checkAllowedUsers, validateResponse, validateRouteAccess } from \"./httpRouteUtils\";\n\ntype SocketRouteHandler = (req: BunRequest, server: Server<unknown>) => Promise<undefined>;\ntype SocketRoutesMap = Record<string, SocketRouteHandler>;\n\nexport const formatSocketRoutes = (socketRoutes: Map<string, RouteConfigType>, prefix?: string): SocketRoutesMap => {\n const routes: SocketRoutesMap = {};\n\n for (const [path, route] of socketRoutes) {\n const versionedPath = `/${prefix ? `${prefix}/` : \"\"}v${route.version}${path}`;\n routes[versionedPath] = async (req: BunRequest, server: Server<unknown>) => {\n const context = await buildHttpContext({ req, server, route });\n const id = random.nanoid(30);\n container.addConstant(id, { context, route });\n server.upgrade(req, { data: { id } });\n\n return undefined;\n };\n }\n\n return routes;\n};\n\nconst runMiddlewares = async (context: ContextType, middlewares: SocketMiddlewareClassType[]): Promise<ContextType> => {\n let currentContext = context;\n\n for (const MiddlewareClass of middlewares) {\n const middleware = container.get<ISocketMiddleware>(MiddlewareClass);\n currentContext = await middleware.handler(currentContext);\n }\n\n return currentContext;\n};\n\nconst sendException = (\n context: ContextType,\n message: string,\n status: StatusCodeType,\n key?: string | null,\n): Promise<void> => {\n context.response.exception(message, { status, ...(key ? { key } : {}) });\n return context.channel.send(context.response);\n};\n\nconst logSocketRequest = (context: ContextType, status: number, path: string): void => {\n const logger = context.logger as {\n success: (message: string, data?: LogsEntity) => void;\n info: (message: string, data?: LogsEntity) => void;\n warn: (message: string, data?: LogsEntity) => void;\n error: (message: string, data?: LogsEntity) => void;\n };\n\n if (!logger) {\n return;\n }\n\n const logData = new LogsEntity();\n logData.date = new Date();\n logData.status = status;\n logData.method = \"GET\";\n logData.path = path;\n logData.params = context.params as Record<string, ScalarType>;\n logData.payload = context.payload as Record<string, unknown>;\n logData.queries = context.queries as Record<string, ScalarType>;\n\n if (context.ip) logData.ip = context.ip;\n\n const userAgent = context.header.get(\"User-Agent\");\n if (userAgent) logData.userAgent = userAgent;\n\n const referer = context.header.getReferer();\n if (referer) logData.referer = referer;\n\n if (context.user?.id) logData.userId = context.user.id;\n if (context.user?.email) logData.email = context.user.email;\n if (context.user?.lastName) logData.lastName = context.user.lastName;\n if (context.user?.firstName) logData.firstName = context.user.firstName;\n\n const message = `WS ${path}`;\n\n if (status >= 500) {\n logger.error(message, logData);\n } else if (status >= 400) {\n logger.warn(message, logData);\n } else if (status >= 300) {\n logger.info(message, logData);\n } else {\n logger.success(message, logData);\n }\n};\n\ntype SocketRouteHandlerOptions = {\n message: string;\n ws: ServerWebSocket<{ id: string }>;\n server: Server<{ id: string }>;\n middlewares?: SocketMiddlewareClassType[];\n};\n\nexport const socketRouteHandler = async ({\n message,\n ws,\n server,\n middlewares = [],\n}: SocketRouteHandlerOptions): Promise<void> => {\n let { context, route } = container.getConstant<{ context: ContextType; route: RouteConfigType }>(ws.data.id);\n const currentEnv: EnvironmentNameType = context.env.APP_ENV;\n\n context.channel = {\n send: async (response: IResponse): Promise<void> => {\n const data = await response.get(currentEnv).json();\n ws.send(JSON.stringify(data));\n },\n close: (code?: number, reason?: string): void => {\n ws.close(code, reason);\n },\n subscribe: async (): Promise<void> => {\n ws.subscribe(route.name);\n },\n isSubscribed: (): boolean => {\n return ws.isSubscribed(route.name);\n },\n unsubscribe: async (): Promise<void> => {\n ws.unsubscribe(route.name);\n },\n publish: async (response: IResponse): Promise<void> => {\n const data = await response.get(currentEnv).json();\n\n server.publish(route.name, data);\n },\n };\n\n const requestData = JSON.parse(message) as RequestDataType;\n context.queries = requestData.queries as Record<string, ScalarType>;\n context.payload = requestData.payload as Record<string, ScalarType>;\n context.lang = requestData.lang as LocaleInfoType;\n\n try {\n context = await runMiddlewares(context, middlewares);\n } catch (error: unknown) {\n const status = (error instanceof Exception ? error.status : HttpStatus.Code.InternalServerError) as number;\n const key = error instanceof Exception ? error.key : null;\n logSocketRequest(context, status, route.path);\n return sendException(context, (error as Error).message, status as StatusCodeType, key);\n }\n\n // Check allowed users\n const allowedUsersError = checkAllowedUsers(context);\n if (allowedUsersError) {\n logSocketRequest(context, allowedUsersError.status, route.path);\n return sendException(context, allowedUsersError.message, allowedUsersError.status, allowedUsersError.key);\n }\n\n const validationError = await validateRouteAccess(context, route, currentEnv);\n if (validationError) {\n logSocketRequest(context, validationError.status, route.path);\n return sendException(context, validationError.message, validationError.status, validationError.key);\n }\n\n if (route.permission) {\n const permission = container.get(route.permission);\n context.permission = permission.allow().setUserPermissions(context.user).build();\n }\n\n const controller = container.get(route.controller);\n\n try {\n context.response = await controller.index(context);\n } catch (error: unknown) {\n const status = (error instanceof Exception ? error.status : HttpStatus.Code.InternalServerError) as number;\n const key = error instanceof Exception ? error.key : null;\n const message = error instanceof Error ? error.message : \"An unknown error occurred\";\n logSocketRequest(context, status, route.path);\n return sendException(context, message, status as StatusCodeType, key);\n }\n\n const responseValidationError = validateResponse(route, context.response.getData());\n if (responseValidationError) {\n logSocketRequest(context, responseValidationError.status, route.path);\n return sendException(\n context,\n responseValidationError.message,\n responseValidationError.status,\n responseValidationError.key,\n );\n }\n\n logSocketRequest(context, HttpStatus.Code.OK, route.path);\n return context.channel.send(context.response);\n};\n",
|
|
9
9
|
"import { join } from \"node:path\";\nimport type { RouteConfigType } from \"@ooneex/routing\";\nimport { routeConfigToJsonDoc } from \"@ooneex/routing\";\n\nexport const generateRouteDoc = async (config: RouteConfigType): Promise<void> => {\n const outputDir = \"docs/routes\";\n const jsonDoc = routeConfigToJsonDoc(config);\n const fileName = `${config.name}.json`;\n const filePath = join(process.cwd(), outputDir, fileName);\n\n await Bun.write(filePath, JSON.stringify(jsonDoc, null, 2));\n};\n",
|
|
10
10
|
"import { join } from \"node:path\";\nimport type { RouteConfigType } from \"@ooneex/routing\";\nimport { routeConfigToTypeString } from \"@ooneex/routing\";\nimport { toPascalCase } from \"@ooneex/utils\";\n\nexport const generateRouteType = async (config: RouteConfigType): Promise<void> => {\n const outputDir = \"src/types/routes\";\n const typeString = routeConfigToTypeString(config);\n const fileName = `${config.name}.ts`;\n const filePath = join(process.cwd(), outputDir, fileName);\n\n const typeName = toPascalCase(config.name);\n\n const fileContent = `export type ${typeName}RouteType = ${typeString};\n`;\n\n await Bun.write(filePath, fileContent);\n};\n"
|
|
11
11
|
],
|
|
12
|
-
"mappings": "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",
|
|
13
|
-
"debugId": "
|
|
12
|
+
"mappings": "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",
|
|
13
|
+
"debugId": "B3D952CDB8F3E74864756E2164756E21",
|
|
14
14
|
"names": []
|
|
15
15
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ooneex/app",
|
|
3
3
|
"description": "Full-featured application framework for Bun — orchestrates routing, middleware pipelines, dependency injection, caching, logging, and WebSocket support in a modular architecture",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.5.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist",
|
|
@@ -29,32 +29,32 @@
|
|
|
29
29
|
"dev": "bun run src/dev.ts"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@ooneex/analytics": "1.1.
|
|
33
|
-
"@ooneex/app-env": "1.
|
|
34
|
-
"@ooneex/cache": "1.
|
|
35
|
-
"@ooneex/container": "1.2.
|
|
36
|
-
"@ooneex/exception": "1.
|
|
32
|
+
"@ooneex/analytics": "1.1.6",
|
|
33
|
+
"@ooneex/app-env": "1.3.0",
|
|
34
|
+
"@ooneex/cache": "1.2.0",
|
|
35
|
+
"@ooneex/container": "1.2.2",
|
|
36
|
+
"@ooneex/exception": "1.2.0",
|
|
37
37
|
"@ooneex/http-request": "1.2.4",
|
|
38
|
-
"@ooneex/http-response": "1.
|
|
38
|
+
"@ooneex/http-response": "1.3.0",
|
|
39
39
|
"@ooneex/http-status": "1.1.3",
|
|
40
|
-
"@ooneex/logger": "1.2.
|
|
41
|
-
"@ooneex/mailer": "1.1.
|
|
42
|
-
"@ooneex/rate-limit": "1.
|
|
40
|
+
"@ooneex/logger": "1.2.6",
|
|
41
|
+
"@ooneex/mailer": "1.1.5",
|
|
42
|
+
"@ooneex/rate-limit": "1.2.0",
|
|
43
43
|
"@ooneex/role": "1.1.3",
|
|
44
|
-
"@ooneex/routing": "1.3.
|
|
45
|
-
"@ooneex/storage": "1.1.
|
|
44
|
+
"@ooneex/routing": "1.3.2",
|
|
45
|
+
"@ooneex/storage": "1.1.5",
|
|
46
46
|
"@ooneex/utils": "0.4.1",
|
|
47
47
|
"@ooneex/validation": "1.1.3"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@ooneex/controller": "1.3.3",
|
|
51
|
-
"@ooneex/cron": "1.1.
|
|
52
|
-
"@ooneex/pub-sub": "1.1.
|
|
51
|
+
"@ooneex/cron": "1.1.5",
|
|
52
|
+
"@ooneex/pub-sub": "1.1.5",
|
|
53
53
|
"@ooneex/middleware": "1.2.5",
|
|
54
54
|
"@ooneex/module": "1.2.3",
|
|
55
55
|
"@ooneex/socket": "1.2.4",
|
|
56
|
-
"@ooneex/socket-client": "1.2.
|
|
57
|
-
"@ooneex/translation": "1.1.
|
|
56
|
+
"@ooneex/socket-client": "1.2.4",
|
|
57
|
+
"@ooneex/translation": "1.1.4",
|
|
58
58
|
"@ooneex/types": "1.1.3"
|
|
59
59
|
},
|
|
60
60
|
"keywords": [
|