@bool-ts/core 1.6.14 → 1.7.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/.prettierrc +11 -11
- package/LICENSE +21 -21
- package/__test/controller.ts +93 -79
- package/__test/dispatcher.ts +16 -0
- package/__test/firstGuard.ts +10 -10
- package/__test/firstMiddleware.ts +15 -9
- package/__test/index.ts +8 -8
- package/__test/interfaces.ts +7 -7
- package/__test/module.ts +28 -30
- package/__test/repository.ts +16 -16
- package/__test/secondGuard.ts +10 -10
- package/__test/secondMiddleware.ts +15 -9
- package/__test/service.ts +20 -20
- package/bun.lockb +0 -0
- package/dist/decorators/arguments.d.ts +3 -3
- package/dist/decorators/arguments.js +3 -3
- package/dist/decorators/dispatcher.js +0 -3
- package/dist/decorators/index.d.ts +1 -1
- package/dist/decorators/index.js +1 -1
- package/dist/decorators/middleware.js +0 -3
- package/dist/decorators/module.d.ts +2 -4
- package/dist/decorators/module.js +5 -12
- package/dist/hooks/factory.d.ts +41 -2
- package/dist/hooks/factory.js +496 -404
- package/dist/hooks/injector.d.ts +14 -1
- package/dist/hooks/injector.js +3 -3
- package/dist/http/index.d.ts +1 -1
- package/dist/http/index.js +2 -1
- package/dist/interfaces/dispatcher.d.ts +3 -2
- package/dist/interfaces/middleware.d.ts +3 -2
- package/dist/keys/index.d.ts +2 -1
- package/dist/keys/index.js +2 -1
- package/jsconfig.json +27 -27
- package/package.json +3 -3
- package/src/decorators/arguments.ts +286 -286
- package/src/decorators/controller.ts +21 -21
- package/src/decorators/dispatcher.ts +14 -18
- package/src/decorators/guard.ts +18 -18
- package/src/decorators/http.ts +81 -81
- package/src/decorators/index.ts +29 -29
- package/src/decorators/inject.ts +13 -13
- package/src/decorators/injectable.ts +8 -8
- package/src/decorators/middleware.ts +14 -18
- package/src/decorators/module.ts +84 -94
- package/src/decorators/zodSchema.ts +19 -19
- package/src/entities/index.ts +5 -5
- package/src/entities/route.ts +327 -327
- package/src/entities/router.ts +35 -35
- package/src/entities/routerGroup.ts +34 -34
- package/src/hooks/factory.ts +990 -809
- package/src/hooks/index.ts +2 -2
- package/src/hooks/injector.ts +57 -57
- package/src/http/clientError.ts +45 -45
- package/src/http/index.ts +62 -61
- package/src/http/serverError.ts +27 -27
- package/src/index.ts +9 -9
- package/src/interfaces/context.ts +4 -4
- package/src/interfaces/controller.ts +1 -1
- package/src/interfaces/dispatcher.ts +4 -3
- package/src/interfaces/guard.ts +3 -3
- package/src/interfaces/index.ts +6 -6
- package/src/interfaces/middleware.ts +4 -3
- package/src/interfaces/module.ts +1 -1
- package/src/keys/index.ts +23 -22
- package/test.http +31 -31
- package/tsconfig.json +108 -108
- package/__test/afterDispatcher.ts +0 -9
- package/__test/beforeDispatcher.ts +0 -9
package/dist/hooks/factory.js
CHANGED
|
@@ -4,13 +4,17 @@ 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,
|
|
7
|
+
import { argumentsKey, configKey, contextArgsKey, controllerHttpKey, controllerKey, moduleKey, paramArgsKey, paramsArgsKey, queryArgsKey, requestArgsKey, requestBodyArgsKey, requestHeaderArgsKey, requestHeadersArgsKey, responseBodyArgsKey, responseHeadersArgsKey, routeModelArgsKey } from "../keys";
|
|
8
8
|
import { Injector } from "./injector";
|
|
9
|
-
export const
|
|
9
|
+
export const responseConverter = (response) => {
|
|
10
|
+
response.headers.set("X-Powered-By", "Bool Typescript");
|
|
11
|
+
return response;
|
|
12
|
+
};
|
|
13
|
+
export const controllerCreator = (controllerConstructor, group, injector, prefix) => {
|
|
10
14
|
if (!Reflect.getOwnMetadataKeys(controllerConstructor).includes(controllerKey)) {
|
|
11
15
|
throw Error(`${controllerConstructor.name} is not a controller.`);
|
|
12
16
|
}
|
|
13
|
-
const controller =
|
|
17
|
+
const controller = injector.get(controllerConstructor);
|
|
14
18
|
if (!controller) {
|
|
15
19
|
throw Error("Can not initialize controller.");
|
|
16
20
|
}
|
|
@@ -79,430 +83,518 @@ export const argumentsResolution = async (data, zodSchema, argumentIndex, funcNa
|
|
|
79
83
|
});
|
|
80
84
|
}
|
|
81
85
|
};
|
|
82
|
-
export const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
+
export const moduleResolution = async (module, options) => {
|
|
87
|
+
if (!Reflect.getOwnMetadataKeys(module).includes(moduleKey)) {
|
|
88
|
+
throw Error(`${module.name} is not a module.`);
|
|
89
|
+
}
|
|
90
|
+
const injector = new Injector();
|
|
91
|
+
const moduleMetadata = Reflect.getOwnMetadata(moduleKey, module);
|
|
92
|
+
if (!moduleMetadata) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const { loaders, middlewares, guards, dispatchers, controllers, dependencies, prefix: modulePrefix, config: moduleConfig } = moduleMetadata;
|
|
96
|
+
// Configuration(s)
|
|
97
|
+
const { config } = Object.freeze({
|
|
98
|
+
config: {
|
|
99
|
+
...(typeof options.config !== "function" ? options.config : await options.config()),
|
|
100
|
+
...(typeof moduleConfig !== "function"
|
|
101
|
+
? typeof moduleConfig !== "object"
|
|
102
|
+
? undefined
|
|
103
|
+
: moduleConfig
|
|
104
|
+
: await moduleConfig())
|
|
86
105
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
106
|
+
});
|
|
107
|
+
// Register config like an injection
|
|
108
|
+
injector.set(configKey, config);
|
|
109
|
+
if (loaders) {
|
|
110
|
+
const loaderFunctions = [];
|
|
111
|
+
for (const [key, func] of Object.entries(loaders)) {
|
|
112
|
+
loaderFunctions.push(async () => {
|
|
113
|
+
try {
|
|
114
|
+
const result = await func({ config });
|
|
115
|
+
console.info(`INFO! Loader [${key}] initialized successfully.`);
|
|
116
|
+
return result;
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
console.error(`WARNING! Loader [${key}] initialization failed.`);
|
|
120
|
+
options.debug && console.error(error);
|
|
121
|
+
throw error;
|
|
122
|
+
}
|
|
92
123
|
});
|
|
93
124
|
}
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
125
|
+
const results = await Promise.all(loaderFunctions.map((func) => func()));
|
|
126
|
+
for (let i = 0; i < results.length; i++) {
|
|
127
|
+
const [key, value] = results[i];
|
|
128
|
+
injector.set(key, value);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Dependencies
|
|
132
|
+
!dependencies || dependencies.map((dependency) => injector.get(dependency));
|
|
133
|
+
// Middleware(s)
|
|
134
|
+
const startMiddlewareGroup = [];
|
|
135
|
+
const endMiddlewareGroup = [];
|
|
136
|
+
if (middlewares) {
|
|
137
|
+
for (let i = 0; i < middlewares.length; i++) {
|
|
138
|
+
const instance = injector.get(middlewares[i]);
|
|
139
|
+
if (instance.start && typeof instance.start === "function") {
|
|
140
|
+
startMiddlewareGroup.push(Object.freeze({
|
|
141
|
+
class: middlewares[i],
|
|
142
|
+
funcName: "start",
|
|
143
|
+
func: instance.start.bind(instance)
|
|
144
|
+
}));
|
|
105
145
|
}
|
|
146
|
+
if (instance.end && typeof instance.end === "function") {
|
|
147
|
+
endMiddlewareGroup.push(Object.freeze({
|
|
148
|
+
class: middlewares[i],
|
|
149
|
+
funcName: "end",
|
|
150
|
+
func: instance.end.bind(instance)
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Guard(s)
|
|
156
|
+
const guardGroup = !guards
|
|
157
|
+
? []
|
|
158
|
+
: guards.map((guard) => {
|
|
159
|
+
const guardInstance = injector.get(guard);
|
|
160
|
+
return Object.freeze({
|
|
161
|
+
class: guard,
|
|
162
|
+
funcName: "enforce",
|
|
163
|
+
func: guardInstance.enforce.bind(guardInstance)
|
|
164
|
+
});
|
|
106
165
|
});
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
console.error(`WARNING! Loader [${key}] initialization failed.`);
|
|
120
|
-
options.debug && console.error(error);
|
|
121
|
-
throw error;
|
|
122
|
-
}
|
|
123
|
-
});
|
|
166
|
+
// Before dispatcher(s)
|
|
167
|
+
const openDispatcherGroup = [];
|
|
168
|
+
const closeDispatcherGroup = [];
|
|
169
|
+
if (dispatchers) {
|
|
170
|
+
for (let i = 0; i < dispatchers.length; i++) {
|
|
171
|
+
const instance = injector.get(dispatchers[i]);
|
|
172
|
+
if (instance.open && typeof instance.open === "function") {
|
|
173
|
+
openDispatcherGroup.push(Object.freeze({
|
|
174
|
+
class: dispatchers[i],
|
|
175
|
+
funcName: "open",
|
|
176
|
+
func: instance.open.bind(instance)
|
|
177
|
+
}));
|
|
124
178
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
179
|
+
if (instance.close && typeof instance.close === "function") {
|
|
180
|
+
closeDispatcherGroup.push(Object.freeze({
|
|
181
|
+
class: dispatchers[i],
|
|
182
|
+
funcName: "close",
|
|
183
|
+
func: instance.close.bind(instance)
|
|
184
|
+
}));
|
|
129
185
|
}
|
|
130
186
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
const
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
187
|
+
}
|
|
188
|
+
// Controller(s)
|
|
189
|
+
const routerGroup = new RouterGroup();
|
|
190
|
+
controllers &&
|
|
191
|
+
controllers.map((controllerConstructor) => controllerCreator(controllerConstructor, routerGroup, injector, `${options.prefix || ""}/${modulePrefix || ""}`));
|
|
192
|
+
return Object.freeze({
|
|
193
|
+
prefix: moduleMetadata.prefix,
|
|
194
|
+
injector: injector,
|
|
195
|
+
startMiddlewareGroup,
|
|
196
|
+
endMiddlewareGroup,
|
|
197
|
+
guardGroup,
|
|
198
|
+
openDispatcherGroup,
|
|
199
|
+
closeDispatcherGroup,
|
|
200
|
+
routerGroup
|
|
201
|
+
});
|
|
202
|
+
};
|
|
203
|
+
const fetcher = async (bun, bool, options) => {
|
|
204
|
+
const { query, route: { parameters, model }, moduleResolution: { startMiddlewareGroup, endMiddlewareGroup, guardGroup, openDispatcherGroup, closeDispatcherGroup } } = bool;
|
|
205
|
+
const { request, server: _server } = bun;
|
|
206
|
+
const context = {
|
|
207
|
+
[requestHeadersArgsKey]: request.headers,
|
|
208
|
+
[responseHeadersArgsKey]: new Headers(),
|
|
209
|
+
[queryArgsKey]: query,
|
|
210
|
+
[paramsArgsKey]: parameters,
|
|
211
|
+
[routeModelArgsKey]: model
|
|
212
|
+
};
|
|
213
|
+
const contextHook = {
|
|
214
|
+
get(key) {
|
|
215
|
+
return context[key];
|
|
216
|
+
},
|
|
217
|
+
set(key, value) {
|
|
218
|
+
if (key in context) {
|
|
219
|
+
throw Error(`${String(key)} already exists in context.`);
|
|
220
|
+
}
|
|
221
|
+
context[key] = value;
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
// Execute start middleware(s)
|
|
225
|
+
for (let i = 0; i < startMiddlewareGroup.length; i++) {
|
|
226
|
+
const args = [];
|
|
227
|
+
const collection = startMiddlewareGroup[i];
|
|
228
|
+
const metadata = Reflect.getOwnMetadata(argumentsKey, collection.class, collection.funcName) || {};
|
|
229
|
+
if (metadata) {
|
|
230
|
+
for (const [_key, argsMetadata] of Object.entries(metadata)) {
|
|
231
|
+
switch (argsMetadata.type) {
|
|
232
|
+
case requestArgsKey:
|
|
233
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
234
|
+
? request
|
|
235
|
+
: await argumentsResolution(request, argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
236
|
+
break;
|
|
237
|
+
case requestBodyArgsKey:
|
|
238
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
239
|
+
? await request[argsMetadata.parser || "json"]()
|
|
240
|
+
: await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
241
|
+
break;
|
|
242
|
+
case contextArgsKey:
|
|
243
|
+
args[argsMetadata.index] = !argsMetadata.key ? contextHook : contextHook.get(argsMetadata.key);
|
|
244
|
+
break;
|
|
245
|
+
case requestHeadersArgsKey:
|
|
246
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
247
|
+
? request.headers
|
|
248
|
+
: await argumentsResolution(request.headers.toJSON(), argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
249
|
+
break;
|
|
250
|
+
case responseHeadersArgsKey:
|
|
251
|
+
args[argsMetadata.index] = context[argsMetadata.type];
|
|
252
|
+
break;
|
|
253
|
+
case requestHeaderArgsKey:
|
|
254
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
255
|
+
? request.headers.get(argsMetadata.key) || undefined
|
|
256
|
+
: await argumentsResolution(request.headers.get(argsMetadata.key) || undefined, argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
257
|
+
break;
|
|
258
|
+
case routeModelArgsKey:
|
|
259
|
+
break;
|
|
260
|
+
default:
|
|
261
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
262
|
+
? !(argsMetadata.type in context)
|
|
263
|
+
? undefined
|
|
264
|
+
: context[argsMetadata.type]
|
|
265
|
+
: await argumentsResolution(!(argsMetadata.type in context) ? undefined : context[argsMetadata.type], argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
266
|
+
break;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
context[responseBodyArgsKey] = await collection.func(...args);
|
|
271
|
+
if (context[responseBodyArgsKey] instanceof Response) {
|
|
272
|
+
return responseConverter(context[responseBodyArgsKey]);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// Execute guard(s)
|
|
276
|
+
for (let i = 0; i < guardGroup.length; i++) {
|
|
277
|
+
const args = [];
|
|
278
|
+
const collection = guardGroup[i];
|
|
279
|
+
const metadata = Reflect.getOwnMetadata(argumentsKey, collection.class, collection.funcName) || {};
|
|
280
|
+
if (metadata) {
|
|
281
|
+
for (const [_key, argsMetadata] of Object.entries(metadata)) {
|
|
282
|
+
switch (argsMetadata.type) {
|
|
283
|
+
case requestArgsKey:
|
|
284
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
285
|
+
? request
|
|
286
|
+
: await argumentsResolution(request, argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
287
|
+
break;
|
|
288
|
+
case requestBodyArgsKey:
|
|
289
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
290
|
+
? await request[argsMetadata.parser || "json"]()
|
|
291
|
+
: await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
292
|
+
break;
|
|
293
|
+
case contextArgsKey:
|
|
294
|
+
args[argsMetadata.index] = !argsMetadata.key ? contextHook : contextHook.get(argsMetadata.key);
|
|
295
|
+
break;
|
|
296
|
+
case requestHeadersArgsKey:
|
|
297
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
298
|
+
? request.headers
|
|
299
|
+
: await argumentsResolution(request.headers.toJSON(), argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
300
|
+
break;
|
|
301
|
+
case responseHeadersArgsKey:
|
|
302
|
+
args[argsMetadata.index] = context[argsMetadata.type];
|
|
303
|
+
break;
|
|
304
|
+
case requestHeaderArgsKey:
|
|
305
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
306
|
+
? request.headers.get(argsMetadata.key) || undefined
|
|
307
|
+
: await argumentsResolution(request.headers.get(argsMetadata.key) || undefined, argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
308
|
+
break;
|
|
309
|
+
case routeModelArgsKey:
|
|
310
|
+
break;
|
|
311
|
+
default:
|
|
312
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
313
|
+
? context[argsMetadata.type]
|
|
314
|
+
: await argumentsResolution(context[argsMetadata.type], argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
const guardResult = await collection.func(...args);
|
|
320
|
+
if (typeof guardResult !== "boolean" || !guardResult) {
|
|
321
|
+
throw new HttpClientError({
|
|
322
|
+
httpCode: 401,
|
|
323
|
+
message: "Unauthorization.",
|
|
324
|
+
data: undefined
|
|
180
325
|
});
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// Execute open dispatcher(s)
|
|
329
|
+
for (let i = 0; i < openDispatcherGroup.length; i++) {
|
|
330
|
+
const args = [];
|
|
331
|
+
const collection = openDispatcherGroup[i];
|
|
332
|
+
const metadata = Reflect.getOwnMetadata(argumentsKey, collection.class, collection.funcName) || {};
|
|
333
|
+
if (metadata) {
|
|
334
|
+
for (const [_key, argsMetadata] of Object.entries(metadata)) {
|
|
335
|
+
switch (argsMetadata.type) {
|
|
336
|
+
case requestArgsKey:
|
|
337
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
338
|
+
? request
|
|
339
|
+
: await argumentsResolution(request, argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
340
|
+
break;
|
|
341
|
+
case requestBodyArgsKey:
|
|
342
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
343
|
+
? await request[argsMetadata.parser || "json"]()
|
|
344
|
+
: await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
345
|
+
break;
|
|
346
|
+
case contextArgsKey:
|
|
347
|
+
args[argsMetadata.index] = !argsMetadata.key ? contextHook : contextHook.get(argsMetadata.key);
|
|
348
|
+
break;
|
|
349
|
+
case requestHeadersArgsKey:
|
|
350
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
351
|
+
? request.headers
|
|
352
|
+
: await argumentsResolution(request.headers.toJSON(), argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
353
|
+
break;
|
|
354
|
+
case responseHeadersArgsKey:
|
|
355
|
+
args[argsMetadata.index] = context[argsMetadata.type];
|
|
356
|
+
break;
|
|
357
|
+
case requestHeaderArgsKey:
|
|
358
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
359
|
+
? request.headers.get(argsMetadata.key) || undefined
|
|
360
|
+
: await argumentsResolution(request.headers.get(argsMetadata.key) || undefined, argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
361
|
+
break;
|
|
362
|
+
case paramArgsKey:
|
|
363
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
364
|
+
? context[paramsArgsKey][argsMetadata.key] || undefined
|
|
365
|
+
: await argumentsResolution(context[paramsArgsKey][argsMetadata.key], argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
366
|
+
break;
|
|
367
|
+
case routeModelArgsKey:
|
|
368
|
+
args[argsMetadata.index] = context[routeModelArgsKey];
|
|
369
|
+
break;
|
|
370
|
+
default:
|
|
371
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
372
|
+
? context[argsMetadata.type]
|
|
373
|
+
: await argumentsResolution(context[argsMetadata.type], argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
374
|
+
break;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
context[responseBodyArgsKey] = await collection.func(...args);
|
|
379
|
+
}
|
|
380
|
+
// Execute controller action
|
|
381
|
+
const controllerActionArguments = [];
|
|
382
|
+
const controllerActionCollection = model;
|
|
383
|
+
const controllerActionMetadata = Reflect.getOwnMetadata(argumentsKey, controllerActionCollection.class, controllerActionCollection.funcName) || {};
|
|
384
|
+
if (controllerActionMetadata) {
|
|
385
|
+
for (const [_key, argsMetadata] of Object.entries(controllerActionMetadata)) {
|
|
386
|
+
switch (argsMetadata.type) {
|
|
387
|
+
case requestArgsKey:
|
|
388
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
389
|
+
? request
|
|
390
|
+
: await argumentsResolution(request, argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
|
|
391
|
+
break;
|
|
392
|
+
case requestBodyArgsKey:
|
|
393
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
394
|
+
? await request[argsMetadata.parser || "json"]()
|
|
395
|
+
: await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
|
|
396
|
+
break;
|
|
397
|
+
case contextArgsKey:
|
|
398
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.key
|
|
399
|
+
? contextHook
|
|
400
|
+
: contextHook.get(argsMetadata.key);
|
|
401
|
+
break;
|
|
402
|
+
case requestHeadersArgsKey:
|
|
403
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
404
|
+
? request.headers
|
|
405
|
+
: await argumentsResolution(request.headers.toJSON(), argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
|
|
406
|
+
break;
|
|
407
|
+
case responseHeadersArgsKey:
|
|
408
|
+
controllerActionArguments[argsMetadata.index] = context[argsMetadata.type];
|
|
409
|
+
break;
|
|
410
|
+
case requestHeaderArgsKey:
|
|
411
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
412
|
+
? request.headers.get(argsMetadata.key) || undefined
|
|
413
|
+
: await argumentsResolution(request.headers.get(argsMetadata.key) || undefined, argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
|
|
414
|
+
break;
|
|
415
|
+
case paramArgsKey:
|
|
416
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
417
|
+
? context[paramsArgsKey][argsMetadata.key] || undefined
|
|
418
|
+
: await argumentsResolution(context[paramsArgsKey][argsMetadata.key], argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
|
|
419
|
+
break;
|
|
420
|
+
case routeModelArgsKey:
|
|
421
|
+
controllerActionArguments[argsMetadata.index] = context[routeModelArgsKey];
|
|
422
|
+
break;
|
|
423
|
+
default:
|
|
424
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
425
|
+
? context[argsMetadata.type]
|
|
426
|
+
: await argumentsResolution(context[argsMetadata.type], argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
|
|
427
|
+
break;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
context[responseBodyArgsKey] = await controllerActionCollection.func(...controllerActionArguments);
|
|
432
|
+
// Execute close dispatcher(s)
|
|
433
|
+
for (let i = 0; i < closeDispatcherGroup.length; i++) {
|
|
434
|
+
const args = [];
|
|
435
|
+
const collection = closeDispatcherGroup[i];
|
|
436
|
+
const metadata = Reflect.getOwnMetadata(argumentsKey, collection.class, collection.funcName) || {};
|
|
437
|
+
if (metadata) {
|
|
438
|
+
for (const [_key, argsMetadata] of Object.entries(metadata)) {
|
|
439
|
+
switch (argsMetadata.type) {
|
|
440
|
+
case requestArgsKey:
|
|
441
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
442
|
+
? request
|
|
443
|
+
: await argumentsResolution(request, argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
444
|
+
break;
|
|
445
|
+
case requestBodyArgsKey:
|
|
446
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
447
|
+
? await request[argsMetadata.parser || "json"]()
|
|
448
|
+
: await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
449
|
+
break;
|
|
450
|
+
case contextArgsKey:
|
|
451
|
+
args[argsMetadata.index] = !argsMetadata.key ? contextHook : contextHook.get(argsMetadata.key);
|
|
452
|
+
break;
|
|
453
|
+
case requestHeadersArgsKey:
|
|
454
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
455
|
+
? request.headers
|
|
456
|
+
: await argumentsResolution(request.headers.toJSON(), argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
457
|
+
break;
|
|
458
|
+
case responseHeadersArgsKey:
|
|
459
|
+
args[argsMetadata.index] = context[argsMetadata.type];
|
|
460
|
+
break;
|
|
461
|
+
case requestHeaderArgsKey:
|
|
462
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
463
|
+
? request.headers.get(argsMetadata.key) || undefined
|
|
464
|
+
: await argumentsResolution(request.headers.get(argsMetadata.key) || undefined, argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
465
|
+
break;
|
|
466
|
+
case paramArgsKey:
|
|
467
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
468
|
+
? context[paramsArgsKey][argsMetadata.key] || undefined
|
|
469
|
+
: await argumentsResolution(context[paramsArgsKey][argsMetadata.key], argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
470
|
+
break;
|
|
471
|
+
case routeModelArgsKey:
|
|
472
|
+
args[argsMetadata.index] = context[routeModelArgsKey];
|
|
473
|
+
break;
|
|
474
|
+
default:
|
|
475
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
476
|
+
? context[argsMetadata.type]
|
|
477
|
+
: await argumentsResolution(context[argsMetadata.type], argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
478
|
+
break;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
await collection.func(...args);
|
|
483
|
+
}
|
|
484
|
+
// Execute end middleware(s)
|
|
485
|
+
for (let i = 0; i < endMiddlewareGroup.length; i++) {
|
|
486
|
+
const args = [];
|
|
487
|
+
const collection = endMiddlewareGroup[i];
|
|
488
|
+
const metadata = Reflect.getOwnMetadata(argumentsKey, collection.class, collection.funcName) || {};
|
|
489
|
+
if (metadata) {
|
|
490
|
+
for (const [_key, argsMetadata] of Object.entries(metadata)) {
|
|
491
|
+
switch (argsMetadata.type) {
|
|
492
|
+
case requestArgsKey:
|
|
493
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
494
|
+
? request
|
|
495
|
+
: await argumentsResolution(request, argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
496
|
+
break;
|
|
497
|
+
case requestBodyArgsKey:
|
|
498
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
499
|
+
? await request[argsMetadata.parser || "json"]()
|
|
500
|
+
: await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
501
|
+
break;
|
|
502
|
+
case contextArgsKey:
|
|
503
|
+
args[argsMetadata.index] = !argsMetadata.key ? contextHook : contextHook.get(argsMetadata.key);
|
|
504
|
+
break;
|
|
505
|
+
case requestHeadersArgsKey:
|
|
506
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
507
|
+
? request.headers
|
|
508
|
+
: await argumentsResolution(request.headers.toJSON(), argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
509
|
+
break;
|
|
510
|
+
case responseHeadersArgsKey:
|
|
511
|
+
args[argsMetadata.index] = context[argsMetadata.type];
|
|
512
|
+
break;
|
|
513
|
+
case requestHeaderArgsKey:
|
|
514
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
515
|
+
? request.headers.get(argsMetadata.key) || undefined
|
|
516
|
+
: await argumentsResolution(request.headers.get(argsMetadata.key) || undefined, argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
517
|
+
break;
|
|
518
|
+
case routeModelArgsKey:
|
|
519
|
+
break;
|
|
520
|
+
default:
|
|
521
|
+
args[argsMetadata.index] = !argsMetadata.zodSchema
|
|
522
|
+
? !(argsMetadata.type in context)
|
|
523
|
+
? undefined
|
|
524
|
+
: context[argsMetadata.type]
|
|
525
|
+
: await argumentsResolution(!(argsMetadata.type in context) ? undefined : context[argsMetadata.type], argsMetadata.zodSchema, argsMetadata.index, collection.funcName);
|
|
526
|
+
break;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
context[responseBodyArgsKey] = await collection.func(...args);
|
|
531
|
+
}
|
|
532
|
+
if (context[responseBodyArgsKey] instanceof Response) {
|
|
533
|
+
return responseConverter(context[responseBodyArgsKey]);
|
|
534
|
+
}
|
|
535
|
+
return responseConverter(new Response(!context[responseBodyArgsKey]
|
|
536
|
+
? undefined
|
|
537
|
+
: JSON.stringify({
|
|
538
|
+
httpCode: 200,
|
|
539
|
+
message: "SUCCESS",
|
|
540
|
+
data: context[responseBodyArgsKey]
|
|
541
|
+
}), {
|
|
542
|
+
status: !context[responseBodyArgsKey] ? 204 : 200,
|
|
543
|
+
statusText: "SUCCESS",
|
|
544
|
+
headers: context[responseHeadersArgsKey]
|
|
545
|
+
}));
|
|
546
|
+
};
|
|
547
|
+
export const BoolFactory = async (modules, options) => {
|
|
548
|
+
try {
|
|
549
|
+
const modulesConverted = !Array.isArray(modules) ? [modules] : modules;
|
|
550
|
+
const { allowLogsMethods } = Object.freeze({
|
|
551
|
+
allowLogsMethods: options?.log?.methods
|
|
552
|
+
});
|
|
553
|
+
const moduleResolutions = await Promise.all(modulesConverted.map((moduleConverted) => moduleResolution(moduleConverted, options)));
|
|
554
|
+
const availableModuleResolutions = moduleResolutions.filter((moduleResolution) => typeof moduleResolution !== "undefined");
|
|
555
|
+
const prefixs = [
|
|
556
|
+
...new Set(availableModuleResolutions.map((availableModuleResolution) => availableModuleResolution.prefix))
|
|
557
|
+
];
|
|
558
|
+
if (prefixs.length !== availableModuleResolutions.length) {
|
|
559
|
+
throw Error(`Module prefix should be unique.`);
|
|
560
|
+
}
|
|
181
561
|
Bun.serve({
|
|
182
562
|
port: options.port,
|
|
183
563
|
fetch: async (request, server) => {
|
|
184
|
-
const { headers } = request;
|
|
185
564
|
const start = performance.now();
|
|
186
565
|
const url = new URL(request.url);
|
|
187
|
-
const
|
|
188
|
-
[requestHeadersArgsKey]: headers,
|
|
189
|
-
[responseHeadersArgsKey]: new Headers(),
|
|
190
|
-
[queryArgsKey]: Qs.parse(url.searchParams.toString(), options.queryParser)
|
|
191
|
-
};
|
|
192
|
-
const contextHook = {
|
|
193
|
-
get(key) {
|
|
194
|
-
return context[key];
|
|
195
|
-
},
|
|
196
|
-
set(key, value) {
|
|
197
|
-
if (key in context) {
|
|
198
|
-
throw Error(`${String(key)} already exists in context.`);
|
|
199
|
-
}
|
|
200
|
-
context[key] = value;
|
|
201
|
-
}
|
|
202
|
-
};
|
|
566
|
+
const query = Qs.parse(url.searchParams.toString(), options.queryParser);
|
|
203
567
|
try {
|
|
204
|
-
|
|
205
|
-
for (let i = 0; i <
|
|
206
|
-
const
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
for (const [_key, argsMetadata] of Object.entries(middlewareMetadata)) {
|
|
212
|
-
switch (argsMetadata.type) {
|
|
213
|
-
case requestArgsKey:
|
|
214
|
-
middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
215
|
-
? request
|
|
216
|
-
: await argumentsResolution(request, argsMetadata.zodSchema, argsMetadata.index, middlewareCollection.funcName);
|
|
217
|
-
break;
|
|
218
|
-
case bodyArgsKey:
|
|
219
|
-
middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
220
|
-
? await request[argsMetadata.parser || "json"]()
|
|
221
|
-
: await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, middlewareCollection.funcName);
|
|
222
|
-
break;
|
|
223
|
-
case contextArgsKey:
|
|
224
|
-
middlewareArguments[argsMetadata.index] = !argsMetadata.key
|
|
225
|
-
? contextHook
|
|
226
|
-
: contextHook.get(argsMetadata.key);
|
|
227
|
-
break;
|
|
228
|
-
case requestHeadersArgsKey:
|
|
229
|
-
middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
230
|
-
? headers
|
|
231
|
-
: await argumentsResolution(headers.toJSON(), argsMetadata.zodSchema, argsMetadata.index, middlewareCollection.funcName);
|
|
232
|
-
break;
|
|
233
|
-
case responseHeadersArgsKey:
|
|
234
|
-
middlewareArguments[argsMetadata.index] = context[argsMetadata.type];
|
|
235
|
-
break;
|
|
236
|
-
case requestHeaderArgsKey:
|
|
237
|
-
middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
238
|
-
? headers.get(argsMetadata.key) || undefined
|
|
239
|
-
: await argumentsResolution(headers.get(argsMetadata.key) || undefined, argsMetadata.zodSchema, argsMetadata.index, middlewareCollection.funcName);
|
|
240
|
-
break;
|
|
241
|
-
case routeModelArgsKey:
|
|
242
|
-
break;
|
|
243
|
-
default:
|
|
244
|
-
middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
245
|
-
? !(argsMetadata.type in context)
|
|
246
|
-
? undefined
|
|
247
|
-
: context[argsMetadata.type]
|
|
248
|
-
: await argumentsResolution(!(argsMetadata.type in context) ? undefined : context[argsMetadata.type], argsMetadata.zodSchema, argsMetadata.index, middlewareCollection.funcName);
|
|
249
|
-
break;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
const middlewareResult = await middlewareCollection.func(...middlewareArguments);
|
|
254
|
-
if (!(middlewareResult instanceof Response)) {
|
|
255
|
-
continue;
|
|
256
|
-
}
|
|
257
|
-
return middlewareResult;
|
|
258
|
-
}
|
|
259
|
-
// Execute guard(s)
|
|
260
|
-
for (let i = 0; i < guardGroup.length; i++) {
|
|
261
|
-
const guardArguments = [];
|
|
262
|
-
const guardCollection = guardGroup[i];
|
|
263
|
-
const guardMetadata = Reflect.getOwnMetadata(argumentsKey, guardCollection.class, guardCollection.funcName) || {};
|
|
264
|
-
if (guardMetadata) {
|
|
265
|
-
for (const [_key, argsMetadata] of Object.entries(guardMetadata)) {
|
|
266
|
-
switch (argsMetadata.type) {
|
|
267
|
-
case requestArgsKey:
|
|
268
|
-
guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
269
|
-
? request
|
|
270
|
-
: await argumentsResolution(request, argsMetadata.zodSchema, argsMetadata.index, guardCollection.funcName);
|
|
271
|
-
break;
|
|
272
|
-
case bodyArgsKey:
|
|
273
|
-
guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
274
|
-
? await request[argsMetadata.parser || "json"]()
|
|
275
|
-
: await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, guardCollection.funcName);
|
|
276
|
-
break;
|
|
277
|
-
case contextArgsKey:
|
|
278
|
-
guardArguments[argsMetadata.index] = !argsMetadata.key
|
|
279
|
-
? contextHook
|
|
280
|
-
: contextHook.get(argsMetadata.key);
|
|
281
|
-
break;
|
|
282
|
-
case requestHeadersArgsKey:
|
|
283
|
-
guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
284
|
-
? headers
|
|
285
|
-
: await argumentsResolution(headers.toJSON(), argsMetadata.zodSchema, argsMetadata.index, guardCollection.funcName);
|
|
286
|
-
break;
|
|
287
|
-
case responseHeadersArgsKey:
|
|
288
|
-
guardArguments[argsMetadata.index] = context[argsMetadata.type];
|
|
289
|
-
break;
|
|
290
|
-
case requestHeaderArgsKey:
|
|
291
|
-
guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
292
|
-
? headers.get(argsMetadata.key) || undefined
|
|
293
|
-
: await argumentsResolution(headers.get(argsMetadata.key) || undefined, argsMetadata.zodSchema, argsMetadata.index, guardCollection.funcName);
|
|
294
|
-
break;
|
|
295
|
-
case routeModelArgsKey:
|
|
296
|
-
break;
|
|
297
|
-
default:
|
|
298
|
-
guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
299
|
-
? context[argsMetadata.type]
|
|
300
|
-
: await argumentsResolution(context[argsMetadata.type], argsMetadata.zodSchema, argsMetadata.index, guardCollection.funcName);
|
|
301
|
-
break;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
const guardResult = await guardCollection.func(...guardArguments);
|
|
306
|
-
if (typeof guardResult !== "boolean" || !guardResult) {
|
|
307
|
-
throw new HttpClientError({
|
|
308
|
-
httpCode: 401,
|
|
309
|
-
message: "Unauthorization.",
|
|
310
|
-
data: undefined
|
|
568
|
+
let collection;
|
|
569
|
+
for (let i = 0; i < availableModuleResolutions.length; i++) {
|
|
570
|
+
const routeResult = availableModuleResolutions[i].routerGroup.find(url.pathname, request.method);
|
|
571
|
+
if (routeResult) {
|
|
572
|
+
collection = Object.freeze({
|
|
573
|
+
route: routeResult,
|
|
574
|
+
resolution: availableModuleResolutions[i]
|
|
311
575
|
});
|
|
576
|
+
break;
|
|
312
577
|
}
|
|
313
578
|
}
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
throw new HttpClientError({
|
|
579
|
+
if (!collection) {
|
|
580
|
+
return responseConverter(new Response(JSON.stringify({
|
|
317
581
|
httpCode: 404,
|
|
318
|
-
message: "Route not found
|
|
582
|
+
message: "Route not found",
|
|
319
583
|
data: undefined
|
|
320
|
-
});
|
|
321
|
-
}
|
|
322
|
-
context[paramsArgsKey] = result.parameters;
|
|
323
|
-
context[routeModelArgsKey] = result.model;
|
|
324
|
-
let responseBody = undefined;
|
|
325
|
-
// Execute before dispatcher(s)
|
|
326
|
-
for (let i = 0; i < beforeDispatcherGroup.length; i++) {
|
|
327
|
-
const beforeDispatcherArguments = [];
|
|
328
|
-
const beforeDispatcherCollection = beforeDispatcherGroup[i];
|
|
329
|
-
const beforeDispatcherMetadata = Reflect.getOwnMetadata(argumentsKey, beforeDispatcherCollection.class, beforeDispatcherCollection.funcName) || {};
|
|
330
|
-
if (beforeDispatcherMetadata) {
|
|
331
|
-
for (const [_key, argsMetadata] of Object.entries(beforeDispatcherMetadata)) {
|
|
332
|
-
switch (argsMetadata.type) {
|
|
333
|
-
case requestArgsKey:
|
|
334
|
-
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
335
|
-
? request
|
|
336
|
-
: await argumentsResolution(request, argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
|
|
337
|
-
break;
|
|
338
|
-
case bodyArgsKey:
|
|
339
|
-
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
340
|
-
? await request[argsMetadata.parser || "json"]()
|
|
341
|
-
: await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
|
|
342
|
-
break;
|
|
343
|
-
case contextArgsKey:
|
|
344
|
-
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.key
|
|
345
|
-
? contextHook
|
|
346
|
-
: contextHook.get(argsMetadata.key);
|
|
347
|
-
break;
|
|
348
|
-
case requestHeadersArgsKey:
|
|
349
|
-
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
350
|
-
? headers
|
|
351
|
-
: await argumentsResolution(headers.toJSON(), argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
|
|
352
|
-
break;
|
|
353
|
-
case responseHeadersArgsKey:
|
|
354
|
-
beforeDispatcherArguments[argsMetadata.index] = context[argsMetadata.type];
|
|
355
|
-
break;
|
|
356
|
-
case requestHeaderArgsKey:
|
|
357
|
-
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
358
|
-
? headers.get(argsMetadata.key) || undefined
|
|
359
|
-
: await argumentsResolution(headers.get(argsMetadata.key) || undefined, argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
|
|
360
|
-
break;
|
|
361
|
-
case paramArgsKey:
|
|
362
|
-
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
363
|
-
? context[paramArgsKey][argsMetadata.key] || undefined
|
|
364
|
-
: await argumentsResolution(context[paramArgsKey][argsMetadata.key], argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
|
|
365
|
-
break;
|
|
366
|
-
case routeModelArgsKey:
|
|
367
|
-
beforeDispatcherArguments[argsMetadata.index] = context[routeModelArgsKey];
|
|
368
|
-
break;
|
|
369
|
-
default:
|
|
370
|
-
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
371
|
-
? context[argsMetadata.type]
|
|
372
|
-
: await argumentsResolution(context[argsMetadata.type], argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
|
|
373
|
-
break;
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
await beforeDispatcherCollection.func(...beforeDispatcherArguments);
|
|
378
|
-
}
|
|
379
|
-
// Execute controller action
|
|
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;
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
responseBody = await controllerActionCollection.func(...controllerActionArguments);
|
|
431
|
-
// Execute after dispatcher(s)
|
|
432
|
-
for (let i = 0; i < afterDispatcherGroup.length; i++) {
|
|
433
|
-
const afterDispatcherArguments = [];
|
|
434
|
-
const afterDispatcherCollection = afterDispatcherGroup[i];
|
|
435
|
-
const afterDispatcherMetadata = Reflect.getOwnMetadata(argumentsKey, afterDispatcherCollection.class, afterDispatcherCollection.funcName) || {};
|
|
436
|
-
if (afterDispatcherMetadata) {
|
|
437
|
-
for (const [_key, argsMetadata] of Object.entries(afterDispatcherMetadata)) {
|
|
438
|
-
switch (argsMetadata.type) {
|
|
439
|
-
case requestArgsKey:
|
|
440
|
-
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
441
|
-
? request
|
|
442
|
-
: await argumentsResolution(request, argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
|
|
443
|
-
break;
|
|
444
|
-
case bodyArgsKey:
|
|
445
|
-
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
446
|
-
? await request[argsMetadata.parser || "json"]()
|
|
447
|
-
: await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
|
|
448
|
-
break;
|
|
449
|
-
case contextArgsKey:
|
|
450
|
-
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.key
|
|
451
|
-
? contextHook
|
|
452
|
-
: contextHook.get(argsMetadata.key);
|
|
453
|
-
break;
|
|
454
|
-
case requestHeadersArgsKey:
|
|
455
|
-
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
456
|
-
? headers
|
|
457
|
-
: await argumentsResolution(headers.toJSON(), argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
|
|
458
|
-
break;
|
|
459
|
-
case responseHeadersArgsKey:
|
|
460
|
-
afterDispatcherArguments[argsMetadata.index] = context[argsMetadata.type];
|
|
461
|
-
break;
|
|
462
|
-
case requestHeaderArgsKey:
|
|
463
|
-
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
464
|
-
? headers.get(argsMetadata.key) || undefined
|
|
465
|
-
: await argumentsResolution(headers.get(argsMetadata.key) || undefined, argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
|
|
466
|
-
break;
|
|
467
|
-
case paramArgsKey:
|
|
468
|
-
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
469
|
-
? context[paramArgsKey][argsMetadata.key] || undefined
|
|
470
|
-
: await argumentsResolution(context[paramArgsKey][argsMetadata.key], argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
|
|
471
|
-
break;
|
|
472
|
-
case routeModelArgsKey:
|
|
473
|
-
afterDispatcherArguments[argsMetadata.index] = context[routeModelArgsKey];
|
|
474
|
-
break;
|
|
475
|
-
default:
|
|
476
|
-
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
477
|
-
? context[argsMetadata.type]
|
|
478
|
-
: await argumentsResolution(context[argsMetadata.type], argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
|
|
479
|
-
break;
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
await afterDispatcherCollection.func(...afterDispatcherArguments);
|
|
584
|
+
})));
|
|
484
585
|
}
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
:
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
message: "SUCCESS",
|
|
494
|
-
data: responseBody
|
|
495
|
-
}), {
|
|
496
|
-
status: !responseBody ? 204 : 200,
|
|
497
|
-
statusText: "SUCCESS",
|
|
498
|
-
headers: context[responseHeadersArgsKey]
|
|
499
|
-
});
|
|
586
|
+
return await fetcher({
|
|
587
|
+
request,
|
|
588
|
+
server
|
|
589
|
+
}, {
|
|
590
|
+
query: query,
|
|
591
|
+
route: collection.route,
|
|
592
|
+
moduleResolution: collection.resolution
|
|
593
|
+
}, options);
|
|
500
594
|
}
|
|
501
595
|
catch (error) {
|
|
502
596
|
options.debug && console.error(error);
|
|
503
|
-
|
|
504
|
-
context[responseHeadersArgsKey].set("X-Powered-By", "Bool Typescript");
|
|
505
|
-
return jsonErrorInfer(error, context[responseHeadersArgsKey]);
|
|
597
|
+
return responseConverter(jsonErrorInfer(error));
|
|
506
598
|
}
|
|
507
599
|
finally {
|
|
508
600
|
if (allowLogsMethods) {
|
|
@@ -515,7 +607,7 @@ export const BoolFactory = async (target, options) => {
|
|
|
515
607
|
"<Unknown>"}`.yellow;
|
|
516
608
|
const convertedTime = `${Math.round((end - start + Number.EPSILON) * 10 ** 2) / 10 ** 2}ms`.yellow;
|
|
517
609
|
allowLogsMethods.includes(request.method.toUpperCase()) &&
|
|
518
|
-
console.info(`PID: ${convertedPID} - Method: ${convertedMethod} - IP: ${convertedReqIp} - ${url.pathname.blue} - Time: ${convertedTime}`);
|
|
610
|
+
console.info(`PID: ${convertedPID} - Method: ${convertedMethod} - IP: ${convertedReqIp} - ${new URL(request.url).pathname.blue} - Time: ${convertedTime}`);
|
|
519
611
|
}
|
|
520
612
|
}
|
|
521
613
|
}
|