@bool-ts/core 1.3.2 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/.prettierrc +11 -0
  2. package/LICENSE +21 -21
  3. package/__test/controller.ts +66 -79
  4. package/__test/index.ts +8 -11
  5. package/__test/interfaces.ts +7 -7
  6. package/__test/module.ts +16 -17
  7. package/__test/repository.ts +16 -16
  8. package/__test/service.ts +20 -20
  9. package/bun.lockb +0 -0
  10. package/dist/decorators/arguments.d.ts +43 -0
  11. package/dist/decorators/arguments.js +97 -0
  12. package/dist/decorators/controller.d.ts +2 -2
  13. package/dist/decorators/controller.js +6 -10
  14. package/dist/decorators/http.d.ts +1 -1
  15. package/dist/decorators/http.js +16 -103
  16. package/dist/decorators/index.d.ts +1 -0
  17. package/dist/decorators/index.js +7 -26
  18. package/dist/decorators/inject.js +5 -9
  19. package/dist/decorators/injectable.d.ts +2 -2
  20. package/dist/decorators/injectable.js +4 -8
  21. package/dist/decorators/module.d.ts +4 -2
  22. package/dist/decorators/module.js +4 -8
  23. package/dist/decorators/zodSchema.d.ts +1 -1
  24. package/dist/decorators/zodSchema.js +5 -8
  25. package/dist/entities/index.d.ts +3 -0
  26. package/dist/entities/index.js +3 -0
  27. package/dist/entities/route.d.ts +101 -0
  28. package/dist/entities/route.js +257 -0
  29. package/dist/entities/router.d.ts +10 -0
  30. package/dist/entities/router.js +25 -0
  31. package/dist/entities/routerGroup.d.ts +14 -0
  32. package/dist/entities/routerGroup.js +24 -0
  33. package/dist/hooks/factory.d.ts +12 -12
  34. package/dist/hooks/factory.js +202 -150
  35. package/dist/hooks/index.js +2 -7
  36. package/dist/hooks/injector.js +7 -10
  37. package/dist/http/clientError.d.ts +1 -1
  38. package/dist/http/clientError.js +3 -7
  39. package/dist/http/index.d.ts +12 -2
  40. package/dist/http/index.js +34 -73
  41. package/dist/http/serverError.js +3 -7
  42. package/dist/index.js +5 -21
  43. package/dist/interfaces/index.js +1 -3
  44. package/dist/ultils/asyncFunction.js +1 -4
  45. package/dist/ultils/index.js +1 -17
  46. package/package.json +30 -33
  47. package/src/decorators/arguments.ts +186 -0
  48. package/src/decorators/controller.ts +14 -18
  49. package/src/decorators/http.ts +81 -195
  50. package/src/decorators/index.ts +7 -6
  51. package/src/decorators/inject.ts +13 -19
  52. package/src/decorators/injectable.ts +11 -12
  53. package/src/decorators/module.ts +21 -22
  54. package/src/decorators/zodSchema.ts +20 -27
  55. package/src/entities/index.ts +3 -0
  56. package/src/entities/route.ts +328 -0
  57. package/src/entities/router.ts +35 -0
  58. package/src/entities/routerGroup.ts +34 -0
  59. package/src/hooks/factory.ts +319 -205
  60. package/src/hooks/index.ts +2 -2
  61. package/src/hooks/injector.ts +43 -43
  62. package/src/http/clientError.ts +45 -56
  63. package/src/http/index.ts +63 -72
  64. package/src/http/serverError.ts +38 -38
  65. package/src/index.ts +6 -6
  66. package/src/interfaces/index.ts +3 -3
  67. package/test.http +30 -28
  68. package/tsconfig.json +107 -109
