@vercube/core 0.0.2-beta.1 → 0.0.3

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.
@@ -9,6 +9,7 @@ export declare class App {
9
9
  private gPluginsRegistry;
10
10
  private gHttpServer;
11
11
  private gStaticRequestHandler;
12
+ private gLogger;
12
13
  /** Holds the initialization status of the application */
13
14
  private fIsInitialized;
14
15
  /** Holds the dependency injection container */
@@ -48,6 +49,14 @@ export declare class App {
48
49
  */
49
50
  listen(): Promise<void>;
50
51
  /**
52
+ * Handles an incoming HTTP request.
53
+ * This method is an adapter for HttpServer.handleRequest method.
54
+ *
55
+ * @param {Request} request - The incoming HTTP request
56
+ * @returns {Promise<Response>} The HTTP response
57
+ */
58
+ fetch(request: Request): Promise<Response>;
59
+ /**
51
60
  * Resolves and initializes the plugins for the application.
52
61
  *
53
62
  * @private
@@ -53,5 +53,5 @@ export declare class HttpServer {
53
53
  * @returns {Promise<Response>} The HTTP response
54
54
  * @private
55
55
  */
56
- private handleRequest;
56
+ handleRequest(request: Request): Promise<Response>;
57
57
  }
@@ -1,4 +1,5 @@
1
1
  import { MetadataTypes } from "./MetadataTypes.js";
2
+ export { FastResponse } from "srvx";
2
3
  export type MaybePromise<T> = T | Promise<T>;
3
4
  export interface MiddlewareOptions<T = any> {
4
5
  middlewareArgs?: T;
@@ -1,5 +1 @@
1
- /**
2
- * Generate random hash
3
- * @returns string
4
- */
5
1
  export default function generateRandomHash(): string;
package/dist/index.cjs CHANGED
@@ -34,8 +34,8 @@ const __vercube_logger = __toESM(require("@vercube/logger"));
34
34
  const c12 = __toESM(require("c12"));
35
35
  const defu = __toESM(require("defu"));
36
36
 
37
- //#region node_modules/.pnpm/@oxc-project+runtime@0.65.0/node_modules/@oxc-project/runtime/src/helpers/decorate.js
38
- var require_decorate = __commonJS({ "node_modules/.pnpm/@oxc-project+runtime@0.65.0/node_modules/@oxc-project/runtime/src/helpers/decorate.js"(exports, module) {
37
+ //#region node_modules/.pnpm/@oxc-project+runtime@0.67.0/node_modules/@oxc-project/runtime/src/helpers/decorate.js
38
+ var require_decorate = __commonJS({ "node_modules/.pnpm/@oxc-project+runtime@0.67.0/node_modules/@oxc-project/runtime/src/helpers/decorate.js"(exports, module) {
39
39
  function __decorate(decorators, target, key, desc) {
40
40
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
41
41
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -594,9 +594,12 @@ var RequestHandler = class {
594
594
  */
595
595
  async handleRequest(request, route) {
596
596
  try {
597
- const { instance, propertyName, actions, args, middlewares } = route.data;
598
- let fakeResponse = new Response(void 0, { headers: { "Content-Type": request.headers.get("Content-Type") ?? "application/json" } });
599
- for await (const hook of middlewares?.beforeMiddlewares ?? []) try {
597
+ const { instance, propertyName, actions = [], args = [], middlewares = {
598
+ beforeMiddlewares: [],
599
+ afterMiddlewares: []
600
+ } } = route.data;
601
+ let fakeResponse = new srvx.FastResponse(void 0, { headers: { "Content-Type": request.headers.get("Content-Type") ?? "application/json" } });
602
+ if (middlewares.beforeMiddlewares.length > 0) for await (const hook of middlewares.beforeMiddlewares) try {
600
603
  const hookResponse = await hook.middleware.onRequest?.(request, fakeResponse, {
601
604
  middlewareArgs: hook.args,
602
605
  methodArgs: args
@@ -609,25 +612,26 @@ var RequestHandler = class {
609
612
  const actionResponse = action.handler(request, fakeResponse);
610
613
  if (actionResponse !== null) fakeResponse = this.processOverrideResponse(actionResponse, fakeResponse);
611
614
  }
612
- const resolvedArgs = await this.gMetadataResolver.resolveArgs(args, {
615
+ const resolvedArgs = args.length > 0 ? await this.gMetadataResolver.resolveArgs(args, {
613
616
  ...route,
614
617
  request,
615
618
  response: fakeResponse
616
- });
619
+ }) : [];
617
620
  let handlerResponse = instance[propertyName].call(instance, ...resolvedArgs?.map((a) => a.resolved) ?? []);
618
621
  if (handlerResponse instanceof Promise) handlerResponse = await handlerResponse;
619
- for await (const hook of middlewares?.afterMiddlewares ?? []) try {
622
+ if (middlewares.afterMiddlewares.length > 0) for await (const hook of middlewares.afterMiddlewares) try {
620
623
  const hookResponse = await hook.middleware.onResponse?.(request, fakeResponse, handlerResponse);
621
624
  if (hookResponse !== null) fakeResponse = this.processOverrideResponse(hookResponse, fakeResponse);
622
625
  } catch (error_) {
623
626
  this.gContainer.get(ErrorHandlerProvider).handleError(error_);
624
627
  }
625
628
  const body = fakeResponse?.body ?? JSON.stringify(handlerResponse);
626
- return new Response(body, {
627
- status: fakeResponse.status,
628
- statusText: fakeResponse.statusText,
629
+ const response = new Response(body, {
630
+ status: fakeResponse.status ?? 200,
631
+ statusText: fakeResponse.statusText ?? "OK",
629
632
  headers: fakeResponse.headers
630
633
  });
634
+ return response;
631
635
  } catch (error_) {
632
636
  return this.gContainer.get(ErrorHandlerProvider).handleError(error_);
633
637
  }
@@ -645,11 +649,11 @@ var RequestHandler = class {
645
649
  * @private
646
650
  */
647
651
  processOverrideResponse(response, base) {
648
- let fakeResponse = base ?? new Response();
649
- if (response != null && response instanceof Response) return response;
652
+ let fakeResponse = base ?? new srvx.FastResponse();
653
+ if (response != null && response instanceof srvx.FastResponse) return response;
650
654
  else if (response !== null) {
651
655
  const responseInit = response;
652
- fakeResponse = new Response(void 0, {
656
+ fakeResponse = new srvx.FastResponse(void 0, {
653
657
  status: responseInit?.status ?? fakeResponse.status,
654
658
  headers: responseInit?.headers ?? fakeResponse.headers,
655
659
  statusText: responseInit?.statusText ?? fakeResponse.statusText
@@ -857,6 +861,7 @@ var App = class {
857
861
  gPluginsRegistry;
858
862
  gHttpServer;
859
863
  gStaticRequestHandler;
864
+ gLogger;
860
865
  /** Holds the initialization status of the application */
861
866
  fIsInitialized = false;
862
867
  /** Holds the dependency injection container */
@@ -910,9 +915,20 @@ var App = class {
910
915
  await this.resolvePlugins();
911
916
  (0, __vercube_di.initializeContainer)(this.container);
912
917
  await this.gHttpServer.listen();
918
+ this.gLogger?.info(`\n${__vercube_logger.colors.green("➜")} App listening on port ${__vercube_logger.colors.bold(this.fConfig.server?.port?.toString() ?? "3000")}`);
913
919
  this.fIsInitialized = true;
914
920
  }
915
921
  /**
922
+ * Handles an incoming HTTP request.
923
+ * This method is an adapter for HttpServer.handleRequest method.
924
+ *
925
+ * @param {Request} request - The incoming HTTP request
926
+ * @returns {Promise<Response>} The HTTP response
927
+ */
928
+ async fetch(request) {
929
+ return this.gHttpServer.handleRequest(request);
930
+ }
931
+ /**
916
932
  * Resolves and initializes the plugins for the application.
917
933
  *
918
934
  * @private
@@ -925,6 +941,7 @@ var App = class {
925
941
  (0, import_decorate.default)([(0, __vercube_di.Inject)(PluginsRegistry)], App.prototype, "gPluginsRegistry", void 0);
926
942
  (0, import_decorate.default)([(0, __vercube_di.Inject)(HttpServer)], App.prototype, "gHttpServer", void 0);
927
943
  (0, import_decorate.default)([(0, __vercube_di.Inject)(StaticRequestHandler)], App.prototype, "gStaticRequestHandler", void 0);
944
+ (0, import_decorate.default)([(0, __vercube_di.InjectOptional)(__vercube_logger.Logger)], App.prototype, "gLogger", void 0);
928
945
 
929
946
  //#endregion
930
947
  //#region packages/logger/dist/Providers/index.mjs
@@ -1077,9 +1094,9 @@ var DefaultErrorHandlerProvider = class extends ErrorHandlerProvider {
1077
1094
  handleError(error) {
1078
1095
  const _internalError = new InternalServerError(error?.message ?? "Internal server error");
1079
1096
  const status = error?.status ?? 500;
1080
- if (error instanceof HttpError) return new Response(JSON.stringify({ ...error }, void 0, 2), { status });
1097
+ if (error instanceof HttpError) return new srvx.FastResponse(JSON.stringify({ ...error }, void 0, 2), { status });
1081
1098
  this.gLogger.error(error);
1082
- return new Response(JSON.stringify({ ...error?.cause ?? _internalError }, void 0, 2), { status });
1099
+ return new srvx.FastResponse(JSON.stringify({ ...error?.cause ?? _internalError }, void 0, 2), { status });
1083
1100
  }
1084
1101
  };
1085
1102
  (0, import_decorate.default)([(0, __vercube_di.Inject)(__vercube_logger.Logger)], DefaultErrorHandlerProvider.prototype, "gLogger", void 0);
@@ -2239,7 +2256,7 @@ var RedirectDecorator = class extends __vercube_di.BaseDecorator {
2239
2256
  initializeMetadata(this.prototype);
2240
2257
  const method = initializeMetadataMethod(this.prototype, this.propertyName);
2241
2258
  method.actions.push({ handler: () => {
2242
- return new Response(void 0, {
2259
+ return new srvx.FastResponse(void 0, {
2243
2260
  status: this.options.code,
2244
2261
  headers: { "Location": this.options.location }
2245
2262
  });
@@ -2638,6 +2655,12 @@ exports.Connect = Connect
2638
2655
  exports.Controller = Controller
2639
2656
  exports.Delete = Delete
2640
2657
  exports.ErrorHandlerProvider = ErrorHandlerProvider
2658
+ Object.defineProperty(exports, 'FastResponse', {
2659
+ enumerable: true,
2660
+ get: function () {
2661
+ return srvx.FastResponse;
2662
+ }
2663
+ });
2641
2664
  exports.ForbiddenError = ForbiddenError
2642
2665
  exports.Get = Get
2643
2666
  exports.GlobalMiddlewareRegistry = GlobalMiddlewareRegistry
@@ -2666,6 +2689,7 @@ exports.QueryParams = QueryParams
2666
2689
  exports.Redirect = Redirect
2667
2690
  exports.Request = Request
2668
2691
  exports.Response = Response$1
2692
+ exports.Router = Router
2669
2693
  exports.Session = Session
2670
2694
  exports.SetHeader = SetHeader
2671
2695
  exports.Status = Status
package/dist/index.d.ts CHANGED
@@ -34,6 +34,7 @@ export * from "./Services/Middleware/GlobalMiddlewareRegistry.js";
34
34
  export * from "./Services/HttpServer/HttpServer.js";
35
35
  export * from "./Services/Metadata/MetadataResolver.js";
36
36
  export * from "./Services/ErrorHandler/ErrorHandlerProvider.js";
37
+ export * from "./Services/Router/Router.js";
37
38
  export * from "./Errors/HttpError.js";
38
39
  export * from "./Errors/Http/BadRequestError.js";
39
40
  export * from "./Errors/Http/ForbiddenError.js";
package/dist/index.mjs CHANGED
@@ -1,14 +1,14 @@
1
1
  import { BaseDecorator, Container, Inject, InjectOptional, createDecorator, initializeContainer } from "@vercube/di";
2
- import { serve } from "srvx";
2
+ import { FastResponse, serve } from "srvx";
3
3
  import { addRoute, createRouter, findRoute } from "rou3";
4
4
  import { createReadStream } from "node:fs";
5
5
  import { extname, join, normalize } from "node:path";
6
6
  import { stat } from "node:fs/promises";
7
- import { BaseLogger, Logger } from "@vercube/logger";
7
+ import { BaseLogger, Logger, colors } from "@vercube/logger";
8
8
  import { loadConfig } from "c12";
9
9
  import { defu } from "defu";
10
10
 
11
- //#region node_modules/.pnpm/@oxc-project+runtime@0.65.0/node_modules/@oxc-project/runtime/src/helpers/esm/decorate.js
11
+ //#region node_modules/.pnpm/@oxc-project+runtime@0.67.0/node_modules/@oxc-project/runtime/src/helpers/esm/decorate.js
12
12
  function __decorate(decorators, target, key, desc) {
13
13
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
14
14
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -564,9 +564,12 @@ var RequestHandler = class {
564
564
  */
565
565
  async handleRequest(request, route) {
566
566
  try {
567
- const { instance, propertyName, actions, args, middlewares } = route.data;
568
- let fakeResponse = new Response(void 0, { headers: { "Content-Type": request.headers.get("Content-Type") ?? "application/json" } });
569
- for await (const hook of middlewares?.beforeMiddlewares ?? []) try {
567
+ const { instance, propertyName, actions = [], args = [], middlewares = {
568
+ beforeMiddlewares: [],
569
+ afterMiddlewares: []
570
+ } } = route.data;
571
+ let fakeResponse = new FastResponse(void 0, { headers: { "Content-Type": request.headers.get("Content-Type") ?? "application/json" } });
572
+ if (middlewares.beforeMiddlewares.length > 0) for await (const hook of middlewares.beforeMiddlewares) try {
570
573
  const hookResponse = await hook.middleware.onRequest?.(request, fakeResponse, {
571
574
  middlewareArgs: hook.args,
572
575
  methodArgs: args
@@ -579,25 +582,26 @@ var RequestHandler = class {
579
582
  const actionResponse = action.handler(request, fakeResponse);
580
583
  if (actionResponse !== null) fakeResponse = this.processOverrideResponse(actionResponse, fakeResponse);
581
584
  }
582
- const resolvedArgs = await this.gMetadataResolver.resolveArgs(args, {
585
+ const resolvedArgs = args.length > 0 ? await this.gMetadataResolver.resolveArgs(args, {
583
586
  ...route,
584
587
  request,
585
588
  response: fakeResponse
586
- });
589
+ }) : [];
587
590
  let handlerResponse = instance[propertyName].call(instance, ...resolvedArgs?.map((a) => a.resolved) ?? []);
588
591
  if (handlerResponse instanceof Promise) handlerResponse = await handlerResponse;
589
- for await (const hook of middlewares?.afterMiddlewares ?? []) try {
592
+ if (middlewares.afterMiddlewares.length > 0) for await (const hook of middlewares.afterMiddlewares) try {
590
593
  const hookResponse = await hook.middleware.onResponse?.(request, fakeResponse, handlerResponse);
591
594
  if (hookResponse !== null) fakeResponse = this.processOverrideResponse(hookResponse, fakeResponse);
592
595
  } catch (error_) {
593
596
  this.gContainer.get(ErrorHandlerProvider).handleError(error_);
594
597
  }
595
598
  const body = fakeResponse?.body ?? JSON.stringify(handlerResponse);
596
- return new Response(body, {
597
- status: fakeResponse.status,
598
- statusText: fakeResponse.statusText,
599
+ const response = new Response(body, {
600
+ status: fakeResponse.status ?? 200,
601
+ statusText: fakeResponse.statusText ?? "OK",
599
602
  headers: fakeResponse.headers
600
603
  });
604
+ return response;
601
605
  } catch (error_) {
602
606
  return this.gContainer.get(ErrorHandlerProvider).handleError(error_);
603
607
  }
@@ -615,11 +619,11 @@ var RequestHandler = class {
615
619
  * @private
616
620
  */
617
621
  processOverrideResponse(response, base) {
618
- let fakeResponse = base ?? new Response();
619
- if (response != null && response instanceof Response) return response;
622
+ let fakeResponse = base ?? new FastResponse();
623
+ if (response != null && response instanceof FastResponse) return response;
620
624
  else if (response !== null) {
621
625
  const responseInit = response;
622
- fakeResponse = new Response(void 0, {
626
+ fakeResponse = new FastResponse(void 0, {
623
627
  status: responseInit?.status ?? fakeResponse.status,
624
628
  headers: responseInit?.headers ?? fakeResponse.headers,
625
629
  statusText: responseInit?.statusText ?? fakeResponse.statusText
@@ -827,6 +831,7 @@ var App = class {
827
831
  gPluginsRegistry;
828
832
  gHttpServer;
829
833
  gStaticRequestHandler;
834
+ gLogger;
830
835
  /** Holds the initialization status of the application */
831
836
  fIsInitialized = false;
832
837
  /** Holds the dependency injection container */
@@ -880,9 +885,20 @@ var App = class {
880
885
  await this.resolvePlugins();
881
886
  initializeContainer(this.container);
882
887
  await this.gHttpServer.listen();
888
+ this.gLogger?.info(`\n${colors.green("➜")} App listening on port ${colors.bold(this.fConfig.server?.port?.toString() ?? "3000")}`);
883
889
  this.fIsInitialized = true;
884
890
  }
885
891
  /**
892
+ * Handles an incoming HTTP request.
893
+ * This method is an adapter for HttpServer.handleRequest method.
894
+ *
895
+ * @param {Request} request - The incoming HTTP request
896
+ * @returns {Promise<Response>} The HTTP response
897
+ */
898
+ async fetch(request) {
899
+ return this.gHttpServer.handleRequest(request);
900
+ }
901
+ /**
886
902
  * Resolves and initializes the plugins for the application.
887
903
  *
888
904
  * @private
@@ -895,6 +911,7 @@ __decorate([Inject(Router)], App.prototype, "gRouter", void 0);
895
911
  __decorate([Inject(PluginsRegistry)], App.prototype, "gPluginsRegistry", void 0);
896
912
  __decorate([Inject(HttpServer)], App.prototype, "gHttpServer", void 0);
897
913
  __decorate([Inject(StaticRequestHandler)], App.prototype, "gStaticRequestHandler", void 0);
914
+ __decorate([InjectOptional(Logger)], App.prototype, "gLogger", void 0);
898
915
 
899
916
  //#endregion
900
917
  //#region packages/logger/dist/Providers/index.mjs
@@ -913,7 +930,7 @@ const colorIfAllowed = (colorFn) => {
913
930
  };
914
931
  return wrappedFn;
915
932
  };
916
- const colors = {
933
+ const colors$1 = {
917
934
  bold: colorIfAllowed((text) => `\x1B[1m${text}\x1B[0m`),
918
935
  green: colorIfAllowed((text) => `\x1B[32m${text}\x1B[39m`),
919
936
  yellow: colorIfAllowed((text) => `\x1B[33m${text}\x1B[39m`),
@@ -922,10 +939,10 @@ const colors = {
922
939
  cyanBright: colorIfAllowed((text) => `\x1B[96m${text}\x1B[39m`)
923
940
  };
924
941
  const LOG_LEVEL_COLORS = {
925
- debug: colors.green,
926
- info: colors.bold,
927
- warn: colors.yellow,
928
- error: colors.red
942
+ debug: colors$1.green,
943
+ info: colors$1.bold,
944
+ warn: colors$1.yellow,
945
+ error: colors$1.red
929
946
  };
930
947
  /**
931
948
  * ConsoleProvider class for logging messages to the console.
@@ -1047,9 +1064,9 @@ var DefaultErrorHandlerProvider = class extends ErrorHandlerProvider {
1047
1064
  handleError(error) {
1048
1065
  const _internalError = new InternalServerError(error?.message ?? "Internal server error");
1049
1066
  const status = error?.status ?? 500;
1050
- if (error instanceof HttpError) return new Response(JSON.stringify({ ...error }, void 0, 2), { status });
1067
+ if (error instanceof HttpError) return new FastResponse(JSON.stringify({ ...error }, void 0, 2), { status });
1051
1068
  this.gLogger.error(error);
1052
- return new Response(JSON.stringify({ ...error?.cause ?? _internalError }, void 0, 2), { status });
1069
+ return new FastResponse(JSON.stringify({ ...error?.cause ?? _internalError }, void 0, 2), { status });
1053
1070
  }
1054
1071
  };
1055
1072
  __decorate([Inject(Logger)], DefaultErrorHandlerProvider.prototype, "gLogger", void 0);
@@ -2209,7 +2226,7 @@ var RedirectDecorator = class extends BaseDecorator {
2209
2226
  initializeMetadata(this.prototype);
2210
2227
  const method = initializeMetadataMethod(this.prototype, this.propertyName);
2211
2228
  method.actions.push({ handler: () => {
2212
- return new Response(void 0, {
2229
+ return new FastResponse(void 0, {
2213
2230
  status: this.options.code,
2214
2231
  headers: { "Location": this.options.location }
2215
2232
  });
@@ -2599,4 +2616,4 @@ let HTTPStatus = /* @__PURE__ */ function(HTTPStatus$1) {
2599
2616
  }({});
2600
2617
 
2601
2618
  //#endregion
2602
- export { App, BadRequestError, BaseMiddleware, BasePlugin, Body, Connect, Controller, Delete, ErrorHandlerProvider, ForbiddenError, Get, GlobalMiddlewareRegistry, HTTPStatus, Head, Header, Headers$1 as Headers, HooksService, HttpError, HttpServer, InternalServerError, Listen, MetadataResolver, MethodNotAllowedError, Middleware, MultipartFormData, NotAcceptableError, NotFoundError, Options, Param, Patch, Post, Put, QueryParam, QueryParams, Redirect, Request, Response$1 as Response, Session, SetHeader, Status, Trace, UnauthorizedError, createApp, createMetadataCtx, createMetadataMethod, defineConfig, initializeMetadata, initializeMetadataMethod, loadVercubeConfig };
2619
+ export { App, BadRequestError, BaseMiddleware, BasePlugin, Body, Connect, Controller, Delete, ErrorHandlerProvider, FastResponse, ForbiddenError, Get, GlobalMiddlewareRegistry, HTTPStatus, Head, Header, Headers$1 as Headers, HooksService, HttpError, HttpServer, InternalServerError, Listen, MetadataResolver, MethodNotAllowedError, Middleware, MultipartFormData, NotAcceptableError, NotFoundError, Options, Param, Patch, Post, Put, QueryParam, QueryParams, Redirect, Request, Response$1 as Response, Router, Session, SetHeader, Status, Trace, UnauthorizedError, createApp, createMetadataCtx, createMetadataMethod, defineConfig, initializeMetadata, initializeMetadataMethod, loadVercubeConfig };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vercube/core",
3
- "version": "0.0.2-beta.1",
3
+ "version": "0.0.3",
4
4
  "description": "Core module for Vercube framework",
5
5
  "repository": "@vercube/core",
6
6
  "license": "MIT",
@@ -25,10 +25,10 @@
25
25
  "c12": "3.0.3",
26
26
  "defu": "6.1.4",
27
27
  "pathe": "2.0.3",
28
- "rou3": "0.6.0",
29
- "srvx": "0.4.0",
30
- "@vercube/di": "0.0.2-beta.1",
31
- "@vercube/logger": "0.0.2-beta.1"
28
+ "rou3": "0.6.1",
29
+ "srvx": "0.6.0",
30
+ "@vercube/di": "0.0.3",
31
+ "@vercube/logger": "0.0.3"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@vitest/coverage-v8": "^3.1.2",