@bool-ts/core 1.5.9 → 1.6.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/dist/decorators/arguments.d.ts +7 -1
- package/dist/decorators/arguments.js +15 -0
- package/dist/decorators/module.d.ts +2 -0
- package/dist/hooks/factory.d.ts +2 -1
- package/dist/hooks/factory.js +332 -302
- package/package.json +1 -1
- package/src/decorators/arguments.ts +30 -1
- package/src/decorators/module.ts +2 -0
- package/src/hooks/factory.ts +498 -458
package/src/hooks/factory.ts
CHANGED
|
@@ -1,22 +1,23 @@
|
|
|
1
|
+
import type { TModuleMetadata, TArgumentsMetadata, THttpMetadata, TControllerMetadata } from "../decorators";
|
|
2
|
+
import type { IGuard, IMiddleware } from "../interfaces";
|
|
3
|
+
import type { IDispatcher } from "../interfaces/dispatcher";
|
|
4
|
+
|
|
1
5
|
import "colors";
|
|
2
6
|
import "reflect-metadata";
|
|
3
7
|
|
|
4
8
|
import Qs from "qs";
|
|
5
9
|
import * as Zod from "zod";
|
|
6
10
|
|
|
7
|
-
import type { TModuleMetadata, TArgumentsMetadata, THttpMetadata, TControllerMetadata } from "../decorators";
|
|
8
|
-
|
|
9
11
|
import { Router, RouterGroup } from "../entities";
|
|
10
12
|
import { controllerHttpKey, controllerKey, argumentsKey, moduleKey, EArgumentTypes } from "../decorators";
|
|
11
13
|
import { HttpClientError, HttpServerError, jsonErrorInfer, type THttpMethods } from "../http";
|
|
12
14
|
import { Injector } from "./injector";
|
|
13
|
-
import type { IGuard, IMiddleware } from "../interfaces";
|
|
14
|
-
import type { IDispatcher } from "../interfaces/dispatcher";
|
|
15
15
|
|
|
16
16
|
export type TBoolFactoryOptions = Required<{
|
|
17
17
|
port: number;
|
|
18
18
|
}> &
|
|
19
19
|
Partial<{
|
|
20
|
+
config: Record<string | symbol, any> | (() => Record<string | symbol, any>);
|
|
20
21
|
prefix: string;
|
|
21
22
|
debug: boolean;
|
|
22
23
|
log: Partial<{
|
|
@@ -118,499 +119,538 @@ export const argumentsResolution = async (
|
|
|
118
119
|
}
|
|
119
120
|
};
|
|
120
121
|
|
|
121
|
-
export const BoolFactory = (target: new (...args: any[]) => unknown, options: TBoolFactoryOptions) => {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
const moduleMetadata = Reflect.getOwnMetadata(moduleKey, target) as TModuleMetadata;
|
|
127
|
-
|
|
128
|
-
if (!moduleMetadata) {
|
|
129
|
-
return Bun.serve({
|
|
130
|
-
port: options.port,
|
|
131
|
-
fetch: () => new Response()
|
|
132
|
-
});
|
|
133
|
-
}
|
|
122
|
+
export const BoolFactory = async (target: new (...args: any[]) => unknown, options: TBoolFactoryOptions) => {
|
|
123
|
+
try {
|
|
124
|
+
if (!Reflect.getOwnMetadataKeys(target).includes(moduleKey)) {
|
|
125
|
+
throw Error(`${target.name} is not a module.`);
|
|
126
|
+
}
|
|
134
127
|
|
|
135
|
-
|
|
128
|
+
const moduleMetadata = Reflect.getOwnMetadata(moduleKey, target) as TModuleMetadata;
|
|
136
129
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
130
|
+
if (!moduleMetadata) {
|
|
131
|
+
return Bun.serve({
|
|
132
|
+
port: options.port,
|
|
133
|
+
fetch: () => new Response()
|
|
134
|
+
});
|
|
135
|
+
}
|
|
142
136
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
137
|
+
const {
|
|
138
|
+
middlewares,
|
|
139
|
+
guards,
|
|
140
|
+
beforeDispatchers,
|
|
141
|
+
controllers,
|
|
142
|
+
afterDispatchers,
|
|
143
|
+
prefix: modulePrefix,
|
|
144
|
+
config: moduleConfig
|
|
145
|
+
} = moduleMetadata;
|
|
146
|
+
|
|
147
|
+
// Middleware(s)
|
|
148
|
+
const middlewareGroup = !middlewares
|
|
149
|
+
? []
|
|
150
|
+
: middlewares.map((middleware) => {
|
|
151
|
+
const middlewareInstance = Injector.get<IMiddleware>(middleware);
|
|
152
|
+
|
|
153
|
+
return Object.freeze({
|
|
154
|
+
class: middleware,
|
|
155
|
+
funcName: "enforce",
|
|
156
|
+
func: middlewareInstance.enforce.bind(middlewareInstance)
|
|
157
|
+
});
|
|
147
158
|
});
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
// Guard(s)
|
|
151
|
-
const guardGroup = !guards
|
|
152
|
-
? []
|
|
153
|
-
: guards.map((guard) => {
|
|
154
|
-
const guardInstance = Injector.get<IGuard>(guard);
|
|
155
|
-
|
|
156
|
-
return Object.freeze({
|
|
157
|
-
class: guard,
|
|
158
|
-
funcName: "enforce",
|
|
159
|
-
func: guardInstance.enforce.bind(guardInstance)
|
|
160
|
-
});
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
// Before dispatcher(s)
|
|
164
|
-
const beforeDispatcherGroup = !beforeDispatchers
|
|
165
|
-
? []
|
|
166
|
-
: beforeDispatchers.map((beforeDispatcher) => {
|
|
167
|
-
const beforeDispatcherInstance = Injector.get<IDispatcher>(beforeDispatcher);
|
|
168
|
-
|
|
169
|
-
return Object.freeze({
|
|
170
|
-
class: beforeDispatcher,
|
|
171
|
-
funcName: "execute",
|
|
172
|
-
func: beforeDispatcherInstance.execute.bind(beforeDispatcherInstance)
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
159
|
|
|
176
|
-
|
|
177
|
-
|
|
160
|
+
// Guard(s)
|
|
161
|
+
const guardGroup = !guards
|
|
162
|
+
? []
|
|
163
|
+
: guards.map((guard) => {
|
|
164
|
+
const guardInstance = Injector.get<IGuard>(guard);
|
|
165
|
+
|
|
166
|
+
return Object.freeze({
|
|
167
|
+
class: guard,
|
|
168
|
+
funcName: "enforce",
|
|
169
|
+
func: guardInstance.enforce.bind(guardInstance)
|
|
170
|
+
});
|
|
171
|
+
});
|
|
178
172
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
173
|
+
// Before dispatcher(s)
|
|
174
|
+
const beforeDispatcherGroup = !beforeDispatchers
|
|
175
|
+
? []
|
|
176
|
+
: beforeDispatchers.map((beforeDispatcher) => {
|
|
177
|
+
const beforeDispatcherInstance = Injector.get<IDispatcher>(beforeDispatcher);
|
|
178
|
+
|
|
179
|
+
return Object.freeze({
|
|
180
|
+
class: beforeDispatcher,
|
|
181
|
+
funcName: "execute",
|
|
182
|
+
func: beforeDispatcherInstance.execute.bind(beforeDispatcherInstance)
|
|
183
|
+
});
|
|
184
|
+
});
|
|
183
185
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
186
|
+
// Controller(s)
|
|
187
|
+
const routerGroup = new RouterGroup();
|
|
188
|
+
|
|
189
|
+
controllers &&
|
|
190
|
+
controllers.map((controllerConstructor) =>
|
|
191
|
+
controllerCreator(controllerConstructor, routerGroup, `${options.prefix || ""}/${modulePrefix || ""}`)
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
// After dispatcher(s)
|
|
195
|
+
const afterDispatcherGroup = !afterDispatchers
|
|
196
|
+
? []
|
|
197
|
+
: afterDispatchers.map((afterDispatcher) => {
|
|
198
|
+
const afterDispatcherInstance = Injector.get<IDispatcher>(afterDispatcher);
|
|
199
|
+
|
|
200
|
+
return Object.freeze({
|
|
201
|
+
class: afterDispatcher,
|
|
202
|
+
funcName: "execute",
|
|
203
|
+
func: afterDispatcherInstance.execute.bind(afterDispatcherInstance)
|
|
204
|
+
});
|
|
205
|
+
});
|
|
187
206
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
207
|
+
const { allowLogsMethods, config } = Object.freeze({
|
|
208
|
+
allowLogsMethods: options?.log?.methods,
|
|
209
|
+
config: {
|
|
210
|
+
...(typeof options.config !== "function" ? options.config : await options.config()),
|
|
211
|
+
...(typeof moduleConfig !== "function" ? moduleConfig : await moduleConfig())
|
|
212
|
+
}
|
|
213
|
+
});
|
|
193
214
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
middlewareArguments[argsMetadata.index] = resHeaders;
|
|
256
|
-
break;
|
|
215
|
+
Bun.serve({
|
|
216
|
+
port: options.port,
|
|
217
|
+
fetch: async (request) => {
|
|
218
|
+
const start = performance.now();
|
|
219
|
+
const url = new URL(request.url);
|
|
220
|
+
const reqHeaders = request.headers;
|
|
221
|
+
const resHeaders = new Headers();
|
|
222
|
+
const query = Qs.parse(url.searchParams.toString(), options.queryParser);
|
|
223
|
+
|
|
224
|
+
try {
|
|
225
|
+
// Execute middleware(s)
|
|
226
|
+
for (let i = 0; i < middlewareGroup.length; i++) {
|
|
227
|
+
const middlewareArguments = [];
|
|
228
|
+
const middlewareCollection = middlewareGroup[i];
|
|
229
|
+
const middlewareMetadata: Record<string, TArgumentsMetadata> =
|
|
230
|
+
Reflect.getOwnMetadata(argumentsKey, middlewareCollection.class, middlewareCollection.funcName) ||
|
|
231
|
+
{};
|
|
232
|
+
|
|
233
|
+
if (middlewareMetadata) {
|
|
234
|
+
for (const [_key, argsMetadata] of Object.entries(middlewareMetadata)) {
|
|
235
|
+
switch (argsMetadata.type) {
|
|
236
|
+
case EArgumentTypes.requestHeaders:
|
|
237
|
+
middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
238
|
+
? reqHeaders
|
|
239
|
+
: await argumentsResolution(
|
|
240
|
+
reqHeaders,
|
|
241
|
+
argsMetadata.zodSchema,
|
|
242
|
+
argsMetadata.index,
|
|
243
|
+
middlewareCollection.funcName
|
|
244
|
+
);
|
|
245
|
+
break;
|
|
246
|
+
case EArgumentTypes.body:
|
|
247
|
+
middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
248
|
+
? await request[argsMetadata.parser || "json"]()
|
|
249
|
+
: await argumentsResolution(
|
|
250
|
+
await request[argsMetadata.parser || "json"](),
|
|
251
|
+
argsMetadata.zodSchema,
|
|
252
|
+
argsMetadata.index,
|
|
253
|
+
middlewareCollection.funcName
|
|
254
|
+
);
|
|
255
|
+
break;
|
|
256
|
+
case EArgumentTypes.query:
|
|
257
|
+
middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
258
|
+
? query
|
|
259
|
+
: await argumentsResolution(
|
|
260
|
+
query,
|
|
261
|
+
argsMetadata.zodSchema,
|
|
262
|
+
argsMetadata.index,
|
|
263
|
+
middlewareCollection.funcName
|
|
264
|
+
);
|
|
265
|
+
break;
|
|
266
|
+
case EArgumentTypes.request:
|
|
267
|
+
middlewareArguments[argsMetadata.index] = request;
|
|
268
|
+
break;
|
|
269
|
+
case EArgumentTypes.responseHeaders:
|
|
270
|
+
middlewareArguments[argsMetadata.index] = resHeaders;
|
|
271
|
+
break;
|
|
272
|
+
case EArgumentTypes.config:
|
|
273
|
+
middlewareArguments[argsMetadata.index] = config;
|
|
274
|
+
break;
|
|
275
|
+
}
|
|
257
276
|
}
|
|
258
277
|
}
|
|
259
|
-
}
|
|
260
278
|
|
|
261
|
-
|
|
279
|
+
const middlewareResult = await middlewareCollection.func(...middlewareArguments);
|
|
262
280
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
281
|
+
if (!(middlewareResult instanceof Response)) {
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
266
284
|
|
|
267
|
-
|
|
268
|
-
|
|
285
|
+
return middlewareResult;
|
|
286
|
+
}
|
|
269
287
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
288
|
+
// Execute guard(s)
|
|
289
|
+
for (let i = 0; i < guardGroup.length; i++) {
|
|
290
|
+
const guardArguments = [];
|
|
291
|
+
const guardCollection = guardGroup[i];
|
|
292
|
+
const guardMetadata: Record<string, TArgumentsMetadata> =
|
|
293
|
+
Reflect.getOwnMetadata(argumentsKey, guardCollection.class, guardCollection.funcName) || {};
|
|
294
|
+
|
|
295
|
+
if (guardMetadata) {
|
|
296
|
+
for (const [_key, argsMetadata] of Object.entries(guardMetadata)) {
|
|
297
|
+
switch (argsMetadata.type) {
|
|
298
|
+
case EArgumentTypes.requestHeaders:
|
|
299
|
+
guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
300
|
+
? reqHeaders
|
|
301
|
+
: await argumentsResolution(
|
|
302
|
+
reqHeaders,
|
|
303
|
+
argsMetadata.zodSchema,
|
|
304
|
+
argsMetadata.index,
|
|
305
|
+
guardCollection.funcName
|
|
306
|
+
);
|
|
307
|
+
break;
|
|
308
|
+
case EArgumentTypes.body:
|
|
309
|
+
guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
310
|
+
? await request[argsMetadata.parser || "json"]()
|
|
311
|
+
: await argumentsResolution(
|
|
312
|
+
await request[argsMetadata.parser || "json"](),
|
|
313
|
+
argsMetadata.zodSchema,
|
|
314
|
+
argsMetadata.index,
|
|
315
|
+
guardCollection.funcName
|
|
316
|
+
);
|
|
317
|
+
break;
|
|
318
|
+
case EArgumentTypes.query:
|
|
319
|
+
guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
320
|
+
? query
|
|
321
|
+
: await argumentsResolution(
|
|
322
|
+
query,
|
|
323
|
+
argsMetadata.zodSchema,
|
|
324
|
+
argsMetadata.index,
|
|
325
|
+
guardCollection.funcName
|
|
326
|
+
);
|
|
327
|
+
break;
|
|
328
|
+
case EArgumentTypes.request:
|
|
329
|
+
guardArguments[argsMetadata.index] = request;
|
|
330
|
+
break;
|
|
331
|
+
case EArgumentTypes.responseHeaders:
|
|
332
|
+
guardArguments[argsMetadata.index] = resHeaders;
|
|
333
|
+
break;
|
|
334
|
+
case EArgumentTypes.config:
|
|
335
|
+
guardArguments[argsMetadata.index] = config;
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
316
338
|
}
|
|
317
339
|
}
|
|
340
|
+
|
|
341
|
+
const guardResult = await guardCollection.func(...guardArguments);
|
|
342
|
+
|
|
343
|
+
if (typeof guardResult !== "boolean" || !guardResult) {
|
|
344
|
+
throw new HttpClientError({
|
|
345
|
+
httpCode: 401,
|
|
346
|
+
message: "Unauthorization.",
|
|
347
|
+
data: undefined
|
|
348
|
+
});
|
|
349
|
+
}
|
|
318
350
|
}
|
|
319
351
|
|
|
320
|
-
const
|
|
352
|
+
const result = routerGroup.find(url.pathname, request.method as keyof THttpMethods);
|
|
321
353
|
|
|
322
|
-
if (
|
|
354
|
+
if (!result) {
|
|
323
355
|
throw new HttpClientError({
|
|
324
|
-
httpCode:
|
|
325
|
-
message: "
|
|
356
|
+
httpCode: 404,
|
|
357
|
+
message: "Route not found.",
|
|
326
358
|
data: undefined
|
|
327
359
|
});
|
|
328
360
|
}
|
|
329
|
-
}
|
|
330
361
|
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
case EArgumentTypes.request:
|
|
412
|
-
beforeDispatcherArguments[argsMetadata.index] = request;
|
|
413
|
-
break;
|
|
414
|
-
case EArgumentTypes.responseHeaders:
|
|
415
|
-
beforeDispatcherArguments[argsMetadata.index] = resHeaders;
|
|
416
|
-
break;
|
|
362
|
+
const params = result.params;
|
|
363
|
+
|
|
364
|
+
let responseBody = undefined;
|
|
365
|
+
|
|
366
|
+
// Execute before dispatcher(s)
|
|
367
|
+
for (let i = 0; i < beforeDispatcherGroup.length; i++) {
|
|
368
|
+
const beforeDispatcherArguments = [];
|
|
369
|
+
const beforeDispatcherCollection = beforeDispatcherGroup[i];
|
|
370
|
+
const beforeDispatcherMetadata: Record<string, TArgumentsMetadata> =
|
|
371
|
+
Reflect.getOwnMetadata(
|
|
372
|
+
argumentsKey,
|
|
373
|
+
beforeDispatcherCollection.class,
|
|
374
|
+
beforeDispatcherCollection.funcName
|
|
375
|
+
) || {};
|
|
376
|
+
|
|
377
|
+
if (beforeDispatcherMetadata) {
|
|
378
|
+
for (const [_key, argsMetadata] of Object.entries(beforeDispatcherMetadata)) {
|
|
379
|
+
switch (argsMetadata.type) {
|
|
380
|
+
case EArgumentTypes.requestHeaders:
|
|
381
|
+
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
382
|
+
? reqHeaders
|
|
383
|
+
: await argumentsResolution(
|
|
384
|
+
reqHeaders,
|
|
385
|
+
argsMetadata.zodSchema,
|
|
386
|
+
argsMetadata.index,
|
|
387
|
+
beforeDispatcherCollection.funcName
|
|
388
|
+
);
|
|
389
|
+
break;
|
|
390
|
+
case EArgumentTypes.body:
|
|
391
|
+
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
392
|
+
? await request[argsMetadata.parser || "json"]()
|
|
393
|
+
: await argumentsResolution(
|
|
394
|
+
await request[argsMetadata.parser || "json"](),
|
|
395
|
+
argsMetadata.zodSchema,
|
|
396
|
+
argsMetadata.index,
|
|
397
|
+
beforeDispatcherCollection.funcName
|
|
398
|
+
);
|
|
399
|
+
break;
|
|
400
|
+
case EArgumentTypes.params:
|
|
401
|
+
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
402
|
+
? params
|
|
403
|
+
: await argumentsResolution(
|
|
404
|
+
params,
|
|
405
|
+
argsMetadata.zodSchema,
|
|
406
|
+
argsMetadata.index,
|
|
407
|
+
beforeDispatcherCollection.funcName
|
|
408
|
+
);
|
|
409
|
+
break;
|
|
410
|
+
case EArgumentTypes.query:
|
|
411
|
+
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
412
|
+
? query
|
|
413
|
+
: await argumentsResolution(
|
|
414
|
+
query,
|
|
415
|
+
argsMetadata.zodSchema,
|
|
416
|
+
argsMetadata.index,
|
|
417
|
+
beforeDispatcherCollection.funcName
|
|
418
|
+
);
|
|
419
|
+
break;
|
|
420
|
+
case EArgumentTypes.param:
|
|
421
|
+
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
422
|
+
? !(argsMetadata.key in params)
|
|
423
|
+
? undefined
|
|
424
|
+
: params[argsMetadata.key]
|
|
425
|
+
: await argumentsResolution(
|
|
426
|
+
query,
|
|
427
|
+
argsMetadata.zodSchema,
|
|
428
|
+
argsMetadata.index,
|
|
429
|
+
beforeDispatcherCollection.funcName
|
|
430
|
+
);
|
|
431
|
+
break;
|
|
432
|
+
case EArgumentTypes.request:
|
|
433
|
+
beforeDispatcherArguments[argsMetadata.index] = request;
|
|
434
|
+
break;
|
|
435
|
+
case EArgumentTypes.responseHeaders:
|
|
436
|
+
beforeDispatcherArguments[argsMetadata.index] = resHeaders;
|
|
437
|
+
break;
|
|
438
|
+
case EArgumentTypes.config:
|
|
439
|
+
beforeDispatcherArguments[argsMetadata.index] = config;
|
|
440
|
+
break;
|
|
441
|
+
}
|
|
417
442
|
}
|
|
418
443
|
}
|
|
419
|
-
}
|
|
420
444
|
|
|
421
|
-
|
|
422
|
-
|
|
445
|
+
await beforeDispatcherCollection.func(...beforeDispatcherArguments);
|
|
446
|
+
}
|
|
423
447
|
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
448
|
+
// Execute controller action
|
|
449
|
+
for (let i = 0; i < result.handlers.length; i++) {
|
|
450
|
+
const controllerActionArguments = [];
|
|
451
|
+
const handler = result.handlers[i];
|
|
452
|
+
const handlerMetadata: Record<string, TArgumentsMetadata> =
|
|
453
|
+
Reflect.getOwnMetadata(argumentsKey, handler.class, handler.funcName) || {};
|
|
454
|
+
|
|
455
|
+
if (handlerMetadata) {
|
|
456
|
+
for (const [_key, argsMetadata] of Object.entries(handlerMetadata)) {
|
|
457
|
+
switch (argsMetadata.type) {
|
|
458
|
+
case EArgumentTypes.requestHeaders:
|
|
459
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
460
|
+
? reqHeaders
|
|
461
|
+
: await argumentsResolution(
|
|
462
|
+
reqHeaders,
|
|
463
|
+
argsMetadata.zodSchema,
|
|
464
|
+
argsMetadata.index,
|
|
465
|
+
handler.funcName
|
|
466
|
+
);
|
|
467
|
+
break;
|
|
468
|
+
case EArgumentTypes.body:
|
|
469
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
470
|
+
? await request[argsMetadata.parser || "json"]()
|
|
471
|
+
: await argumentsResolution(
|
|
472
|
+
await request[argsMetadata.parser || "json"](),
|
|
473
|
+
argsMetadata.zodSchema,
|
|
474
|
+
argsMetadata.index,
|
|
475
|
+
handler.funcName
|
|
476
|
+
);
|
|
477
|
+
break;
|
|
478
|
+
case EArgumentTypes.params:
|
|
479
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
480
|
+
? params
|
|
481
|
+
: await argumentsResolution(
|
|
482
|
+
params,
|
|
483
|
+
argsMetadata.zodSchema,
|
|
484
|
+
argsMetadata.index,
|
|
485
|
+
handler.funcName
|
|
486
|
+
);
|
|
487
|
+
break;
|
|
488
|
+
case EArgumentTypes.query:
|
|
489
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
490
|
+
? query
|
|
491
|
+
: await argumentsResolution(
|
|
492
|
+
query,
|
|
493
|
+
argsMetadata.zodSchema,
|
|
494
|
+
argsMetadata.index,
|
|
495
|
+
handler.funcName
|
|
496
|
+
);
|
|
497
|
+
break;
|
|
498
|
+
case EArgumentTypes.param:
|
|
499
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
500
|
+
? !(argsMetadata.key in params)
|
|
501
|
+
? undefined
|
|
502
|
+
: params[argsMetadata.key]
|
|
503
|
+
: await argumentsResolution(
|
|
504
|
+
query,
|
|
505
|
+
argsMetadata.zodSchema,
|
|
506
|
+
argsMetadata.index,
|
|
507
|
+
handler.funcName
|
|
508
|
+
);
|
|
509
|
+
break;
|
|
510
|
+
case EArgumentTypes.request:
|
|
511
|
+
controllerActionArguments[argsMetadata.index] = request;
|
|
512
|
+
break;
|
|
513
|
+
case EArgumentTypes.responseHeaders:
|
|
514
|
+
controllerActionArguments[argsMetadata.index] = resHeaders;
|
|
515
|
+
break;
|
|
516
|
+
case EArgumentTypes.config:
|
|
517
|
+
controllerActionArguments[argsMetadata.index] = config;
|
|
518
|
+
break;
|
|
519
|
+
}
|
|
492
520
|
}
|
|
493
521
|
}
|
|
494
|
-
}
|
|
495
522
|
|
|
496
|
-
|
|
497
|
-
|
|
523
|
+
responseBody = await handler.func(...controllerActionArguments);
|
|
524
|
+
}
|
|
498
525
|
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
526
|
+
// Execute after dispatcher(s)
|
|
527
|
+
for (let i = 0; i < afterDispatcherGroup.length; i++) {
|
|
528
|
+
const afterDispatcherArguments = [];
|
|
529
|
+
const afterDispatcherCollection = afterDispatcherGroup[i];
|
|
530
|
+
const afterDispatcherMetadata: Record<string, TArgumentsMetadata> =
|
|
531
|
+
Reflect.getOwnMetadata(
|
|
532
|
+
argumentsKey,
|
|
533
|
+
afterDispatcherCollection.class,
|
|
534
|
+
afterDispatcherCollection.funcName
|
|
535
|
+
) || {};
|
|
536
|
+
|
|
537
|
+
if (afterDispatcherMetadata) {
|
|
538
|
+
for (const [_key, argsMetadata] of Object.entries(afterDispatcherMetadata)) {
|
|
539
|
+
switch (argsMetadata.type) {
|
|
540
|
+
case EArgumentTypes.requestHeaders:
|
|
541
|
+
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
542
|
+
? reqHeaders
|
|
543
|
+
: await argumentsResolution(
|
|
544
|
+
reqHeaders,
|
|
545
|
+
argsMetadata.zodSchema,
|
|
546
|
+
argsMetadata.index,
|
|
547
|
+
afterDispatcherCollection.funcName
|
|
548
|
+
);
|
|
549
|
+
break;
|
|
550
|
+
case EArgumentTypes.body:
|
|
551
|
+
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
552
|
+
? await request[argsMetadata.parser || "json"]()
|
|
553
|
+
: await argumentsResolution(
|
|
554
|
+
await request[argsMetadata.parser || "json"](),
|
|
555
|
+
argsMetadata.zodSchema,
|
|
556
|
+
argsMetadata.index,
|
|
557
|
+
afterDispatcherCollection.funcName
|
|
558
|
+
);
|
|
559
|
+
break;
|
|
560
|
+
case EArgumentTypes.params:
|
|
561
|
+
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
562
|
+
? params
|
|
563
|
+
: await argumentsResolution(
|
|
564
|
+
params,
|
|
565
|
+
argsMetadata.zodSchema,
|
|
566
|
+
argsMetadata.index,
|
|
567
|
+
afterDispatcherCollection.funcName
|
|
568
|
+
);
|
|
569
|
+
break;
|
|
570
|
+
case EArgumentTypes.query:
|
|
571
|
+
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
572
|
+
? query
|
|
573
|
+
: await argumentsResolution(
|
|
574
|
+
query,
|
|
575
|
+
argsMetadata.zodSchema,
|
|
576
|
+
argsMetadata.index,
|
|
577
|
+
afterDispatcherCollection.funcName
|
|
578
|
+
);
|
|
579
|
+
break;
|
|
580
|
+
case EArgumentTypes.param:
|
|
581
|
+
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
582
|
+
? !(argsMetadata.key in params)
|
|
583
|
+
? undefined
|
|
584
|
+
: params[argsMetadata.key]
|
|
585
|
+
: await argumentsResolution(
|
|
586
|
+
query,
|
|
587
|
+
argsMetadata.zodSchema,
|
|
588
|
+
argsMetadata.index,
|
|
589
|
+
afterDispatcherCollection.funcName
|
|
590
|
+
);
|
|
591
|
+
break;
|
|
592
|
+
case EArgumentTypes.request:
|
|
593
|
+
afterDispatcherArguments[argsMetadata.index] = request;
|
|
594
|
+
break;
|
|
595
|
+
case EArgumentTypes.responseHeaders:
|
|
596
|
+
afterDispatcherArguments[argsMetadata.index] = resHeaders;
|
|
597
|
+
break;
|
|
598
|
+
case EArgumentTypes.config:
|
|
599
|
+
afterDispatcherArguments[argsMetadata.index] = config;
|
|
600
|
+
break;
|
|
601
|
+
}
|
|
571
602
|
}
|
|
572
603
|
}
|
|
573
|
-
}
|
|
574
604
|
|
|
575
|
-
|
|
576
|
-
|
|
605
|
+
await afterDispatcherCollection.func(...afterDispatcherArguments);
|
|
606
|
+
}
|
|
577
607
|
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
608
|
+
// Set default header(s)
|
|
609
|
+
resHeaders.set("X-Powered-By", "Bool Typescript");
|
|
610
|
+
|
|
611
|
+
return responseBody instanceof Response
|
|
612
|
+
? responseBody
|
|
613
|
+
: new Response(
|
|
614
|
+
!responseBody
|
|
615
|
+
? undefined
|
|
616
|
+
: JSON.stringify({
|
|
617
|
+
httpCode: 200,
|
|
618
|
+
message: "SUCCESS",
|
|
619
|
+
data: responseBody
|
|
620
|
+
}),
|
|
621
|
+
{
|
|
622
|
+
status: !responseBody ? 204 : 200,
|
|
623
|
+
statusText: "SUCCESS",
|
|
624
|
+
headers: resHeaders
|
|
625
|
+
}
|
|
626
|
+
);
|
|
627
|
+
} catch (error) {
|
|
628
|
+
// Set default header(s)
|
|
629
|
+
resHeaders.set("X-Powered-By", "Bool Typescript");
|
|
630
|
+
|
|
631
|
+
return jsonErrorInfer(error, resHeaders);
|
|
632
|
+
} finally {
|
|
633
|
+
if (allowLogsMethods) {
|
|
634
|
+
const end = performance.now();
|
|
635
|
+
const convertedPID = `${process.pid}`.yellow;
|
|
636
|
+
const convertedMethod = `${request.method.yellow}`.bgBlue;
|
|
637
|
+
const convertedReqIp = `${
|
|
638
|
+
request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || "<Unknown>"
|
|
639
|
+
}`.yellow;
|
|
640
|
+
const convertedTime = `${Math.round((end - start + Number.EPSILON) * 10 ** 2) / 10 ** 2}ms`.yellow;
|
|
641
|
+
|
|
642
|
+
allowLogsMethods.includes(request.method.toUpperCase() as (typeof allowLogsMethods)[number]) &&
|
|
643
|
+
console.info(
|
|
644
|
+
`PID: ${convertedPID} - Method: ${convertedMethod} - IP: ${convertedReqIp} - ${url.pathname.blue} - Time: ${convertedTime}`
|
|
645
|
+
);
|
|
646
|
+
}
|
|
610
647
|
}
|
|
611
648
|
}
|
|
612
|
-
}
|
|
613
|
-
})
|
|
649
|
+
});
|
|
650
|
+
} catch (error) {
|
|
651
|
+
console.error(error);
|
|
652
|
+
throw error;
|
|
653
|
+
}
|
|
614
654
|
};
|
|
615
655
|
|
|
616
656
|
export default BoolFactory;
|