@@ -0,0 +1,10 @@
1
+ import Route from "./route";
2
+ export declare class Router {
3
+ readonly alias: string;
4
+ private _routes;
5
+ constructor(alias: string);
6
+ route(alias: string): Route;
7
+ private _thinAlias;
8
+ get routes(): Map<string, Route>;
9
+ }
10
+ export default Router;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ import Route from "./route";
3
+ export class Router {
4
+ alias;
5
+ _routes = new Map();
6
+ constructor(alias) {
7
+ this.alias = this._thinAlias(alias);
8
+ }
9
+ route(alias) {
10
+ const thinAlias = this._thinAlias(`${this.alias}/${alias}`);
11
+ const route = this._routes.get(thinAlias);
12
+ const newRoute = !route ? new Route(`${this.alias}/${alias}`) : route;
13
+ if (!route) {
14
+ this._routes.set(thinAlias, newRoute);
15
+ }
16
+ return newRoute;
17
+ }
18
+ _thinAlias(alias) {
19
+ return alias.replace(new RegExp("[/]{2,}", "g"), "/").replace(new RegExp("^[/]|[/]$", "g"), "");
20
+ }
21
+ get routes() {
22
+ return this._routes;
23
+ }
24
+ }
25
+ export default Router;
@@ -0,0 +1,14 @@
1
+ import type { THttpMethods } from "../http";
2
+ import type { Router } from "./router";
3
+ export declare class RouterGroup {
4
+ private _routers;
5
+ add(...routers: Array<Router>): this;
6
+ find(pathame: string, method: keyof THttpMethods): Readonly<{
7
+ params: Record<string, string>;
8
+ handlers: Array<Required<{
9
+ constructor: new (...args: Array<any>) => unknown;
10
+ funcName: string | symbol;
11
+ func: (...args: Array<any>) => unknown;
12
+ }>>;
13
+ }> | undefined;
14
+ }
@@ -0,0 +1,24 @@
1
+ export class RouterGroup {
2
+ _routers = new Map();
3
+ add(...routers) {
4
+ for (let i = 0; i < routers.length; i++) {
5
+ if (this._routers.has(routers[i].alias)) {
6
+ continue;
7
+ }
8
+ this._routers.set(routers[i].alias, routers[i]);
9
+ }
10
+ return this;
11
+ }
12
+ find(pathame, method) {
13
+ for (const router of [...this._routers.values()]) {
14
+ for (const route of router.routes.values()) {
15
+ const result = route.test(pathame, method);
16
+ if (!result) {
17
+ continue;
18
+ }
19
+ return result;
20
+ }
21
+ }
22
+ return undefined;
23
+ }
24
+ }
@@ -1,19 +1,19 @@
1
- import "reflect-metadata";
2
1
  import "colors";
