@bool-ts/core 1.6.10 → 1.6.11

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.
@@ -1,5 +1,5 @@
1
1
  import * as Zod from "zod";
2
- import { bodyArgsKey, contextArgsKey, paramArgsKey, paramsArgsKey, queryArgsKey, requestArgsKey, requestHeaderArgsKey, requestHeadersArgsKey, responseHeadersArgsKey } from "../keys";
2
+ import { bodyArgsKey, contextArgsKey, paramArgsKey, paramsArgsKey, queryArgsKey, requestArgsKey, requestHeaderArgsKey, requestHeadersArgsKey, responseHeadersArgsKey, routeModelArgsKey } from "../keys";
3
3
  export type TArgumentsMetadata = {
4
4
  index: number;
5
5
  type: typeof requestHeadersArgsKey;
@@ -38,6 +38,9 @@ export type TArgumentsMetadata = {
38
38
  index: number;
39
39
  type: typeof contextArgsKey;
40
40
  key?: symbol;
41
+ } | {
42
+ index: number;
43
+ type: typeof routeModelArgsKey;
41
44
  };
42
45
  export declare const RequestHeaders: (schema?: Zod.Schema) => (target: Object, methodName: string | symbol | undefined, parameterIndex: number) => void;
43
46
  export declare const RequestHeader: (key: string, schema?: Zod.Schema) => (target: Object, methodName: string | symbol | undefined, parameterIndex: number) => void;
@@ -48,3 +51,4 @@ export declare const Query: (schema?: Zod.Schema) => (target: Object, methodName
48
51
  export declare const Request: (schema?: Zod.Schema) => (target: Object, methodName: string | symbol | undefined, parameterIndex: number) => void;
49
52
  export declare const ResponseHeaders: () => (target: Object, methodName: string | symbol | undefined, parameterIndex: number) => void;
50
53
  export declare const Context: (key?: symbol) => (target: Object, methodName: string | symbol | undefined, parameterIndex: number) => void;
54
+ export declare const RouteModel: () => (target: Object, methodName: string | symbol | undefined, parameterIndex: number) => void;
@@ -1,5 +1,5 @@
1
1
  import * as Zod from "zod";
2
- import { argumentsKey, bodyArgsKey, contextArgsKey, paramArgsKey, paramsArgsKey, queryArgsKey, requestArgsKey, requestHeaderArgsKey, requestHeadersArgsKey, responseHeadersArgsKey } from "../keys";
2
+ import { argumentsKey, bodyArgsKey, contextArgsKey, paramArgsKey, paramsArgsKey, queryArgsKey, requestArgsKey, requestHeaderArgsKey, requestHeadersArgsKey, responseHeadersArgsKey, routeModelArgsKey } from "../keys";
3
3
  export const RequestHeaders = (schema) => (target, methodName, parameterIndex) => {
4
4
  if (!methodName) {
5
5
  return;
@@ -110,3 +110,14 @@ export const Context = (key) => (target, methodName, parameterIndex) => {
110
110
  };
111
111
  Reflect.defineMetadata(argumentsKey, responseHeadersMetadata, target.constructor, methodName);
112
112
  };
113
+ export const RouteModel = () => (target, methodName, parameterIndex) => {
114
+ if (!methodName) {
115
+ return;
116
+ }
117
+ const responseHeadersMetadata = Reflect.getOwnMetadata(argumentsKey, target.constructor, methodName) || {};
118
+ responseHeadersMetadata[`argumentIndexes.${parameterIndex}`] = {
119
+ index: parameterIndex,
120
+ type: routeModelArgsKey
121
+ };
122
+ Reflect.defineMetadata(argumentsKey, responseHeadersMetadata, target.constructor, methodName);
123
+ };
@@ -1,3 +1,4 @@
1
+ export type { TRouteModel } from "./route";
1
2
  export { Route } from "./route";
2
3
  export { Router } from "./router";
3
4
  export { RouterGroup } from "./routerGroup";
@@ -1,17 +1,17 @@
1
1
  import type { THttpMethods } from "../http";
2
- type THandler<T = unknown> = Required<{
2
+ export type TRouteModel<T = unknown> = Readonly<Required<{
3
3
  class: new (...args: Array<any>) => T;
4
4
  funcName: string | symbol;
5
5
  func: (...args: Array<any>) => unknown;
6
- }>;
6
+ }>>;
7
7
  export declare class Route {
8
8
  static rootPattern: string;
9
9
  readonly alias: string;
10
10
  private _map;
11
11
  constructor(alias: string);
12
12
  test(pathname: string, method: keyof THttpMethods): Readonly<{
13
- params: Record<string, string>;
14
- handlers: Array<THandler>;
13
+ parameters: Record<string, string>;
14
+ model: TRouteModel;
15
15
  }> | false | undefined;
16
16
  /**
17
17
  *
@@ -22,65 +22,65 @@ export declare class Route {
22
22
  * @param handlers
23
23
  * @returns
24
24
  */
25
- get(...handlers: Array<THandler>): this;
25
+ get(handler: TRouteModel): this;
26
26
  /**
27
27
  *
28
28
  * @param handlers
29
29
  * @returns
30
30
  */
31
- post(...handlers: Array<THandler>): this;
31
+ post(handler: TRouteModel): this;
32
32
  /**
33
33
  *
34
34
  * @param handlers
35
35
  * @returns
36
36
  */
37
- put(...handlers: Array<THandler>): this;
37
+ put(handler: TRouteModel): this;
38
38
  /**
39
39
  *
40
40
  * @param handlers
41
41
  * @returns
42
42
  */
43
- delete(...handlers: Array<THandler>): this;
43
+ delete(handler: TRouteModel): this;
44
44
  /**
45
45
  *
46
46
  * @param handlers
47
47
  * @returns
48
48
  */
49
- connect(...handlers: Array<THandler>): this | Map<keyof THttpMethods, Required<{
49
+ connect(handler: TRouteModel): this | Map<keyof THttpMethods, Readonly<Required<{
50
50
  class: new (...args: Array<any>) => unknown;
51
51
  funcName: string | symbol;
52
52
  func: (...args: Array<any>) => unknown;
53
- }>[]>;
53
+ }>>>;
54
54
  /**
55
55
  *
56
56
  * @param handlers
57
57
  * @returns
58
58
  */
59
- options(...handlers: Array<THandler>): this | Map<keyof THttpMethods, Required<{
59
+ options(handler: TRouteModel): this | Map<keyof THttpMethods, Readonly<Required<{
60
60
  class: new (...args: Array<any>) => unknown;
61
61
  funcName: string | symbol;
62
62
  func: (...args: Array<any>) => unknown;
63
- }>[]>;
63
+ }>>>;
64
64
  /**
65
65
  *
66
66
  * @param handlers
67
67
  * @returns
68
68
  */
69
- trace(...handlers: Array<THandler>): this | Map<keyof THttpMethods, Required<{
69
+ trace(handler: TRouteModel): this | Map<keyof THttpMethods, Readonly<Required<{
70
70
  class: new (...args: Array<any>) => unknown;
71
71
  funcName: string | symbol;
72
72
  func: (...args: Array<any>) => unknown;
73
- }>[]>;
73
+ }>>>;
74
74
  /**
75
75
  *
76
76
  * @param handlers
77
77
  * @returns
78
78
  */
79
- patch(...handlers: Array<THandler>): this | Map<keyof THttpMethods, Required<{
79
+ patch(handler: TRouteModel): this | Map<keyof THttpMethods, Readonly<Required<{
80
80
  class: new (...args: Array<any>) => unknown;
81
81
  funcName: string | symbol;
82
82
  func: (...args: Array<any>) => unknown;
83
- }>[]>;
83
+ }>>>;
84
84
  /**
85
85
  *
86
86
  * @param handlers
@@ -8,10 +8,10 @@ export class Route {
8
8
  }
9
9
  test(pathname, method) {
10
10
  try {
11
- const handlers = this._map.get(method);
11
+ const model = this._map.get(method);
12
12
  const aliasSplitted = this.alias.split("/");
13
13
  const currentPathNameSplitted = this._thinAlias(pathname).split("/");
14
- if (!handlers) {
14
+ if (!model) {
15
15
  return undefined;
16
16
  }
17
17
  // Compare splitted length
@@ -44,8 +44,8 @@ export class Route {
44
44
  continue;
45
45
  }
46
46
  return Object.freeze({
47
- params: parameters,
48
- handlers: handlers
47
+ parameters: parameters,
48
+ model: model
49
49
  });
50
50
  }
51
51
  catch (err) {
@@ -109,10 +109,10 @@ export class Route {
109
109
  * @param handlers
110
110
  * @returns
111
111
  */
112
- get(...handlers) {
113
- const currentHandlers = this._map.get("GET");
114
- if (!currentHandlers) {
115
- this._map.set("GET", handlers);
112
+ get(handler) {
113
+ const currenTRouteModel = this._map.get("GET");
114
+ if (!currenTRouteModel) {
115
+ this._map.set("GET", handler);
116
116
  }
117
117
  return this;
118
118
  }
@@ -121,10 +121,10 @@ export class Route {
121
121
  * @param handlers
122
122
  * @returns
123
123
  */
124
- post(...handlers) {
125
- const currentHandlers = this._map.get("POST");
126
- if (!currentHandlers) {
127
- this._map.set("POST", handlers);
124
+ post(handler) {
125
+ const currenTRouteModel = this._map.get("POST");
126
+ if (!currenTRouteModel) {
127
+ this._map.set("POST", handler);
128
128
  }
129
129
  return this;
130
130
  }
@@ -133,10 +133,10 @@ export class Route {
133
133
  * @param handlers
134
134
  * @returns
135
135
  */
136
- put(...handlers) {
137
- const currentHandlers = this._map.get("PUT");
138
- if (!currentHandlers) {
139
- this._map.set("PUT", handlers);
136
+ put(handler) {
137
+ const currenTRouteModel = this._map.get("PUT");
138
+ if (!currenTRouteModel) {
139
+ this._map.set("PUT", handler);
140
140
  }
141
141
  return this;
142
142
  }
@@ -145,10 +145,10 @@ export class Route {
145
145
  * @param handlers
146
146
  * @returns
147
147
  */
148
- delete(...handlers) {
149
- const currentHandlers = this._map.get("DELETE");
150
- if (!currentHandlers) {
151
- this._map.set("DELETE", handlers);
148
+ delete(handler) {
149
+ const currenTRouteModel = this._map.get("DELETE");
150
+ if (!currenTRouteModel) {
151
+ this._map.set("DELETE", handler);
152
152
  }
153
153
  return this;
154
154
  }
@@ -157,10 +157,10 @@ export class Route {
157
157
  * @param handlers
158
158
  * @returns
159
159
  */
160
- connect(...handlers) {
161
- const currentHandlers = this._map.get("CONNECT");
162
- if (!currentHandlers) {
163
- return this._map.set("CONNECT", handlers);
160
+ connect(handler) {
161
+ const currenTRouteModel = this._map.get("CONNECT");
162
+ if (!currenTRouteModel) {
163
+ return this._map.set("CONNECT", handler);
164
164
  }
165
165
  return this;
166
166
  }
@@ -169,10 +169,10 @@ export class Route {
169
169
  * @param handlers
170
170
  * @returns
171
171
  */
172
- options(...handlers) {
173
- const currentHandlers = this._map.get("OPTIONS");
174
- if (!currentHandlers) {
175
- return this._map.set("OPTIONS", handlers);
172
+ options(handler) {
173
+ const currenTRouteModel = this._map.get("OPTIONS");
174
+ if (!currenTRouteModel) {
175
+ return this._map.set("OPTIONS", handler);
176
176
  }
177
177
  return this;
178
178
  }
@@ -181,10 +181,10 @@ export class Route {
181
181
  * @param handlers
182
182
  * @returns
183
183
  */
184
- trace(...handlers) {
185
- const currentHandlers = this._map.get("TRACE");
186
- if (!currentHandlers) {
187
- return this._map.set("TRACE", handlers);
184
+ trace(handler) {
185
+ const currenTRouteModel = this._map.get("TRACE");
186
+ if (!currenTRouteModel) {
187
+ return this._map.set("TRACE", handler);
188
188
  }
189
189
  return this;
190
190
  }
@@ -193,10 +193,10 @@ export class Route {
193
193
  * @param handlers
194
194
  * @returns
195
195
  */
196
- patch(...handlers) {
197
- const currentHandlers = this._map.get("PATCH");
198
- if (!currentHandlers) {
199
- return this._map.set("PATCH", handlers);
196
+ patch(handler) {
197
+ const currenTRouteModel = this._map.get("PATCH");
198
+ if (!currenTRouteModel) {
199
+ return this._map.set("PATCH", handler);
200
200
  }
201
201
  return this;
202
202
  }
@@ -4,11 +4,7 @@ export declare class RouterGroup {
4
4
  private _routers;
5
5
  add(...routers: Array<Router>): this;
6
6
  find(pathame: string, method: keyof THttpMethods): Readonly<{
7
- params: Record<string, string>;
8
- handlers: Array<Required<{
9
- class: new (...args: Array<any>) => unknown;
10
- funcName: string | symbol;
11
- func: (...args: Array<any>) => unknown;
12
- }>>;
7
+ parameters: Record<string, string>;
8
+ model: import("./route").TRouteModel;
13
9
  }> | undefined;
14
10
  }
@@ -4,7 +4,7 @@ import Qs from "qs";
4
4
  import * as Zod from "zod";
5
5
  import { Router, RouterGroup } from "../entities";
6
6
  import { HttpClientError, HttpServerError, jsonErrorInfer } from "../http";
7
- import { argumentsKey, bodyArgsKey, configKey, contextArgsKey, controllerHttpKey, controllerKey, moduleKey, paramArgsKey, paramsArgsKey, queryArgsKey, requestArgsKey, requestHeaderArgsKey, requestHeadersArgsKey, responseHeadersArgsKey } from "../keys";
7
+ import { argumentsKey, bodyArgsKey, configKey, contextArgsKey, controllerHttpKey, controllerKey, moduleKey, paramArgsKey, paramsArgsKey, queryArgsKey, requestArgsKey, requestHeaderArgsKey, requestHeadersArgsKey, responseHeadersArgsKey, routeModelArgsKey } from "../keys";
8
8
  import { Injector } from "./injector";
9
9
  export const controllerCreator = (controllerConstructor, group, prefix) => {
10
10
  if (!Reflect.getOwnMetadataKeys(controllerConstructor).includes(controllerKey)) {
@@ -26,11 +26,11 @@ export const controllerCreator = (controllerConstructor, group, prefix) => {
26
26
  }
27
27
  const route = router.route(routeMetadata.path);
28
28
  const handler = routeMetadata.descriptor.value.bind(controller);
29
- const routeArgument = {
29
+ const routeArgument = Object.freeze({
30
30
  class: controllerConstructor,
31
31
  funcName: routeMetadata.methodName,
32
32
  func: handler
33
- };
33
+ });
34
34
  switch (routeMetadata.httpMethod) {
35
35
  case "GET":
36
36
  return route.get(routeArgument);
@@ -238,6 +238,8 @@ export const BoolFactory = async (target, options) => {
238
238
  ? headers.get(argsMetadata.key) || undefined
239
239
  : await argumentsResolution(headers.get(argsMetadata.key) || undefined, argsMetadata.zodSchema, argsMetadata.index, middlewareCollection.funcName);
240
240
  break;
241
+ case routeModelArgsKey:
242
+ break;
241
243
  default:
242
244
  middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
243
245
  ? !(argsMetadata.type in context)
@@ -290,6 +292,8 @@ export const BoolFactory = async (target, options) => {
290
292
  ? headers.get(argsMetadata.key) || undefined
291
293
  : await argumentsResolution(headers.get(argsMetadata.key) || undefined, argsMetadata.zodSchema, argsMetadata.index, guardCollection.funcName);
292
294
  break;
295
+ case routeModelArgsKey:
296
+ break;
293
297
  default:
294
298
  guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
295
299
  ? context[argsMetadata.type]
@@ -315,7 +319,8 @@ export const BoolFactory = async (target, options) => {
315
319
  data: undefined
316
320
  });
317
321
  }
318
- context[paramsArgsKey] = result.params;
322
+ context[paramsArgsKey] = result.parameters;
323
+ context[routeModelArgsKey] = result;
319
324
  let responseBody = undefined;
320
325
  // Execute before dispatcher(s)
321
326
  for (let i = 0; i < beforeDispatcherGroup.length; i++) {
@@ -358,6 +363,9 @@ export const BoolFactory = async (target, options) => {
358
363
  ? context[paramArgsKey][argsMetadata.key] || undefined
359
364
  : await argumentsResolution(context[paramArgsKey][argsMetadata.key], argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
360
365
  break;
366
+ case routeModelArgsKey:
367
+ beforeDispatcherArguments[argsMetadata.index] = context[routeModelArgsKey];
368
+ break;
361
369
  default:
362
370
  beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
363
371
  ? context[argsMetadata.type]
@@ -369,56 +377,57 @@ export const BoolFactory = async (target, options) => {
369
377
  await beforeDispatcherCollection.func(...beforeDispatcherArguments);
370
378
  }
371
379
  // Execute controller action
372
- for (let i = 0; i < result.handlers.length; i++) {
373
- const controllerActionArguments = [];
374
- const controllerActionCollection = result.handlers[i];
375
- const handlerMetadata = Reflect.getOwnMetadata(argumentsKey, controllerActionCollection.class, controllerActionCollection.funcName) || {};
376
- if (handlerMetadata) {
377
- for (const [_key, argsMetadata] of Object.entries(handlerMetadata)) {
378
- switch (argsMetadata.type) {
379
- case requestArgsKey:
380
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
381
- ? request
382
- : await argumentsResolution(request, argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
383
- break;
384
- case bodyArgsKey:
385
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
386
- ? await request[argsMetadata.parser || "json"]()
387
- : await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
388
- break;
389
- case contextArgsKey:
390
- controllerActionArguments[argsMetadata.index] = !argsMetadata.key
391
- ? contextHook
392
- : contextHook.get(argsMetadata.key);
393
- break;
394
- case requestHeadersArgsKey:
395
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
396
- ? headers
397
- : await argumentsResolution(headers.toJSON(), argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
398
- break;
399
- case responseHeadersArgsKey:
400
- controllerActionArguments[argsMetadata.index] = context[argsMetadata.type];
401
- break;
402
- case requestHeaderArgsKey:
403
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
404
- ? headers.get(argsMetadata.key) || undefined
405
- : await argumentsResolution(headers.get(argsMetadata.key) || undefined, argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
406
- break;
407
- case paramArgsKey:
408
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
409
- ? context[paramArgsKey][argsMetadata.key] || undefined
410
- : await argumentsResolution(context[paramArgsKey][argsMetadata.key], argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
411
- break;
412
- default:
413
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
414
- ? context[argsMetadata.type]
415
- : await argumentsResolution(context[argsMetadata.type], argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
416
- break;
417
- }
380
+ const controllerActionArguments = [];
381
+ const controllerActionCollection = result.model;
382
+ const controllerActionMetadata = Reflect.getOwnMetadata(argumentsKey, controllerActionCollection.class, controllerActionCollection.funcName) || {};
383
+ if (controllerActionMetadata) {
384
+ for (const [_key, argsMetadata] of Object.entries(controllerActionMetadata)) {
385
+ switch (argsMetadata.type) {
386
+ case requestArgsKey:
387
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
388
+ ? request
389
+ : await argumentsResolution(request, argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
390
+ break;
391
+ case bodyArgsKey:
392
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
393
+ ? await request[argsMetadata.parser || "json"]()
394
+ : await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
395
+ break;
396
+ case contextArgsKey:
397
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.key
398
+ ? contextHook
399
+ : contextHook.get(argsMetadata.key);
400
+ break;
401
+ case requestHeadersArgsKey:
402
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
403
+ ? headers
404
+ : await argumentsResolution(headers.toJSON(), argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
405
+ break;
406
+ case responseHeadersArgsKey:
407
+ controllerActionArguments[argsMetadata.index] = context[argsMetadata.type];
408
+ break;
409
+ case requestHeaderArgsKey:
410
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
411
+ ? headers.get(argsMetadata.key) || undefined
412
+ : await argumentsResolution(headers.get(argsMetadata.key) || undefined, argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
413
+ break;
414
+ case paramArgsKey:
415
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
416
+ ? context[paramArgsKey][argsMetadata.key] || undefined
417
+ : await argumentsResolution(context[paramArgsKey][argsMetadata.key], argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
418
+ break;
419
+ case routeModelArgsKey:
420
+ controllerActionArguments[argsMetadata.index] = context[routeModelArgsKey];
421
+ break;
422
+ default:
423
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
424
+ ? context[argsMetadata.type]
425
+ : await argumentsResolution(context[argsMetadata.type], argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
426
+ break;
418
427
  }
419
428
  }
420
- responseBody = await controllerActionCollection.func(...controllerActionArguments);
421
429
  }
430
+ responseBody = await controllerActionCollection.func(...controllerActionArguments);
422
431
  // Execute after dispatcher(s)
423
432
  for (let i = 0; i < afterDispatcherGroup.length; i++) {
424
433
  const afterDispatcherArguments = [];
@@ -460,6 +469,9 @@ export const BoolFactory = async (target, options) => {
460
469
  ? context[paramArgsKey][argsMetadata.key] || undefined
461
470
  : await argumentsResolution(context[paramArgsKey][argsMetadata.key], argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
462
471
  break;
472
+ case routeModelArgsKey:
473
+ afterDispatcherArguments[argsMetadata.index] = context[routeModelArgsKey];
474
+ break;
463
475
  default:
464
476
  afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
465
477
  ? context[argsMetadata.type]
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import "reflect-metadata";
2
- export * as Keys from "./keys";
3
- export * from "./interfaces";
4
- export * from "./hooks";
2
+ export type { TRouteModel } from "./entities";
5
3
  export * from "./decorators";
4
+ export * from "./hooks";
6
5
  export * from "./http";
6
+ export * from "./interfaces";
7
+ export * as Keys from "./keys";
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import "reflect-metadata";
2
- export * as Keys from "./keys";
3
- export * from "./interfaces";
4
- export * from "./hooks";
5
2
  export * from "./decorators";
3
+ export * from "./hooks";
6
4
  export * from "./http";
5
+ export * from "./interfaces";
6
+ export * as Keys from "./keys";
@@ -18,3 +18,4 @@ export declare const queryArgsKey: unique symbol;
18
18
  export declare const requestArgsKey: unique symbol;
19
19
  export declare const responseHeadersArgsKey: unique symbol;
20
20
  export declare const contextArgsKey: unique symbol;
21
+ export declare const routeModelArgsKey: unique symbol;
@@ -18,3 +18,4 @@ export const queryArgsKey = Symbol("__bool:arguments:query__");
18
18
  export const requestArgsKey = Symbol("__bool:arguments:request__");
19
19
  export const responseHeadersArgsKey = Symbol("__bool:arguments:responseHeaders__");
20
20
  export const contextArgsKey = Symbol("__bool:arguments:context__");
21
+ export const routeModelArgsKey = Symbol("__bool:arguments:routeModel__");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bool-ts/core",
3
- "version": "1.6.10",
3
+ "version": "1.6.11",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -9,7 +9,8 @@ import {
9
9
  requestArgsKey,
10
10
  requestHeaderArgsKey,
11
11
  requestHeadersArgsKey,
12
- responseHeadersArgsKey
12
+ responseHeadersArgsKey,
13
+ routeModelArgsKey
13
14
  } from "../keys";
14
15
 
15
16
  export type TArgumentsMetadata =
@@ -59,6 +60,10 @@ export type TArgumentsMetadata =
59
60
  index: number;
60
61
  type: typeof contextArgsKey;
61
62
  key?: symbol;
63
+ }
64
+ | {
65
+ index: number;
66
+ type: typeof routeModelArgsKey;
62
67
  };
63
68
 
64
69
  export const RequestHeaders =
@@ -259,3 +264,23 @@ export const Context = (key?: symbol) => (target: Object, methodName: string | s
259
264
 
260
265
  Reflect.defineMetadata(argumentsKey, responseHeadersMetadata, target.constructor, methodName);
261
266
  };
267
+
268
+ export const RouteModel = () => (target: Object, methodName: string | symbol | undefined, parameterIndex: number) => {
269
+ if (!methodName) {
270
+ return;
271
+ }
272
+
273
+ const responseHeadersMetadata = Reflect.getOwnMetadata(argumentsKey, target.constructor, methodName) || {};
274
+
275
+ responseHeadersMetadata[`argumentIndexes.${parameterIndex}`] = {
276
+ index: parameterIndex,
277
+ type: routeModelArgsKey
278
+ } satisfies Extract<
279
+ TArgumentsMetadata,
280
+ {
281
+ type: typeof routeModelArgsKey;
282
+ }
283
+ >;
284
+
285
+ Reflect.defineMetadata(argumentsKey, responseHeadersMetadata, target.constructor, methodName);
286
+ };
@@ -1,3 +1,5 @@
1
+ export type { TRouteModel } from "./route";
2
+
1
3
  export { Route } from "./route";
2
4
  export { Router } from "./router";
3
5
  export { RouterGroup } from "./routerGroup";
@@ -2,18 +2,20 @@
2
2
 
3
3
  import type { THttpMethods } from "../http";
4
4
 
5
- type THandler<T = unknown> = Required<{
6
- class: new (...args: Array<any>) => T;
7
- funcName: string | symbol;
8
- func: (...args: Array<any>) => unknown;
9
- }>;
5
+ export type TRouteModel<T = unknown> = Readonly<
6
+ Required<{
7
+ class: new (...args: Array<any>) => T;
8
+ funcName: string | symbol;
9
+ func: (...args: Array<any>) => unknown;
10
+ }>
11
+ >;
10
12
 
11
13
  export class Route {
12
14
  public static rootPattern = ":([a-z0-9A-Z_.-]{1,})";
13
15
 
14
16
  public readonly alias: string;
15
17
 
16
- private _map = new Map<keyof THttpMethods, Array<THandler>>();
18
+ private _map = new Map<keyof THttpMethods, TRouteModel>();
17
19
 
18
20
  constructor(alias: string) {
19
21
  this.alias = this._thinAlias(alias);
@@ -22,13 +24,13 @@ export class Route {
22
24
  public test(
23
25
  pathname: string,
24
26
  method: keyof THttpMethods
25
- ): Readonly<{ params: Record<string, string>; handlers: Array<THandler> }> | false | undefined {
27
+ ): Readonly<{ parameters: Record<string, string>; model: TRouteModel }> | false | undefined {
26
28
  try {
27
- const handlers = this._map.get(method);
29
+ const model = this._map.get(method);
28
30
  const aliasSplitted = this.alias.split("/");
29
31
  const currentPathNameSplitted = this._thinAlias(pathname).split("/");
30
32
 
31
- if (!handlers) {
33
+ if (!model) {
32
34
  return undefined;
33
35
  }
34
36
 
@@ -68,8 +70,8 @@ export class Route {
68
70
  }
69
71
 
70
72
  return Object.freeze({
71
- params: parameters,
72
- handlers: handlers
73
+ parameters: parameters,
74
+ model: model
73
75
  });
74
76
  } catch (err) {
75
77
  console.error(err);
@@ -141,11 +143,11 @@ export class Route {
141
143
  * @param handlers
142
144
  * @returns
143
145
  */
144
- public get(...handlers: Array<THandler>) {
145
- const currentHandlers = this._map.get("GET");
146
+ public get(handler: TRouteModel) {
147
+ const currenTRouteModel = this._map.get("GET");
146
148
 
147
- if (!currentHandlers) {
148
- this._map.set("GET", handlers);
149
+ if (!currenTRouteModel) {
150
+ this._map.set("GET", handler);
149
151
  }
150
152
 
151
153
  return this;
@@ -156,11 +158,11 @@ export class Route {
156
158
  * @param handlers
157
159
  * @returns
158
160
  */
159
- public post(...handlers: Array<THandler>) {
160
- const currentHandlers = this._map.get("POST");
161
+ public post(handler: TRouteModel) {
162
+ const currenTRouteModel = this._map.get("POST");
161
163
 
162
- if (!currentHandlers) {
163
- this._map.set("POST", handlers);
164
+ if (!currenTRouteModel) {
165
+ this._map.set("POST", handler);
164
166
  }
165
167
 
166
168
  return this;
@@ -171,11 +173,11 @@ export class Route {
171
173
  * @param handlers
172
174
  * @returns
173
175
  */
174
- public put(...handlers: Array<THandler>) {
175
- const currentHandlers = this._map.get("PUT");
176
+ public put(handler: TRouteModel) {
177
+ const currenTRouteModel = this._map.get("PUT");
176
178
 
177
- if (!currentHandlers) {
178
- this._map.set("PUT", handlers);
179
+ if (!currenTRouteModel) {
180
+ this._map.set("PUT", handler);
179
181
  }
180
182
 
181
183
  return this;
@@ -186,11 +188,11 @@ export class Route {
186
188
  * @param handlers
187
189
  * @returns
188
190
  */
189
- public delete(...handlers: Array<THandler>) {
190
- const currentHandlers = this._map.get("DELETE");
191
+ public delete(handler: TRouteModel) {
192
+ const currenTRouteModel = this._map.get("DELETE");
191
193
 
192
- if (!currentHandlers) {
193
- this._map.set("DELETE", handlers);
194
+ if (!currenTRouteModel) {
195
+ this._map.set("DELETE", handler);
194
196
  }
195
197
 
196
198
  return this;
@@ -201,11 +203,11 @@ export class Route {
201
203
  * @param handlers
202
204
  * @returns
203
205
  */
204
- public connect(...handlers: Array<THandler>) {
205
- const currentHandlers = this._map.get("CONNECT");
206
+ public connect(handler: TRouteModel) {
207
+ const currenTRouteModel = this._map.get("CONNECT");
206
208
 
207
- if (!currentHandlers) {
208
- return this._map.set("CONNECT", handlers);
209
+ if (!currenTRouteModel) {
210
+ return this._map.set("CONNECT", handler);
209
211
  }
210
212
 
211
213
  return this;
@@ -216,11 +218,11 @@ export class Route {
216
218
  * @param handlers
217
219
  * @returns
218
220
  */
219
- public options(...handlers: Array<THandler>) {
220
- const currentHandlers = this._map.get("OPTIONS");
221
+ public options(handler: TRouteModel) {
222
+ const currenTRouteModel = this._map.get("OPTIONS");
221
223
 
222
- if (!currentHandlers) {
223
- return this._map.set("OPTIONS", handlers);
224
+ if (!currenTRouteModel) {
225
+ return this._map.set("OPTIONS", handler);
224
226
  }
225
227
 
226
228
  return this;
@@ -231,11 +233,11 @@ export class Route {
231
233
  * @param handlers
232
234
  * @returns
233
235
  */
234
- public trace(...handlers: Array<THandler>) {
235
- const currentHandlers = this._map.get("TRACE");
236
+ public trace(handler: TRouteModel) {
237
+ const currenTRouteModel = this._map.get("TRACE");
236
238
 
237
- if (!currentHandlers) {
238
- return this._map.set("TRACE", handlers);
239
+ if (!currenTRouteModel) {
240
+ return this._map.set("TRACE", handler);
239
241
  }
240
242
 
241
243
  return this;
@@ -246,11 +248,11 @@ export class Route {
246
248
  * @param handlers
247
249
  * @returns
248
250
  */
249
- public patch(...handlers: Array<THandler>) {
250
- const currentHandlers = this._map.get("PATCH");
251
+ public patch(handler: TRouteModel) {
252
+ const currenTRouteModel = this._map.get("PATCH");
251
253
 
252
- if (!currentHandlers) {
253
- return this._map.set("PATCH", handlers);
254
+ if (!currenTRouteModel) {
255
+ return this._map.set("PATCH", handler);
254
256
  }
255
257
 
256
258
  return this;
@@ -24,7 +24,8 @@ import {
24
24
  requestArgsKey,
25
25
  requestHeaderArgsKey,
26
26
  requestHeadersArgsKey,
27
- responseHeadersArgsKey
27
+ responseHeadersArgsKey,
28
+ routeModelArgsKey
28
29
  } from "../keys";
29
30
  import { Injector } from "./injector";
30
31
 
@@ -70,11 +71,11 @@ export const controllerCreator = (
70
71
 
71
72
  const route = router.route(routeMetadata.path);
72
73
  const handler = routeMetadata.descriptor.value.bind(controller);
73
- const routeArgument = {
74
+ const routeArgument = Object.freeze({
74
75
  class: controllerConstructor,
75
76
  funcName: routeMetadata.methodName,
76
77
  func: handler
77
- };
78
+ });
78
79
 
79
80
  switch (routeMetadata.httpMethod) {
80
81
  case "GET":
@@ -351,6 +352,8 @@ export const BoolFactory = async (target: new (...args: any[]) => unknown, optio
351
352
  middlewareCollection.funcName
352
353
  );
353
354
  break;
355
+ case routeModelArgsKey:
356
+ break;
354
357
  default:
355
358
  middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
356
359
  ? !(argsMetadata.type in context)
@@ -434,6 +437,8 @@ export const BoolFactory = async (target: new (...args: any[]) => unknown, optio
434
437
  guardCollection.funcName
435
438
  );
436
439
  break;
440
+ case routeModelArgsKey:
441
+ break;
437
442
  default:
438
443
  guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
439
444
  ? context[argsMetadata.type]
@@ -469,7 +474,8 @@ export const BoolFactory = async (target: new (...args: any[]) => unknown, optio
469
474
  });
470
475
  }
471
476
 
472
- context[paramsArgsKey] = result.params;
477
+ context[paramsArgsKey] = result.parameters;
478
+ context[routeModelArgsKey] = result;
473
479
 
474
480
  let responseBody = undefined;
475
481
 
@@ -545,6 +551,9 @@ export const BoolFactory = async (target: new (...args: any[]) => unknown, optio
545
551
  beforeDispatcherCollection.funcName
546
552
  );
547
553
  break;
554
+ case routeModelArgsKey:
555
+ beforeDispatcherArguments[argsMetadata.index] = context[routeModelArgsKey];
556
+ break;
548
557
  default:
549
558
  beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
550
559
  ? context[argsMetadata.type]
@@ -563,94 +572,95 @@ export const BoolFactory = async (target: new (...args: any[]) => unknown, optio
563
572
  }
564
573
 
565
574
  // Execute controller action
566
- for (let i = 0; i < result.handlers.length; i++) {
567
- const controllerActionArguments = [];
568
- const controllerActionCollection = result.handlers[i];
569
- const handlerMetadata: Record<string, TArgumentsMetadata> =
570
- Reflect.getOwnMetadata(
571
- argumentsKey,
572
- controllerActionCollection.class,
573
- controllerActionCollection.funcName
574
- ) || {};
575
-
576
- if (handlerMetadata) {
577
- for (const [_key, argsMetadata] of Object.entries(handlerMetadata)) {
578
- switch (argsMetadata.type) {
579
- case requestArgsKey:
580
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
581
- ? request
582
- : await argumentsResolution(
583
- request,
584
- argsMetadata.zodSchema,
585
- argsMetadata.index,
586
- controllerActionCollection.funcName
587
- );
588
- break;
589
- case bodyArgsKey:
590
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
591
- ? await request[argsMetadata.parser || "json"]()
592
- : await argumentsResolution(
593
- await request[argsMetadata.parser || "json"](),
594
- argsMetadata.zodSchema,
595
- argsMetadata.index,
596
- controllerActionCollection.funcName
597
- );
598
- break;
599
- case contextArgsKey:
600
- controllerActionArguments[argsMetadata.index] = !argsMetadata.key
601
- ? contextHook
602
- : contextHook.get(argsMetadata.key);
603
- break;
604
- case requestHeadersArgsKey:
605
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
606
- ? headers
607
- : await argumentsResolution(
608
- headers.toJSON(),
609
- argsMetadata.zodSchema,
610
- argsMetadata.index,
611
- controllerActionCollection.funcName
612
- );
613
- break;
614
- case responseHeadersArgsKey:
615
- controllerActionArguments[argsMetadata.index] = context[argsMetadata.type];
616
- break;
617
- case requestHeaderArgsKey:
618
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
619
- ? headers.get(argsMetadata.key) || undefined
620
- : await argumentsResolution(
621
- headers.get(argsMetadata.key) || undefined,
622
- argsMetadata.zodSchema,
623
- argsMetadata.index,
624
- controllerActionCollection.funcName
625
- );
626
- break;
627
- case paramArgsKey:
628
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
629
- ? context[paramArgsKey][argsMetadata.key] || undefined
630
- : await argumentsResolution(
631
- context[paramArgsKey][argsMetadata.key],
632
- argsMetadata.zodSchema,
633
- argsMetadata.index,
634
- controllerActionCollection.funcName
635
- );
636
- break;
637
- default:
638
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
639
- ? context[argsMetadata.type]
640
- : await argumentsResolution(
641
- context[argsMetadata.type],
642
- argsMetadata.zodSchema,
643
- argsMetadata.index,
644
- controllerActionCollection.funcName
645
- );
646
- break;
647
- }
575
+ const controllerActionArguments: any[] = [];
576
+ const controllerActionCollection = result.model;
577
+ const controllerActionMetadata: Record<string, TArgumentsMetadata> =
578
+ Reflect.getOwnMetadata(
579
+ argumentsKey,
580
+ controllerActionCollection.class,
581
+ controllerActionCollection.funcName
582
+ ) || {};
583
+
584
+ if (controllerActionMetadata) {
585
+ for (const [_key, argsMetadata] of Object.entries(controllerActionMetadata)) {
586
+ switch (argsMetadata.type) {
587
+ case requestArgsKey:
588
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
589
+ ? request
590
+ : await argumentsResolution(
591
+ request,
592
+ argsMetadata.zodSchema,
593
+ argsMetadata.index,
594
+ controllerActionCollection.funcName
595
+ );
596
+ break;
597
+ case bodyArgsKey:
598
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
599
+ ? await request[argsMetadata.parser || "json"]()
600
+ : await argumentsResolution(
601
+ await request[argsMetadata.parser || "json"](),
602
+ argsMetadata.zodSchema,
603
+ argsMetadata.index,
604
+ controllerActionCollection.funcName
605
+ );
606
+ break;
607
+ case contextArgsKey:
608
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.key
609
+ ? contextHook
610
+ : contextHook.get(argsMetadata.key);
611
+ break;
612
+ case requestHeadersArgsKey:
613
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
614
+ ? headers
615
+ : await argumentsResolution(
616
+ headers.toJSON(),
617
+ argsMetadata.zodSchema,
618
+ argsMetadata.index,
619
+ controllerActionCollection.funcName
620
+ );
621
+ break;
622
+ case responseHeadersArgsKey:
623
+ controllerActionArguments[argsMetadata.index] = context[argsMetadata.type];
624
+ break;
625
+ case requestHeaderArgsKey:
626
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
627
+ ? headers.get(argsMetadata.key) || undefined
628
+ : await argumentsResolution(
629
+ headers.get(argsMetadata.key) || undefined,
630
+ argsMetadata.zodSchema,
631
+ argsMetadata.index,
632
+ controllerActionCollection.funcName
633
+ );
634
+ break;
635
+ case paramArgsKey:
636
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
637
+ ? context[paramArgsKey][argsMetadata.key] || undefined
638
+ : await argumentsResolution(
639
+ context[paramArgsKey][argsMetadata.key],
640
+ argsMetadata.zodSchema,
641
+ argsMetadata.index,
642
+ controllerActionCollection.funcName
643
+ );
644
+ break;
645
+ case routeModelArgsKey:
646
+ controllerActionArguments[argsMetadata.index] = context[routeModelArgsKey];
647
+ break;
648
+ default:
649
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
650
+ ? context[argsMetadata.type]
651
+ : await argumentsResolution(
652
+ context[argsMetadata.type],
653
+ argsMetadata.zodSchema,
654
+ argsMetadata.index,
655
+ controllerActionCollection.funcName
656
+ );
657
+ break;
648
658
  }
649
659
  }
650
-
651
- responseBody = await controllerActionCollection.func(...controllerActionArguments);
652
660
  }
653
661
 
662
+ responseBody = await controllerActionCollection.func(...controllerActionArguments);
663
+
654
664
  // Execute after dispatcher(s)
655
665
  for (let i = 0; i < afterDispatcherGroup.length; i++) {
656
666
  const afterDispatcherArguments = [];
@@ -723,6 +733,9 @@ export const BoolFactory = async (target: new (...args: any[]) => unknown, optio
723
733
  afterDispatcherCollection.funcName
724
734
  );
725
735
  break;
736
+ case routeModelArgsKey:
737
+ afterDispatcherArguments[argsMetadata.index] = context[routeModelArgsKey];
738
+ break;
726
739
  default:
727
740
  afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
728
741
  ? context[argsMetadata.type]
package/src/index.ts CHANGED
@@ -1,7 +1,9 @@
1
1
  import "reflect-metadata";
2
2
 
3
- export * as Keys from "./keys";
4
- export * from "./interfaces";
5
- export * from "./hooks";
3
+ export type { TRouteModel } from "./entities";
4
+
6
5
  export * from "./decorators";
6
+ export * from "./hooks";
7
7
  export * from "./http";
8
+ export * from "./interfaces";
9
+ export * as Keys from "./keys";
package/src/keys/index.ts CHANGED
@@ -19,3 +19,4 @@ export const queryArgsKey = Symbol("__bool:arguments:query__");
19
19
  export const requestArgsKey = Symbol("__bool:arguments:request__");
20
20
  export const responseHeadersArgsKey = Symbol("__bool:arguments:responseHeaders__");
21
21
  export const contextArgsKey = Symbol("__bool:arguments:context__");
22
+ export const routeModelArgsKey = Symbol("__bool:arguments:routeModel__");