@bool-ts/core 1.6.0 → 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/__test/controller.ts +6 -1
  2. package/__test/module.ts +11 -3
  3. package/dist/decorators/arguments.d.ts +10 -21
  4. package/dist/decorators/arguments.js +73 -99
  5. package/dist/decorators/controller.d.ts +0 -1
  6. package/dist/decorators/controller.js +2 -2
  7. package/dist/decorators/dispatcher.d.ts +0 -1
  8. package/dist/decorators/dispatcher.js +1 -1
  9. package/dist/decorators/guard.d.ts +0 -1
  10. package/dist/decorators/guard.js +1 -1
  11. package/dist/decorators/http.d.ts +0 -1
  12. package/dist/decorators/http.js +1 -1
  13. package/dist/decorators/index.d.ts +10 -10
  14. package/dist/decorators/index.js +10 -10
  15. package/dist/decorators/inject.d.ts +2 -3
  16. package/dist/decorators/inject.js +3 -3
  17. package/dist/decorators/injectable.d.ts +0 -1
  18. package/dist/decorators/injectable.js +1 -1
  19. package/dist/decorators/middleware.d.ts +0 -1
  20. package/dist/decorators/middleware.js +1 -1
  21. package/dist/decorators/module.d.ts +12 -8
  22. package/dist/decorators/module.js +1 -6
  23. package/dist/decorators/zodSchema.d.ts +0 -1
  24. package/dist/decorators/zodSchema.js +1 -1
  25. package/dist/hooks/factory.d.ts +1 -1
  26. package/dist/hooks/factory.js +126 -129
  27. package/dist/hooks/injector.d.ts +5 -3
  28. package/dist/hooks/injector.js +20 -9
  29. package/dist/index.d.ts +1 -0
  30. package/dist/index.js +1 -0
  31. package/dist/interfaces/context.d.ts +4 -0
  32. package/dist/interfaces/context.js +1 -0
  33. package/dist/interfaces/index.d.ts +3 -2
  34. package/dist/keys/index.d.ts +19 -0
  35. package/dist/keys/index.js +19 -0
  36. package/package.json +1 -1
  37. package/src/decorators/arguments.ts +74 -84
  38. package/src/decorators/controller.ts +2 -3
  39. package/src/decorators/dispatcher.ts +1 -2
  40. package/src/decorators/guard.ts +1 -2
  41. package/src/decorators/http.ts +2 -2
  42. package/src/decorators/index.ts +10 -20
  43. package/src/decorators/inject.ts +3 -3
  44. package/src/decorators/injectable.ts +1 -1
  45. package/src/decorators/middleware.ts +1 -2
  46. package/src/decorators/module.ts +14 -14
  47. package/src/decorators/zodSchema.ts +1 -2
  48. package/src/hooks/factory.ts +153 -149
  49. package/src/hooks/injector.ts +26 -11
  50. package/src/index.ts +1 -0
  51. package/src/interfaces/context.ts +4 -0
  52. package/src/interfaces/index.ts +3 -2
  53. package/src/keys/index.ts +20 -0
@@ -3,8 +3,8 @@ import "reflect-metadata";
3
3
  import Qs from "qs";
4
4
  import * as Zod from "zod";
5
5
  import { Router, RouterGroup } from "../entities";
6
- import { controllerHttpKey, controllerKey, argumentsKey, moduleKey, EArgumentTypes } from "../decorators";
7
6
  import { HttpClientError, HttpServerError, jsonErrorInfer } from "../http";
7
+ import { argumentsKey, bodyArgsKey, configKey, contextArgsKey, controllerHttpKey, controllerKey, moduleKey, paramArgsKey, paramsArgsKey, queryArgsKey, requestArgsKey, requestHeadersArgsKey, responseHeadersArgsKey } from "../keys";
8
8
  import { Injector } from "./injector";
9
9
  export const controllerCreator = (controllerConstructor, group, prefix) => {
10
10
  if (!Reflect.getOwnMetadataKeys(controllerConstructor).includes(controllerKey)) {
@@ -58,7 +58,7 @@ export const argumentsResolution = async (data, zodSchema, argumentIndex, funcNa
58
58
  data: validation.error.issues
59
59
  });
60
60
  }
61
- return validation.data;
61
+ return data;
62
62
  }
63
63
  catch (error) {
64
64
  if (error instanceof HttpClientError) {
@@ -91,7 +91,43 @@ export const BoolFactory = async (target, options) => {
91
91
  fetch: () => new Response()
92
92
  });
93
93
  }