3
- export type TBoolFactoryOptions = Partial<{
2
+ import "reflect-metadata";
3
+ import Qs from "qs";
4
+ import * as Zod from "zod";
5
+ import { RouterGroup } from "../entities";
6
+ export type TBoolFactoryOptions = Required<{
7
+ port: number;
8
+ }> & Partial<{
9
+ prefix: string;
4
10
  debug: boolean;
5
11
  log: Partial<{
6
12
  methods: Array<"GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "OPTIONS">;
7
13
  }>;
8
- queryParser: Partial<{
9
- depth: 10;
10
- arrayLimit: 50;
11
- }>;
12
- prefix: string;
14
+ queryParser: Parameters<typeof Qs.parse>[1];
13
15
  }>;
14
- /**
15
- *
16
- * @param target
17
- */
18
- export declare const BoolFactory: (target: new (...args: any[]) => unknown, options?: TBoolFactoryOptions) => import("express-serve-static-core").Express;
16
+ export declare const controllerCreator: (controllerConstructor: new (...args: any[]) => unknown, group: RouterGroup) => RouterGroup;
17
+ export declare const controllerActionArgumentsResolution: (data: unknown, zodSchema: Zod.Schema, argumentIndex: number, funcName: string | symbol) => Promise<any>;
18
+ export declare const BoolFactory: (target: new (...args: any[]) => unknown, options: TBoolFactoryOptions) => void;
19
19
  export default BoolFactory;
@@ -1,179 +1,231 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.BoolFactory = void 0;
27
- require("reflect-metadata");
28
- require("colors");
29
- const Qs = __importStar(require("qs"));
30
- const ResponseTime = __importStar(require("response-time"));
31
- const decorators_1 = require("../decorators");
32
- const express_1 = __importStar(require("express"));
33
- const injector_1 = require("./injector");
34
- const http_1 = require("../http");
35
- /**
36
- *
37
- * @param target
38
- * @param router
39
- */
40
- const controllerCreator = (controllerConstructor, parentRouter = (0, express_1.Router)()) => {
41
- if (!Reflect.getOwnMetadataKeys(controllerConstructor).includes(decorators_1.controllerKey)) {
1
+ import "colors";
2
+ import "reflect-metadata";
3
+ import Qs from "qs";
4
+ import * as Zod from "zod";
5
+ import { Router, RouterGroup } from "../entities";
6
+ import { controllerKey, controllerRoutesKey, moduleKey } from "../decorators";
7
+ import { HttpClientError, HttpServerError, jsonErrorInfer } from "../http";
8
+ import { Injector } from "./injector";
9
+ import { controllerActionArgumentsKey, EArgumentTypes } from "../decorators/arguments";
10
+ export const controllerCreator = (controllerConstructor, group) => {
11
+ if (!Reflect.getOwnMetadataKeys(controllerConstructor).includes(controllerKey)) {
42
12
  throw Error(`${controllerConstructor.name} is not a controller.`);
43
13
  }
44
- const controller = injector_1.Injector.get(controllerConstructor);
14
+ const controller = Injector.get(controllerConstructor);
45
15
  if (!controller) {
46
16
  throw Error("Can not initialize controller.");
47
17
  }
48
- const controllerMetadata = Reflect.getOwnMetadata(decorators_1.controllerKey, controllerConstructor) || "/";
49
- const routesMetadata = (Reflect.getOwnMetadata(decorators_1.controllerRoutesKey, controllerConstructor) || []);
50
- const router = (0, express_1.Router)();
51
- routesMetadata.forEach(routeMetadata => {
18
+ const controllerMetadata = Reflect.getOwnMetadata(controllerKey, controllerConstructor) || "/";
19
+ const routesMetadata = (Reflect.getOwnMetadata(controllerRoutesKey, controllerConstructor) ||
20
+ []);
21
+ const router = new Router(controllerMetadata);
22
+ routesMetadata.forEach((routeMetadata) => {
52
23
  if (typeof routeMetadata.descriptor.value !== "function") {
53
24
  return;
54
25
  }
55
- const route = router.route(routeMetadata.path);
26
+ const route = router.route(`/${routeMetadata.path}`);
27
+ const handler = routeMetadata.descriptor.value.bind(controller);
28
+ const routeArgument = {
29
+ constructor: controllerConstructor,
30
+ funcName: routeMetadata.methodName,
31
+ func: handler
32
+ };
56
33
  switch (routeMetadata.httpMethod) {
57
34
  case "GET":
58
- return route.get(routeMetadata.descriptor.value.bind(controller));
35
+ return route.get(routeArgument);
59
36
  case "POST":
60
- return route.post(routeMetadata.descriptor.value.bind(controller));
37
+ return route.post(routeArgument);
61
38
  case "PUT":
62
- return route.put(routeMetadata.descriptor.value.bind(controller));
39
+ return route.put(routeArgument);
63
40
  case "PATCH":
64
- return route.patch(routeMetadata.descriptor.value.bind(controller));
41
+ return route.patch(routeArgument);
65
42
  case "DELETE":
66
- return route.delete(routeMetadata.descriptor.value.bind(controller));
43
+ return route.delete(routeArgument);
67
44
  case "OPTIONS":
68
- return route.options(routeMetadata.descriptor.value.bind(controller));
45
+ return route.options(routeArgument);
69
46
  }
70
47
  });
71
- return parentRouter.use(controllerMetadata, router);
48
+ return group.add(router);
72
49
  };
73
- /**
74
- *
75
- * @param target
76
- */
77
- const BoolFactory = (target, options) => {
78
- if (!Reflect.getOwnMetadataKeys(target).includes(decorators_1.moduleKey)) {
50
+ export const controllerActionArgumentsResolution = async (data, zodSchema, argumentIndex, funcName) => {
51
+ try {
52
+ const validation = await zodSchema.safeParseAsync(data);
53
+ if (!validation.success) {
54
+ throw new HttpClientError({
55
+ httpCode: 400,
56
+ message: `Validation at the [${funcName.toString()}] method fails at positional argument [${argumentIndex}].`,
57
+ data: validation.error.issues
58
+ });
59
+ }
60
+ return validation.data;
61
+ }
62
+ catch (error) {
63
+ if (error instanceof HttpClientError) {
64
+ throw error;
65
+ }
66
+ throw new HttpServerError({
67
+ httpCode: 500,
68
+ message: `Validation at the [${funcName.toString()}] method error at positional argument [${argumentIndex}].`,
69
+ data: !(error instanceof Error)
70
+ ? error
71
+ : [
72
+ {
73
+ message: error.message,
74
+ code: error.name,
75
+ cause: error.cause
76
+ }
77
+ ]
78
+ });
79
+ }
80
+ };
81
+ export const BoolFactory = (target, options) => {
82
+ if (!Reflect.getOwnMetadataKeys(target).includes(moduleKey)) {
79
83
  throw Error(`${target.name} is not a module.`);
80
84
  }
81
- const metadata = Reflect.getOwnMetadata(decorators_1.moduleKey, target);
82
- const allowOrigins = !metadata?.allowOrigins ?
83
- ["*"] : typeof metadata.allowOrigins !== "string" ?
84
- metadata.allowOrigins : [metadata.allowOrigins];
85
- const allowMethods = !metadata?.allowMethods ?
86
- ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"] : metadata.allowMethods;
87
- const app = (0, express_1.default)();
88
- const factoryOptions = Object.freeze({
85
+ const moduleMetadata = Reflect.getOwnMetadata(moduleKey, target);
86
+ const allowOrigins = !moduleMetadata?.allowOrigins
87
+ ? ["*"]
88
+ : typeof moduleMetadata.allowOrigins !== "string"
89
+ ? moduleMetadata.allowOrigins
90
+ : [moduleMetadata.allowOrigins];
91
+ const allowMethods = !moduleMetadata?.allowMethods
92
+ ? ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"]
93
+ : moduleMetadata.allowMethods;
94
+ const { allowLogsMethods } = Object.freeze({
89
95
  allowLogsMethods: !options?.log?.methods ? ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"] : options.log.methods
90
96
  });
91
- const routers = !metadata?.controllers ?
92
- [] : metadata.controllers.map(controllerConstructor => controllerCreator(controllerConstructor));
93
- app.set("etag", "strong");
94
- app.set("query parser", (query) => Qs.parse(query, {
95
- depth: !options?.queryParser?.depth || options.queryParser.depth < 0 ? 10 : options.queryParser.depth,
96
- arrayLimit: !options?.queryParser?.arrayLimit || options.queryParser.arrayLimit < 0 ? 50 : options.queryParser.arrayLimit
97
- }));
98
- app.use((0, express_1.urlencoded)({
99
- extended: true,
100
- inflate: true,
101
- limit: "1mb",
102
- parameterLimit: 20,
103
- type: "application/x-www-form-urlencoded",
104
- verify: undefined
105
- }), (0, express_1.json)({
106
- inflate: true,
107
- limit: "5mb",
108
- reviver: undefined,
109
- strict: true,
110
- type: "application/json",
111
- verify: undefined
112
- }),
113
- // Headers parser
114
- (req, res, next) => {
115
- for (const [key, value] of Object.entries(req.headers)) {
116
- req.headers[key] = typeof value !== "string" ? value : decodeURI(value);
117
- }
118
- next();
119
- },
120
- // Body parser
121
- (req, res, next) => {
122
- if (typeof req.body !== "object" || !req.body) {
123
- req.body = Object.freeze({});
124
- }
125
- next();
126
- },
127
- // Response time log
128
- ResponseTime.default((req, res, time) => {
129
- const requestMethod = req.method.toUpperCase();
130
- if (!factoryOptions.allowLogsMethods.includes(requestMethod)) {
131
- return;
132
- }
133
- const convertedMethod = `${requestMethod.yellow}`.bgBlue;
134
- const convertedPID = `${process.pid}`.yellow;
135
- const convertedReqIp = `${req.headers["x-forwarded-for"] || req.headers["x-real-ip"] || req.ip || "<Unknown>"}`.yellow;
136
- const convertedTime = `${Math.round((time + Number.EPSILON) * 10 ** 2) / 10 ** 2}ms`.yellow;
137
- console.info(`PID: ${convertedPID} - Method: ${convertedMethod} - IP: ${convertedReqIp} - ${req.originalUrl.blue} - Time: ${convertedTime}`);
138
- }));
139
- app.use((req, res, next) => {
140
- if (!allowOrigins.includes("*")) {
141
- if (!allowOrigins.includes(req.headers.origin || "*")) {
142
- return res.status(403).json({
143
- httpCode: 403,
144
- data: {
145
- origin: {
146
- code: "origin:invalid:0x00001",
147
- message: "Invalid origin."
97
+ const routerGroup = new RouterGroup();
98
+ moduleMetadata?.controllers &&
99
+ moduleMetadata.controllers.map((controllerConstructor) => controllerCreator(controllerConstructor, routerGroup));
100
+ Bun.serve({
101
+ port: options.port,
102
+ async fetch(request) {
103
+ const start = performance.now();
104
+ const url = new URL(request.url);
105
+ try {
106
+ const reqHeaders = request.headers;
107
+ const origin = reqHeaders.get("origin");
108
+ if (!allowOrigins.includes("*")) {
109
+ if (!origin) {
110
+ throw new HttpClientError({
111
+ httpCode: 403,
112
+ message: "Origin not found.",
113
+ data: {
114
+ origin: {
115
+ code: "origin:invalid:0x00001",
116
+ message: "Origin not found."
117
+ }
118
+ }
119
+ });
120
+ }
121
+ if (!allowOrigins.includes(origin)) {
122
+ throw new HttpClientError({
123
+ httpCode: 403,
124
+ message: "Invalid origin.",
125
+ data: {
126
+ origin: {
127
+ code: "origin:invalid:0x00002",
128
+ message: "Invalid origin."
129
+ }
130
+ }
131
+ });
132
+ }
133
+ }
134
+ if (!allowMethods.includes(request.method.toUpperCase())) {
135
+ throw new HttpClientError({
136
+ httpCode: 405,
137
+ message: "Method Not Allowed.",
138
+ data: undefined
139
+ });
140
+ }
141
+ const result = routerGroup.find(url.pathname, request.method);
142
+ if (!result) {
143
+ throw new HttpClientError({
144
+ httpCode: 404,
145
+ message: "Route not found.",
146
+ data: undefined
147
+ });
148
+ }
149
+ const params = result.params;
150
+ const query = Qs.parse(url.search, options.queryParser);
151
+ let responseBody = undefined;
152
+ for (let i = 0; i < result.handlers.length; i++) {
153
+ const handler = result.handlers[i];
154
+ const handlerMetadata = (Reflect.getOwnMetadata(controllerActionArgumentsKey, handler.constructor, handler.funcName) || {});
155
+ const controllerActionArguments = [];
156
+ if (handlerMetadata) {
157
+ for (const [_key, argsMetadata] of Object.entries(handlerMetadata)) {
158
+ switch (argsMetadata.type) {
159
+ case EArgumentTypes.headers:
160
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
161
+ ? reqHeaders
162
+ : await controllerActionArgumentsResolution(reqHeaders, argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
163
+ break;
164
+ case EArgumentTypes.body:
165
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
166
+ ? await request[argsMetadata.parser || "json"]()
167
+ : await controllerActionArgumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
168
+ break;
169
+ case EArgumentTypes.params:
170
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
171
+ ? params
172
+ : await controllerActionArgumentsResolution(params, argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
173
+ break;
174
+ case EArgumentTypes.query:
175
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
176
+ ? query
177
+ : await controllerActionArgumentsResolution(query, argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
178
+ break;
179
+ case EArgumentTypes.param:
180
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
181
+ ? !(argsMetadata.key in params)
182
+ ? undefined
183
+ : params[argsMetadata.key]
184
+ : await controllerActionArgumentsResolution(query, argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
185
+ break;
186
+ case EArgumentTypes.request:
187
+ controllerActionArguments[argsMetadata.index] = request;
188
+ break;
189
+ }
148
190
  }
149
191
  }
192
+ const responseData = await handler.func(...controllerActionArguments);
193
+ if (responseData instanceof Response) {
194
+ return responseData;
195
+ }
196
+ responseBody = responseData;
197
+ }
198
+ const resHeaders = new Headers({
199
+ "Access-Control-Allow-Origin": origin || "*",
200
+ "Access-Control-Allow-Headers": "*",
201
+ "Access-Control-Allow-Credentials": "true",
202
+ "Access-Control-Allow-Methods": allowMethods.join(", "),
203
+ "Content-Type": "application/json"
204
+ });
205
+ const response = new Response(JSON.stringify({
206
+ httpCode: 200,
207
+ message: "Success",
208
+ data: responseBody
209
+ }), {
210
+ status: 200,
211
+ statusText: "Success",
212
+ headers: resHeaders
150
213
  });
214
+ return response;
215
+ }
216
+ catch (error) {
217
+ return jsonErrorInfer(error);
218
+ }
219
+ finally {
220
+ const end = performance.now();
221
+ const convertedPID = `${process.pid}`.yellow;
222
+ const convertedMethod = `${request.method.yellow}`.bgBlue;
223
+ const convertedReqIp = `${request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || "<Unknown>"}`.yellow;
224
+ const convertedTime = `${Math.round((end - start + Number.EPSILON) * 10 ** 2) / 10 ** 2}ms`.yellow;
225
+ allowLogsMethods.includes(request.method.toUpperCase()) &&
226
+ console.info(`PID: ${convertedPID} - Method: ${convertedMethod} - IP: ${convertedReqIp} - ${url.pathname.blue} - Time: ${convertedTime}`);
151
227
  }
152
228
  }
153
- res.header("Access-Control-Allow-Origin", req.headers.origin || "*");
154
- res.header("Access-Control-Allow-Headers", "*");
155
- res.header("Access-Control-Allow-Credentials", "true");
156
- res.header("Access-Control-Allow-Methods", allowMethods.join(", "));
157
- next();
158
- });
159
- if (routers.length > 0) {
160
- !metadata?.prefix ?
161
- app.use(routers) : app.use(!metadata.prefix.startsWith("/") ?
162
- `/${metadata.prefix}` : metadata.prefix, routers);
163
- }
164
- // Register error catcher
165
- app.use(
166
- // Error catcher
167
- (err, req, res, next) => {
168
- (0, http_1.errorInfer)(res, err);
169
- if (!options?.debug) {
170
- return;
171
- }
172
- console.info("Headers:", JSON.stringify(req.headers, null, 4), "\nBody:", JSON.stringify(req.body, null, 4));
173
- console.error("Error:");
174
- console.error(err);
175
229
  });
176
- return app;
177
230
  };
178
- exports.BoolFactory = BoolFactory;
179
- exports.default = exports.BoolFactory;
231
+ export default BoolFactory;
@@ -1,7 +1,2 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Injector = exports.BoolFactory = void 0;
4
- var factory_1 = require("./factory");
5
- Object.defineProperty(exports, "BoolFactory", { enumerable: true, get: function () { return factory_1.BoolFactory; } });
6
- var injector_1 = require("./injector");
7
- Object.defineProperty(exports, "Injector", { enumerable: true, get: function () { return injector_1.Injector; } });
1
+ export { BoolFactory } from "./factory";
2
+ export { Injector } from "./injector";
@@ -1,9 +1,6 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Injector = void 0;
4
- require("reflect-metadata");
5
- const decorators_1 = require("../decorators");
6
- exports.Injector = new class {
1
+ import "reflect-metadata";
2
+ import { injectableKey, injectKey } from "../decorators";
3
+ export const Injector = new class {
7
4
  _mapper = new Map();
8
5
  /**
9
6
  *
@@ -14,15 +11,15 @@ exports.Injector = new class {
14
11
  return this._mapper.get(classDefinition);
15
12
  }
16
13
  const ownMetadataKeys = Reflect.getMetadataKeys(classDefinition);
17
- if (!ownMetadataKeys.includes(decorators_1.injectableKey)) {
14
+ if (!ownMetadataKeys.includes(injectableKey)) {
18
15
  throw Error("Missing dependency declaration, please check @Injectable() used on dependency(ies).");
19
16
  }
20
17
  // Initialize dependencies injection
21
- const dependencies = Reflect.getOwnMetadata(decorators_1.injectKey, classDefinition) || [];
22
- const injections = dependencies.map(dependency => exports.Injector.get(dependency));
18
+ const dependencies = Reflect.getOwnMetadata(injectKey, classDefinition) || [];
19
+ const injections = dependencies.map(dependency => Injector.get(dependency));
23
20
  const instance = new classDefinition(...injections);
24
21
  this._mapper.set(classDefinition, instance);
25
22
  return instance;
26
23
  }
27
24
  };
28
- exports.default = exports.Injector;
25
+ export default Injector;
@@ -31,7 +31,7 @@ export declare const httpClientErrors: Readonly<{
31
31
  }>;
32
32
  export declare class HttpClientError<T extends keyof typeof httpClientErrors = keyof typeof httpClientErrors, K = any> extends Error {
33
33
  readonly httpCode: T;
34
- readonly message: typeof httpClientErrors[T] | string;
34
+ readonly message: (typeof httpClientErrors)[T] | string;
35
35
  readonly data: K;
36
36
  constructor({ httpCode, data, message }: {
37
37
  httpCode: T;
@@ -1,7 +1,4 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.HttpClientError = exports.httpClientErrors = void 0;
4
- exports.httpClientErrors = Object.freeze({
1
+ export const httpClientErrors = Object.freeze({
5
2
  400: "BAD_REQUEST",
6
3
  401: "UNAUTHORIZED",
7
4
  402: "PAYMENT_REQUIRED",
@@ -32,15 +29,14 @@ exports.httpClientErrors = Object.freeze({
32
29
  431: "REQUEST_HEADER_FIELDS_TOO_LARGE",
33
30
  451: "UNAVAILABLE_FOR_LEGAL_REASONS"
34
31
  });
35
- class HttpClientError extends Error {
32
+ export class HttpClientError extends Error {
36
33
  httpCode;
37
34
  message;
38
35
  data;
39
36
  constructor({ httpCode, data, message }) {
40
37
  super();
41
38
  this.httpCode = httpCode;
42
- this.message = !message?.trim() ? exports.httpClientErrors[httpCode] : message.trim();
39
+ this.message = !message?.trim() ? httpClientErrors[httpCode] : message.trim();
43
40
  this.data = data;
44
41
  }
45
42
  }
46
- exports.HttpClientError = HttpClientError;
@@ -1,4 +1,14 @@
1
- import { Response } from "express";
2
- export declare const errorInfer: (res: Response, data: any) => void;
1
+ export type THttpMethods = {
2
+ GET: "GET";
3
+ HEAD: "HEAD";
4
+ POST: "POST";
5
+ PUT: "PUT";
6
+ DELETE: "DELETE";
7
+ CONNECT: "CONNECT";
8
+ OPTIONS: "OPTIONS";
9
+ TRACE: "TRACE";
10
+ PATCH: "PATCH";
11
+ };
12
+ export declare const jsonErrorInfer: (data: any) => import("undici-types").Response;
3
13
  export * from "./clientError";
4
14
  export * from "./serverError";