94
- const { middlewares, guards, beforeDispatchers, controllers, afterDispatchers, prefix: modulePrefix, config: moduleConfig } = moduleMetadata;
94
+ const { loaders, middlewares, guards, beforeDispatchers, controllers, afterDispatchers, prefix: modulePrefix, config: moduleConfig } = moduleMetadata;
95
+ // Configuration(s)
96
+ const { allowLogsMethods, config } = Object.freeze({
97
+ allowLogsMethods: options?.log?.methods,
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())
105
+ }
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
+ }
123
+ });
124
+ }
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
+ }
95
131
  // Middleware(s)
96
132
  const middlewareGroup = !middlewares
97
133
  ? []
@@ -140,21 +176,28 @@ export const BoolFactory = async (target, options) => {
140
176
  func: afterDispatcherInstance.execute.bind(afterDispatcherInstance)
141
177
  });
142
178
  });
143
- const { allowLogsMethods, config } = Object.freeze({
144
- allowLogsMethods: options?.log?.methods,
145
- config: {
146
- ...(typeof options.config !== "function" ? options.config : await options.config()),
147
- ...(typeof moduleConfig !== "function" ? moduleConfig : await moduleConfig())
148
- }
149
- });
150
179
  Bun.serve({
151
180
  port: options.port,
152
181
  fetch: async (request) => {
182
+ const { headers } = request;
153
183
  const start = performance.now();
154
184
  const url = new URL(request.url);
155
- const reqHeaders = request.headers;
156
- const resHeaders = new Headers();
157
- const query = Qs.parse(url.searchParams.toString(), options.queryParser);
185
+ const context = {
186
+ [requestHeadersArgsKey]: headers,
187
+ [responseHeadersArgsKey]: new Headers(),
188
+ [queryArgsKey]: Qs.parse(url.searchParams.toString(), options.queryParser)
189
+ };
190
+ const contextHook = {
191
+ get(key) {
192
+ return context[key];
193
+ },
194
+ set(key, value) {
195
+ if (key in context) {
196
+ throw Error(`${String(key)} already exists in context.`);
197
+ }
198
+ context[key] = value;
199
+ }
200
+ };
158
201
  try {
159
202
  // Execute middleware(s)
160
203
  for (let i = 0; i < middlewareGroup.length; i++) {
@@ -165,29 +208,25 @@ export const BoolFactory = async (target, options) => {
165
208
  if (middlewareMetadata) {
166
209
  for (const [_key, argsMetadata] of Object.entries(middlewareMetadata)) {
167
210
  switch (argsMetadata.type) {
168
- case EArgumentTypes.requestHeaders:
211
+ case requestArgsKey:
169
212
  middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
170
- ? reqHeaders
171
- : await argumentsResolution(reqHeaders, argsMetadata.zodSchema, argsMetadata.index, middlewareCollection.funcName);
213
+ ? request
214
+ : await argumentsResolution(request, argsMetadata.zodSchema, argsMetadata.index, middlewareCollection.funcName);
172
215
  break;
173
- case EArgumentTypes.body:
216
+ case bodyArgsKey:
174
217
  middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
175
218
  ? await request[argsMetadata.parser || "json"]()
176
219
  : await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, middlewareCollection.funcName);
177
220
  break;
178
- case EArgumentTypes.query:
179
- middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
180
- ? query
181
- : await argumentsResolution(query, argsMetadata.zodSchema, argsMetadata.index, middlewareCollection.funcName);
182
- break;
183
- case EArgumentTypes.request:
184
- middlewareArguments[argsMetadata.index] = request;
221
+ case contextArgsKey:
222
+ middlewareArguments[argsMetadata.index] = contextHook;
185
223
  break;
186
- case EArgumentTypes.responseHeaders:
187
- middlewareArguments[argsMetadata.index] = resHeaders;
188
- break;
189
- case EArgumentTypes.config:
190
- middlewareArguments[argsMetadata.index] = config;
224
+ default:
225
+ middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
226
+ ? !(argsMetadata.type in context)
227
+ ? undefined
228
+ : context[argsMetadata.type]
229
+ : await argumentsResolution(!(argsMetadata.type in context) ? undefined : context[argsMetadata.type], argsMetadata.zodSchema, argsMetadata.index, middlewareCollection.funcName);
191
230
  break;
192
231
  }
193
232
  }
@@ -206,29 +245,23 @@ export const BoolFactory = async (target, options) => {
206
245
  if (guardMetadata) {
207
246
  for (const [_key, argsMetadata] of Object.entries(guardMetadata)) {
208
247
  switch (argsMetadata.type) {
209
- case EArgumentTypes.requestHeaders:
248
+ case requestArgsKey:
210
249
  guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
211
- ? reqHeaders
212
- : await argumentsResolution(reqHeaders, argsMetadata.zodSchema, argsMetadata.index, guardCollection.funcName);
250
+ ? request
251
+ : await argumentsResolution(request, argsMetadata.zodSchema, argsMetadata.index, guardCollection.funcName);
213
252
  break;
214
- case EArgumentTypes.body:
253
+ case bodyArgsKey:
215
254
  guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
216
255
  ? await request[argsMetadata.parser || "json"]()
217
256
  : await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, guardCollection.funcName);
218
257
  break;
219
- case EArgumentTypes.query:
220
- guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
221
- ? query
222
- : await argumentsResolution(query, argsMetadata.zodSchema, argsMetadata.index, guardCollection.funcName);
223
- break;
224
- case EArgumentTypes.request:
225
- guardArguments[argsMetadata.index] = request;
226
- break;
227
- case EArgumentTypes.responseHeaders:
228
- guardArguments[argsMetadata.index] = resHeaders;
258
+ case contextArgsKey:
259
+ guardArguments[argsMetadata.index] = contextHook;
229
260
  break;
230
- case EArgumentTypes.config:
231
- guardArguments[argsMetadata.index] = config;
261
+ default:
262
+ guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
263
+ ? context[argsMetadata.type]
264
+ : await argumentsResolution(context[argsMetadata.type], argsMetadata.zodSchema, argsMetadata.index, guardCollection.funcName);
232
265
  break;
233
266
  }
234
267
  }
@@ -250,7 +283,7 @@ export const BoolFactory = async (target, options) => {
250
283
  data: undefined
251
284
  });
252
285
  }
253
- const params = result.params;
286
+ context[paramsArgsKey] = result.params;
254
287
  let responseBody = undefined;
255
288
  // Execute before dispatcher(s)
256
289
  for (let i = 0; i < beforeDispatcherGroup.length; i++) {
@@ -260,41 +293,28 @@ export const BoolFactory = async (target, options) => {
260
293
  if (beforeDispatcherMetadata) {
261
294
  for (const [_key, argsMetadata] of Object.entries(beforeDispatcherMetadata)) {
262
295
  switch (argsMetadata.type) {
263
- case EArgumentTypes.requestHeaders:
296
+ case requestArgsKey:
264
297
  beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
265
- ? reqHeaders
266
- : await argumentsResolution(reqHeaders, argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
298
+ ? request
299
+ : await argumentsResolution(request, argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
267
300
  break;
268
- case EArgumentTypes.body:
301
+ case bodyArgsKey:
269
302
  beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
270
303
  ? await request[argsMetadata.parser || "json"]()
271
304
  : await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
272
305
  break;
273
- case EArgumentTypes.params:
306
+ case paramArgsKey:
274
307
  beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
275
- ? params
276
- : await argumentsResolution(params, argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
308
+ ? context[paramsArgsKey]?.[argsMetadata.key]
309
+ : await argumentsResolution(context[paramsArgsKey]?.[argsMetadata.key], argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
277
310
  break;
278
- case EArgumentTypes.query:
279
- beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
280
- ? query
281
- : await argumentsResolution(query, argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
311
+ case contextArgsKey:
312
+ beforeDispatcherArguments[argsMetadata.index] = contextHook;
282
313
  break;
283
- case EArgumentTypes.param:
314
+ default:
284
315
  beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
285
- ? !(argsMetadata.key in params)
286
- ? undefined
287
- : params[argsMetadata.key]
288
- : await argumentsResolution(query, argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
289
- break;
290
- case EArgumentTypes.request:
291
- beforeDispatcherArguments[argsMetadata.index] = request;
292
- break;
293
- case EArgumentTypes.responseHeaders:
294
- beforeDispatcherArguments[argsMetadata.index] = resHeaders;
295
- break;
296
- case EArgumentTypes.config:
297
- beforeDispatcherArguments[argsMetadata.index] = config;
316
+ ? context[argsMetadata.type]
317
+ : await argumentsResolution(context[argsMetadata.type], argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
298
318
  break;
299
319
  }
300
320
  }
@@ -304,51 +324,39 @@ export const BoolFactory = async (target, options) => {
304
324
  // Execute controller action
305
325
  for (let i = 0; i < result.handlers.length; i++) {
306
326
  const controllerActionArguments = [];
307
- const handler = result.handlers[i];
308
- const handlerMetadata = Reflect.getOwnMetadata(argumentsKey, handler.class, handler.funcName) || {};
327
+ const controllerCollection = result.handlers[i];
328
+ const handlerMetadata = Reflect.getOwnMetadata(argumentsKey, controllerCollection.class, controllerCollection.funcName) ||
329
+ {};
309
330
  if (handlerMetadata) {
310
331
  for (const [_key, argsMetadata] of Object.entries(handlerMetadata)) {
311
332
  switch (argsMetadata.type) {
312
- case EArgumentTypes.requestHeaders:
333
+ case requestArgsKey:
313
334
  controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
314
- ? reqHeaders
315
- : await argumentsResolution(reqHeaders, argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
335
+ ? request
336
+ : await argumentsResolution(request, argsMetadata.zodSchema, argsMetadata.index, controllerCollection.funcName);
316
337
  break;
317
- case EArgumentTypes.body:
338
+ case bodyArgsKey:
318
339
  controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
319
340
  ? await request[argsMetadata.parser || "json"]()
320
- : await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
341
+ : await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, controllerCollection.funcName);
321
342
  break;
322
- case EArgumentTypes.params:
343
+ case paramArgsKey:
323
344
  controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
324
- ? params
325
- : await argumentsResolution(params, argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
345
+ ? context[paramsArgsKey]?.[argsMetadata.key]
346
+ : await argumentsResolution(context[paramsArgsKey]?.[argsMetadata.key], argsMetadata.zodSchema, argsMetadata.index, controllerCollection.funcName);
326
347
  break;
327
- case EArgumentTypes.query:
328
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
329
- ? query
330
- : await argumentsResolution(query, argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
348
+ case contextArgsKey:
349
+ controllerActionArguments[argsMetadata.index] = contextHook;
331
350
  break;
332
- case EArgumentTypes.param:
351
+ default:
333
352
  controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
334
- ? !(argsMetadata.key in params)
335
- ? undefined
336
- : params[argsMetadata.key]
337
- : await argumentsResolution(query, argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
338
- break;
339
- case EArgumentTypes.request:
340
- controllerActionArguments[argsMetadata.index] = request;
341
- break;
342
- case EArgumentTypes.responseHeaders:
343
- controllerActionArguments[argsMetadata.index] = resHeaders;
344
- break;
345
- case EArgumentTypes.config:
346
- controllerActionArguments[argsMetadata.index] = config;
353
+ ? context[argsMetadata.type]
354
+ : await argumentsResolution(context[argsMetadata.type], argsMetadata.zodSchema, argsMetadata.index, controllerCollection.funcName);
347
355
  break;
348
356
  }
349
357
  }
350
358
  }
351
- responseBody = await handler.func(...controllerActionArguments);
359
+ responseBody = await controllerCollection.func(...controllerActionArguments);
352
360
  }
353
361
  // Execute after dispatcher(s)
354
362
  for (let i = 0; i < afterDispatcherGroup.length; i++) {
@@ -358,41 +366,30 @@ export const BoolFactory = async (target, options) => {
358
366
  if (afterDispatcherMetadata) {
359
367
  for (const [_key, argsMetadata] of Object.entries(afterDispatcherMetadata)) {
360
368
  switch (argsMetadata.type) {
361
- case EArgumentTypes.requestHeaders:
369
+ case requestArgsKey:
362
370
  afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
363
- ? reqHeaders
364
- : await argumentsResolution(reqHeaders, argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
371
+ ? request
372
+ : await argumentsResolution(request, argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
365
373
  break;
366
- case EArgumentTypes.body:
374
+ case bodyArgsKey:
367
375
  afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
368
376
  ? await request[argsMetadata.parser || "json"]()
369
377
  : await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
370
378
  break;
371
- case EArgumentTypes.params:
379
+ case paramArgsKey:
372
380
  afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
373
- ? params
374
- : await argumentsResolution(params, argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
381
+ ? context[paramsArgsKey]?.[argsMetadata.key]
382
+ : await argumentsResolution(context[paramsArgsKey]?.[argsMetadata.key], argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
375
383
  break;
376
- case EArgumentTypes.query:
377
- afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
378
- ? query
379
- : await argumentsResolution(query, argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
384
+ case contextArgsKey:
385
+ afterDispatcherArguments[argsMetadata.index] = contextHook;
380
386
  break;
381
- case EArgumentTypes.param:
387
+ default:
382
388
  afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
383
- ? !(argsMetadata.key in params)
389
+ ? !(argsMetadata.type in context)
384
390
  ? undefined
385
- : params[argsMetadata.key]
386
- : await argumentsResolution(query, argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
387
- break;
388
- case EArgumentTypes.request:
389
- afterDispatcherArguments[argsMetadata.index] = request;
390
- break;
391
- case EArgumentTypes.responseHeaders:
392
- afterDispatcherArguments[argsMetadata.index] = resHeaders;
393
- break;
394
- case EArgumentTypes.config:
395
- afterDispatcherArguments[argsMetadata.index] = config;
391
+ : context[argsMetadata.type]
392
+ : await argumentsResolution(!(argsMetadata.type in context) ? undefined : context[argsMetadata.type], argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
396
393
  break;
397
394
  }
398
395
  }
@@ -400,7 +397,7 @@ export const BoolFactory = async (target, options) => {
400
397
  await afterDispatcherCollection.func(...afterDispatcherArguments);
401
398
  }
402
399
  // Set default header(s)
403
- resHeaders.set("X-Powered-By", "Bool Typescript");
400
+ context[responseHeadersArgsKey].set("X-Powered-By", "Bool Typescript");
404
401
  return responseBody instanceof Response
405
402
  ? responseBody
406
403
  : new Response(!responseBody
@@ -412,13 +409,13 @@ export const BoolFactory = async (target, options) => {
412
409
  }), {
413
410
  status: !responseBody ? 204 : 200,
414
411
  statusText: "SUCCESS",
415
- headers: resHeaders
412
+ headers: context[responseHeadersArgsKey]
416
413
  });
417
414
  }
418
415
  catch (error) {
419
416
  // Set default header(s)
420
- resHeaders.set("X-Powered-By", "Bool Typescript");
421
- return jsonErrorInfer(error, resHeaders);
417
+ context[responseHeadersArgsKey].set("X-Powered-By", "Bool Typescript");
418
+ return jsonErrorInfer(error, context[responseHeadersArgsKey]);
422
419
  }
423
420
  finally {
424
421
  if (allowLogsMethods) {
@@ -435,7 +432,7 @@ export const BoolFactory = async (target, options) => {
435
432
  });
436
433
  }
437
434
  catch (error) {
438
- console.error(error);
435
+ options.debug && console.error(error);
439
436
  throw error;
440
437
  }
441
438
  };
@@ -1,8 +1,10 @@
1
1
  import "reflect-metadata";
2
+ type TDefinition<T = any> = {
3
+ new (...args: any[]): T;
4
+ } | string | symbol;
2
5
  interface IInjector {
3
- get<T>(classDefinition: {
4
- new (...args: any[]): T;
5
- }): T;
6
+ set(key: TDefinition, value: any): void;
7
+ get<T>(definition: TDefinition): T;
6
8
  }
7
9
  export declare const Injector: IInjector;
8
10
  export default Injector;
@@ -1,26 +1,37 @@
1
1
  import "reflect-metadata";
2
- import { controllerKey, dispatcherKey, guardKey, injectableKey, injectKey, middlewareKey } from "../decorators";
2
+ import { injectableKey, controllerKey, middlewareKey, guardKey, dispatcherKey, injectKey } from "../keys";
3
3
  export const Injector = new (class {
4
4
  _mapper = new Map();
5
5
  /**
6
6
  *
7
7
  * @param constructor
8
8
  */
9
- get(classDefinition) {
10
- if (this._mapper.has(classDefinition)) {
11
- return this._mapper.get(classDefinition);
9
+ get(definition) {
10
+ if (this._mapper.has(definition)) {
11
+ return this._mapper.get(definition);
12
12
  }
13
- const ownMetadataKeys = Reflect.getMetadataKeys(classDefinition);
13
+ if (typeof definition !== "function") {
14
+ return undefined;
15
+ }
16
+ const ownMetadataKeys = Reflect.getMetadataKeys(definition);
14
17
  if (![injectableKey, controllerKey, middlewareKey, guardKey, dispatcherKey].some((value) => ownMetadataKeys.includes(value))) {
15
- console.error(classDefinition);
18
+ console.error(definition);
16
19
  throw Error("Missing dependency declaration, please check @Injectable() used on dependency(ies).");
17
20
  }
18
21
  // Initialize dependencies injection
19
- const dependencies = Reflect.getOwnMetadata(injectKey, classDefinition) || [];
22
+ const dependencies = Reflect.getOwnMetadata(injectKey, definition) || [];
20
23
  const injections = dependencies.map((dependency) => Injector.get(dependency));
21
- const instance = new classDefinition(...injections);
22
- this._mapper.set(classDefinition, instance);
24
+ const instance = new definition(...injections);
25
+ this._mapper.set(definition, instance);
23
26
  return instance;
24
27
  }
28
+ /**
29
+ *
30
+ * @param key
31
+ * @param value
32
+ */
33
+ set(key, value) {
34
+ this._mapper.set(key, value);
35
+ }
25
36
  })();
26
37
  export default Injector;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import "reflect-metadata";
2
+ export * as Keys from "./keys";
2
3
  export * from "./interfaces";
3
4
  export * from "./hooks";
4
5
  export * from "./decorators";
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import "reflect-metadata";
2
+ export * as Keys from "./keys";
2
3
  export * from "./interfaces";
3
4
  export * from "./hooks";
4
5
  export * from "./decorators";
@@ -0,0 +1,4 @@
1
+ export interface IContext {
2
+ get: (key: symbol) => any;
3
+ set: (key: symbol, value: any) => void;
4
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,5 +1,6 @@
1
- export type { IGuard } from "./guard";
2
- export type { IMiddleware } from "./middleware";
1
+ export type { IContext } from "./context";
3
2
  export type { IController } from "./controller";
4
3
  export type { IDispatcher } from "./dispatcher";
4
+ export type { IGuard } from "./guard";
5
+ export type { IMiddleware } from "./middleware";
5
6
  export type { IModule } from "./module";
@@ -0,0 +1,19 @@
1
+ export declare const argumentsKey: unique symbol;
2
+ export declare const configKey: unique symbol;
3
+ export declare const controllerKey: unique symbol;
4
+ export declare const dispatcherKey: unique symbol;
5
+ export declare const guardKey: unique symbol;
6
+ export declare const controllerHttpKey: unique symbol;
7
+ export declare const injectKey: unique symbol;
8
+ export declare const injectableKey: unique symbol;
9
+ export declare const middlewareKey: unique symbol;
10
+ export declare const moduleKey: unique symbol;
11
+ export declare const controllerRouteZodSchemaKey: unique symbol;
12
+ export declare const requestHeadersArgsKey: unique symbol;
13
+ export declare const bodyArgsKey: unique symbol;
14
+ export declare const paramsArgsKey: unique symbol;
15
+ export declare const paramArgsKey: unique symbol;
16
+ export declare const queryArgsKey: unique symbol;
17
+ export declare const requestArgsKey: unique symbol;
18
+ export declare const responseHeadersArgsKey: unique symbol;
19
+ export declare const contextArgsKey: unique symbol;
@@ -0,0 +1,19 @@
1
+ export const argumentsKey = Symbol("__bool:arguments__");
2
+ export const configKey = Symbol("__bool:config__");
3
+ export const controllerKey = Symbol("__bool:controller__");
4
+ export const dispatcherKey = Symbol("__bool:dispatcher__");
5
+ export const guardKey = Symbol("__bool:guard__");
6
+ export const controllerHttpKey = Symbol("__bool:controller.http__");
7
+ export const injectKey = Symbol("__bool:inject__");
8
+ export const injectableKey = Symbol("__bool:injectable__");
9
+ export const middlewareKey = Symbol("__bool:middleware__");
10
+ export const moduleKey = Symbol("__bool:module__");
11
+ export const controllerRouteZodSchemaKey = Symbol("__bool:controller.route.zodSchema__");
12
+ export const requestHeadersArgsKey = Symbol("__bool:arguments:requestHeaders__");
13
+ export const bodyArgsKey = Symbol("__bool:arguments:body__");
14
+ export const paramsArgsKey = Symbol("__bool:arguments:params__");
15
+ export const paramArgsKey = Symbol("__bool:arguments:param__");
16
+ export const queryArgsKey = Symbol("__bool:arguments:query__");
17
+ export const requestArgsKey = Symbol("__bool:arguments:request__");
18
+ export const responseHeadersArgsKey = Symbol("__bool:arguments:responseHeaders__");
19
+ export const contextArgsKey = Symbol("__bool:arguments:context__");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bool-ts/core",
3
- "version": "1.6.0",
3
+ "version": "1.6.2",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {