@carno.js/core 0.2.3

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 (214) hide show
  1. package/LICENSE +674 -0
  2. package/dist/Carno.d.ts +65 -0
  3. package/dist/Carno.js +307 -0
  4. package/dist/Cheetah.d.ts +65 -0
  5. package/dist/Cheetah.js +307 -0
  6. package/dist/cache/bento-cache.driver.d.ts +13 -0
  7. package/dist/cache/bento-cache.driver.js +55 -0
  8. package/dist/cache/cache.service.d.ts +8 -0
  9. package/dist/cache/cache.service.js +6 -0
  10. package/dist/commons/decorators/Injectable.decorator.d.ts +20 -0
  11. package/dist/commons/decorators/Injectable.decorator.js +33 -0
  12. package/dist/commons/decorators/controller.decorator.d.ts +8 -0
  13. package/dist/commons/decorators/controller.decorator.js +22 -0
  14. package/dist/commons/decorators/http.decorators.d.ts +13 -0
  15. package/dist/commons/decorators/http.decorators.js +44 -0
  16. package/dist/commons/decorators/index.d.ts +5 -0
  17. package/dist/commons/decorators/index.js +21 -0
  18. package/dist/commons/decorators/inject.decorator.d.ts +1 -0
  19. package/dist/commons/decorators/inject.decorator.js +5 -0
  20. package/dist/commons/decorators/middleware.decorator.d.ts +2 -0
  21. package/dist/commons/decorators/middleware.decorator.js +30 -0
  22. package/dist/commons/decorators/service.decorator.d.ts +2 -0
  23. package/dist/commons/decorators/service.decorator.js +7 -0
  24. package/dist/commons/http-code.enum.d.ts +50 -0
  25. package/dist/commons/http-code.enum.js +54 -0
  26. package/dist/commons/index.d.ts +3 -0
  27. package/dist/commons/index.js +19 -0
  28. package/dist/commons/registries/ProviderControl.d.ts +77 -0
  29. package/dist/commons/registries/ProviderControl.js +112 -0
  30. package/dist/commons/registries/ProviderRegistry.d.ts +7 -0
  31. package/dist/commons/registries/ProviderRegistry.js +20 -0
  32. package/dist/constants.d.ts +7 -0
  33. package/dist/constants.js +10 -0
  34. package/dist/container/ContainerConfiguration.d.ts +45 -0
  35. package/dist/container/ContainerConfiguration.js +121 -0
  36. package/dist/container/DependencyResolver.d.ts +18 -0
  37. package/dist/container/DependencyResolver.js +81 -0
  38. package/dist/container/InjectorService.d.ts +34 -0
  39. package/dist/container/InjectorService.js +157 -0
  40. package/dist/container/MethodInvoker.d.ts +17 -0
  41. package/dist/container/MethodInvoker.js +69 -0
  42. package/dist/container/RouteResolver.d.ts +27 -0
  43. package/dist/container/RouteResolver.js +173 -0
  44. package/dist/container/container.d.ts +41 -0
  45. package/dist/container/container.js +71 -0
  46. package/dist/container/createContainer.d.ts +3 -0
  47. package/dist/container/createContainer.js +12 -0
  48. package/dist/container/createInjector.d.ts +2 -0
  49. package/dist/container/createInjector.js +7 -0
  50. package/dist/container/index.d.ts +6 -0
  51. package/dist/container/index.js +22 -0
  52. package/dist/container/middleware.resolver.d.ts +9 -0
  53. package/dist/container/middleware.resolver.js +35 -0
  54. package/dist/default-routes-carno.d.ts +3 -0
  55. package/dist/default-routes-carno.js +29 -0
  56. package/dist/default-routes-cheetah.d.ts +3 -0
  57. package/dist/default-routes-cheetah.js +29 -0
  58. package/dist/domain/CarnoClosure.d.ts +1 -0
  59. package/dist/domain/CarnoClosure.js +2 -0
  60. package/dist/domain/CarnoMiddleware.d.ts +5 -0
  61. package/dist/domain/CarnoMiddleware.js +2 -0
  62. package/dist/domain/CheetahClosure.d.ts +1 -0
  63. package/dist/domain/CheetahClosure.js +2 -0
  64. package/dist/domain/CheetahMiddleware.d.ts +5 -0
  65. package/dist/domain/CheetahMiddleware.js +2 -0
  66. package/dist/domain/Context.d.ts +26 -0
  67. package/dist/domain/Context.js +107 -0
  68. package/dist/domain/LocalsContainer.d.ts +4 -0
  69. package/dist/domain/LocalsContainer.js +10 -0
  70. package/dist/domain/Metadata.d.ts +449 -0
  71. package/dist/domain/Metadata.js +511 -0
  72. package/dist/domain/cors-config.d.ts +12 -0
  73. package/dist/domain/cors-config.js +18 -0
  74. package/dist/domain/http-method.d.ts +7 -0
  75. package/dist/domain/http-method.js +11 -0
  76. package/dist/domain/index.d.ts +10 -0
  77. package/dist/domain/index.js +26 -0
  78. package/dist/domain/provider-scope.d.ts +5 -0
  79. package/dist/domain/provider-scope.js +9 -0
  80. package/dist/domain/provider-type.d.ts +6 -0
  81. package/dist/domain/provider-type.js +10 -0
  82. package/dist/domain/provider.d.ts +37 -0
  83. package/dist/domain/provider.js +70 -0
  84. package/dist/events/hooks.decorator.d.ts +3 -0
  85. package/dist/events/hooks.decorator.js +29 -0
  86. package/dist/events/index.d.ts +2 -0
  87. package/dist/events/index.js +18 -0
  88. package/dist/events/on-event.d.ts +13 -0
  89. package/dist/events/on-event.js +11 -0
  90. package/dist/exceptions/HttpException.d.ts +9 -0
  91. package/dist/exceptions/HttpException.js +26 -0
  92. package/dist/exceptions/index.d.ts +1 -0
  93. package/dist/exceptions/index.js +17 -0
  94. package/dist/index.d.ts +16 -0
  95. package/dist/index.js +32 -0
  96. package/dist/route/Matcher.d.ts +16 -0
  97. package/dist/route/Matcher.js +48 -0
  98. package/dist/route/RouteExecutor.d.ts +13 -0
  99. package/dist/route/RouteExecutor.js +70 -0
  100. package/dist/route/memoirist.d.ts +25 -0
  101. package/dist/route/memoirist.js +250 -0
  102. package/dist/services/logger.service.d.ts +23 -0
  103. package/dist/services/logger.service.js +54 -0
  104. package/dist/services/request-logger.service.d.ts +15 -0
  105. package/dist/services/request-logger.service.js +50 -0
  106. package/dist/testing/core-testing.d.ts +24 -0
  107. package/dist/testing/core-testing.js +98 -0
  108. package/dist/testing/index.d.ts +1 -0
  109. package/dist/testing/index.js +17 -0
  110. package/dist/utils/ancestorOf.d.ts +2 -0
  111. package/dist/utils/ancestorOf.js +10 -0
  112. package/dist/utils/ancestorsOf.d.ts +6 -0
  113. package/dist/utils/ancestorsOf.js +20 -0
  114. package/dist/utils/classOf.d.ts +13 -0
  115. package/dist/utils/classOf.js +21 -0
  116. package/dist/utils/cleanObject.d.ts +6 -0
  117. package/dist/utils/cleanObject.js +22 -0
  118. package/dist/utils/constructorOf.d.ts +11 -0
  119. package/dist/utils/constructorOf.js +18 -0
  120. package/dist/utils/createInstance.d.ts +1 -0
  121. package/dist/utils/createInstance.js +7 -0
  122. package/dist/utils/decoratorTypeOf.d.ts +11 -0
  123. package/dist/utils/decoratorTypeOf.js +32 -0
  124. package/dist/utils/deepClone.d.ts +6 -0
  125. package/dist/utils/deepClone.js +63 -0
  126. package/dist/utils/deepMerge.d.ts +9 -0
  127. package/dist/utils/deepMerge.js +62 -0
  128. package/dist/utils/descriptorOf.d.ts +8 -0
  129. package/dist/utils/descriptorOf.js +16 -0
  130. package/dist/utils/getClassOrSymbol.d.ts +1 -0
  131. package/dist/utils/getClassOrSymbol.js +8 -0
  132. package/dist/utils/getConstructorArgNames.d.ts +1 -0
  133. package/dist/utils/getConstructorArgNames.js +12 -0
  134. package/dist/utils/getMethodArgTypes.d.ts +1 -0
  135. package/dist/utils/getMethodArgTypes.js +9 -0
  136. package/dist/utils/getValue.d.ts +32 -0
  137. package/dist/utils/getValue.js +47 -0
  138. package/dist/utils/hasJsonMethod.d.ts +1 -0
  139. package/dist/utils/hasJsonMethod.js +6 -0
  140. package/dist/utils/index.d.ts +15 -0
  141. package/dist/utils/index.js +31 -0
  142. package/dist/utils/isArray.d.ts +13 -0
  143. package/dist/utils/isArray.js +21 -0
  144. package/dist/utils/isArrowFn.d.ts +1 -0
  145. package/dist/utils/isArrowFn.js +7 -0
  146. package/dist/utils/isBoolean.d.ts +7 -0
  147. package/dist/utils/isBoolean.js +15 -0
  148. package/dist/utils/isBuffer.d.ts +7 -0
  149. package/dist/utils/isBuffer.js +19 -0
  150. package/dist/utils/isClass.d.ts +1 -0
  151. package/dist/utils/isClass.js +26 -0
  152. package/dist/utils/isClassValidator.d.ts +6 -0
  153. package/dist/utils/isClassValidator.js +13 -0
  154. package/dist/utils/isCollection.d.ts +6 -0
  155. package/dist/utils/isCollection.js +20 -0
  156. package/dist/utils/isDate.d.ts +6 -0
  157. package/dist/utils/isDate.js +11 -0
  158. package/dist/utils/isEmpty.d.ts +6 -0
  159. package/dist/utils/isEmpty.js +12 -0
  160. package/dist/utils/isFunction.d.ts +1 -0
  161. package/dist/utils/isFunction.js +6 -0
  162. package/dist/utils/isInheritedFrom.d.ts +1 -0
  163. package/dist/utils/isInheritedFrom.js +24 -0
  164. package/dist/utils/isMomentObject.d.ts +1 -0
  165. package/dist/utils/isMomentObject.js +6 -0
  166. package/dist/utils/isMongooseObject.d.ts +2 -0
  167. package/dist/utils/isMongooseObject.js +11 -0
  168. package/dist/utils/isNil.d.ts +1 -0
  169. package/dist/utils/isNil.js +6 -0
  170. package/dist/utils/isNumber.d.ts +7 -0
  171. package/dist/utils/isNumber.js +15 -0
  172. package/dist/utils/isObject.d.ts +1 -0
  173. package/dist/utils/isObject.js +6 -0
  174. package/dist/utils/isObservable.d.ts +1 -0
  175. package/dist/utils/isObservable.js +6 -0
  176. package/dist/utils/isPlainObject.d.ts +7 -0
  177. package/dist/utils/isPlainObject.js +16 -0
  178. package/dist/utils/isPrimitive.d.ts +14 -0
  179. package/dist/utils/isPrimitive.js +28 -0
  180. package/dist/utils/isPrimitiveType.d.ts +1 -0
  181. package/dist/utils/isPrimitiveType.js +11 -0
  182. package/dist/utils/isPromise.d.ts +7 -0
  183. package/dist/utils/isPromise.js +14 -0
  184. package/dist/utils/isProtectedKey.d.ts +5 -0
  185. package/dist/utils/isProtectedKey.js +10 -0
  186. package/dist/utils/isRegExp.d.ts +1 -0
  187. package/dist/utils/isRegExp.js +6 -0
  188. package/dist/utils/isRequestScope.d.ts +11 -0
  189. package/dist/utils/isRequestScope.js +23 -0
  190. package/dist/utils/isSerializable.d.ts +1 -0
  191. package/dist/utils/isSerializable.js +11 -0
  192. package/dist/utils/isStream.d.ts +1 -0
  193. package/dist/utils/isStream.js +6 -0
  194. package/dist/utils/isString.d.ts +6 -0
  195. package/dist/utils/isString.js +14 -0
  196. package/dist/utils/isSymbol.d.ts +6 -0
  197. package/dist/utils/isSymbol.js +14 -0
  198. package/dist/utils/methodsOf.d.ts +9 -0
  199. package/dist/utils/methodsOf.js +24 -0
  200. package/dist/utils/nameOf.d.ts +14 -0
  201. package/dist/utils/nameOf.js +31 -0
  202. package/dist/utils/objectKeys.d.ts +1 -0
  203. package/dist/utils/objectKeys.js +7 -0
  204. package/dist/utils/primitiveOf.d.ts +1 -0
  205. package/dist/utils/primitiveOf.js +18 -0
  206. package/dist/utils/prototypeOf.d.ts +6 -0
  207. package/dist/utils/prototypeOf.js +12 -0
  208. package/dist/utils/setValue.d.ts +1 -0
  209. package/dist/utils/setValue.js +32 -0
  210. package/dist/utils/toMap.d.ts +3 -0
  211. package/dist/utils/toMap.js +34 -0
  212. package/dist/utils/toStringConstructor.d.ts +1 -0
  213. package/dist/utils/toStringConstructor.js +10 -0
  214. package/package.json +55 -0
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var InjectorService_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.InjectorService = void 0;
11
+ const Injectable_decorator_1 = require("../commons/decorators/Injectable.decorator");
12
+ const commons_1 = require("../commons");
13
+ const ProviderControl_1 = require("../commons/registries/ProviderControl");
14
+ const constants_1 = require("../constants");
15
+ const default_routes_carno_1 = require("../default-routes-carno");
16
+ const Context_1 = require("../domain/Context");
17
+ const LocalsContainer_1 = require("../domain/LocalsContainer");
18
+ const Metadata_1 = require("../domain/Metadata");
19
+ const provider_scope_1 = require("../domain/provider-scope");
20
+ const on_event_1 = require("../events/on-event");
21
+ const logger_service_1 = require("../services/logger.service");
22
+ const cache_service_1 = require("../cache/cache.service");
23
+ const isPrimitiveType_1 = require("../utils/isPrimitiveType");
24
+ const nameOf_1 = require("../utils/nameOf");
25
+ const ContainerConfiguration_1 = require("./ContainerConfiguration");
26
+ const container_1 = require("./container");
27
+ const middleware_resolver_1 = require("./middleware.resolver");
28
+ const RouteResolver_1 = require("./RouteResolver");
29
+ const DependencyResolver_1 = require("./DependencyResolver");
30
+ const MethodInvoker_1 = require("./MethodInvoker");
31
+ const request_logger_service_1 = require("../services/request-logger.service");
32
+ let InjectorService = InjectorService_1 = class InjectorService {
33
+ constructor() {
34
+ this.settings = new ContainerConfiguration_1.ContainerConfiguration();
35
+ this.container = new container_1.Container();
36
+ this.applicationConfig = {};
37
+ }
38
+ async loadModule(container, applicationConfig, router) {
39
+ this.container = container;
40
+ this.router = router;
41
+ this.applicationConfig = applicationConfig;
42
+ this.initializeResolvers();
43
+ this.removeUnknownProviders();
44
+ this.saveInjector();
45
+ this.routeResolver.resolveControllers();
46
+ await this.callHook(on_event_1.EventType.OnApplicationInit);
47
+ }
48
+ initializeResolvers() {
49
+ this.routeResolver = new RouteResolver_1.RouteResolver(this.router, this.applicationConfig.globalMiddlewares);
50
+ this.dependencyResolver = new DependencyResolver_1.DependencyResolver(this.container);
51
+ this.methodInvoker = new MethodInvoker_1.MethodInvoker(this.applicationConfig);
52
+ }
53
+ ensureProvider(token) {
54
+ if (!this.container.has(token) && ProviderControl_1.GlobalProvider.has(token)) {
55
+ this.container.addProvider(token);
56
+ }
57
+ return this.container.get(token);
58
+ }
59
+ get(token) {
60
+ return this.ensureProvider(token);
61
+ }
62
+ invoke(token, locals = new LocalsContainer_1.LocalsContainer()) {
63
+ if (locals.has(token)) {
64
+ const stored = locals.get(token);
65
+ return stored?.instance ?? stored;
66
+ }
67
+ if ((0, isPrimitiveType_1.isPrimitiveType)(token)) {
68
+ return token;
69
+ }
70
+ const provider = this.ensureProvider(token);
71
+ if (!provider) {
72
+ throw new Error(`Provider not found for: ${(0, nameOf_1.nameOf)(token)}, check if it was imported into the module or imported without type-only import.`);
73
+ }
74
+ return this.dependencyResolver.resolve(provider, locals, (t, l) => this.invoke(t, l));
75
+ }
76
+ async invokeRoute(route, context, locals) {
77
+ await middleware_resolver_1.MiddlewareRes.resolveMiddlewares(route, this, locals);
78
+ return this.methodInvoker.invoke(route.provider.instance, route.methodName, locals, context, (t, l) => this.invoke(t, l));
79
+ }
80
+ scopeOf(provider) {
81
+ return provider.scope || provider_scope_1.ProviderScope.SINGLETON;
82
+ }
83
+ async callHook(event, data = null) {
84
+ const hooks = this.getHooksByEvent(event);
85
+ if (hooks.length === 0) {
86
+ return;
87
+ }
88
+ await this.runHookHandlers(hooks, data ?? {});
89
+ }
90
+ getHooksByEvent(event) {
91
+ const hooks = Metadata_1.Metadata.get(constants_1.CONTROLLER_EVENTS, Reflect);
92
+ if (!hooks) {
93
+ return [];
94
+ }
95
+ const filtered = hooks.filter((hook) => hook.eventName === event);
96
+ return this.sortHooksByPriority(filtered);
97
+ }
98
+ sortHooksByPriority(hooks) {
99
+ return hooks.slice().sort((first, second) => {
100
+ return (second.priority ?? 0) - (first.priority ?? 0);
101
+ });
102
+ }
103
+ async runHookHandlers(hooks, data) {
104
+ for (const hook of hooks) {
105
+ await this.executeHook(hook, data);
106
+ }
107
+ }
108
+ async executeHook(hook, data) {
109
+ const instance = this.invoke(hook.target);
110
+ await instance[hook.methodName](data);
111
+ }
112
+ saveInjector() {
113
+ const provider = this.ensureProvider(InjectorService_1);
114
+ provider.instance = this;
115
+ this.container.set(InjectorService_1, provider);
116
+ }
117
+ removeUnknownProviders() {
118
+ if (!ProviderControl_1.GlobalProvider.has(logger_service_1.LoggerService)) {
119
+ (0, commons_1.registerProvider)({ provide: logger_service_1.LoggerService, useClass: logger_service_1.LoggerService, instance: new logger_service_1.LoggerService(this) });
120
+ }
121
+ const defaults = [
122
+ InjectorService_1,
123
+ Context_1.Context,
124
+ logger_service_1.LoggerService,
125
+ default_routes_carno_1.DefaultRoutesCarno,
126
+ cache_service_1.CacheService,
127
+ request_logger_service_1.RequestLogger
128
+ ];
129
+ this.applicationConfig.providers = this.applicationConfig.providers || [];
130
+ this.applicationConfig.providers.push(...defaults);
131
+ let hooks = Metadata_1.Metadata.get(constants_1.CONTROLLER_EVENTS, Reflect);
132
+ for (let [token] of ProviderControl_1.GlobalProvider.entries()) {
133
+ if (!this.isProviderAllowed(token)) {
134
+ ProviderControl_1.GlobalProvider.delete(token);
135
+ if (hooks) {
136
+ hooks = hooks.filter((hook) => hook.target !== token);
137
+ Metadata_1.Metadata.set(constants_1.CONTROLLER_EVENTS, hooks, Reflect);
138
+ }
139
+ }
140
+ }
141
+ }
142
+ isProviderAllowed(token) {
143
+ if (!this.applicationConfig.providers) {
144
+ return false;
145
+ }
146
+ return this.applicationConfig.providers.some((provider) => {
147
+ if (provider?.provide) {
148
+ return provider.provide === token;
149
+ }
150
+ return provider === token;
151
+ });
152
+ }
153
+ };
154
+ exports.InjectorService = InjectorService;
155
+ exports.InjectorService = InjectorService = InjectorService_1 = __decorate([
156
+ (0, Injectable_decorator_1.Injectable)()
157
+ ], InjectorService);
@@ -0,0 +1,17 @@
1
+ import { ApplicationConfig } from "../Carno";
2
+ import { TokenProvider } from "../commons/registries/ProviderControl";
3
+ import { Context } from "../domain/Context";
4
+ import { LocalsContainer } from "../domain/LocalsContainer";
5
+ export declare class MethodInvoker {
6
+ private applicationConfig;
7
+ private historyMethods;
8
+ constructor(applicationConfig: ApplicationConfig);
9
+ invoke(instance: any, methodName: string, locals: LocalsContainer, context: Context, invokeCallback: (token: TokenProvider, locals: LocalsContainer) => any): Promise<any>;
10
+ private getMethodInfo;
11
+ private getCachedMethod;
12
+ private cacheMethodInfo;
13
+ private setCachedMethod;
14
+ private resolveMethodServices;
15
+ private resolveService;
16
+ private validateAndTransform;
17
+ }
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MethodInvoker = void 0;
4
+ const class_transformer_1 = require("class-transformer");
5
+ const class_validator_1 = require("class-validator");
6
+ const Metadata_1 = require("../domain/Metadata");
7
+ const HttpException_1 = require("../exceptions/HttpException");
8
+ const getClassOrSymbol_1 = require("../utils/getClassOrSymbol");
9
+ const getMethodArgTypes_1 = require("../utils/getMethodArgTypes");
10
+ const isClassValidator_1 = require("../utils/isClassValidator");
11
+ class MethodInvoker {
12
+ constructor(applicationConfig) {
13
+ this.applicationConfig = applicationConfig;
14
+ this.historyMethods = new WeakMap();
15
+ }
16
+ async invoke(instance, methodName, locals, context, invokeCallback) {
17
+ const methodInfo = this.getMethodInfo(instance, methodName);
18
+ const services = this.resolveMethodServices(methodInfo, context, locals, invokeCallback);
19
+ return instance[methodName](...services);
20
+ }
21
+ getMethodInfo(instance, methodName) {
22
+ const cached = this.getCachedMethod(instance, methodName);
23
+ return cached || this.cacheMethodInfo(instance, methodName);
24
+ }
25
+ getCachedMethod(instance, methodName) {
26
+ const cachedMethod = this.historyMethods.get(instance);
27
+ return cachedMethod?.[methodName];
28
+ }
29
+ cacheMethodInfo(instance, methodName) {
30
+ const args = (0, getMethodArgTypes_1.getMethodArgTypes)(instance, methodName);
31
+ const params = Metadata_1.Metadata.getParamDecoratorFunc(instance, methodName);
32
+ const methodInfo = { args, params };
33
+ this.setCachedMethod(instance, methodName, methodInfo);
34
+ return methodInfo;
35
+ }
36
+ setCachedMethod(instance, methodName, methodInfo) {
37
+ const cachedMethod = this.historyMethods.get(instance) || {};
38
+ cachedMethod[methodName] = methodInfo;
39
+ this.historyMethods.set(instance, cachedMethod);
40
+ }
41
+ resolveMethodServices(methodInfo, context, locals, invokeCallback) {
42
+ const { args, params } = methodInfo;
43
+ const services = [];
44
+ for (let index = 0; index < args.length; index++) {
45
+ const service = this.resolveService(args[index], params[index], context, locals, invokeCallback);
46
+ services.push(service);
47
+ }
48
+ return services;
49
+ }
50
+ resolveService(token, param, context, locals, invokeCallback) {
51
+ if (!param) {
52
+ return invokeCallback((0, getClassOrSymbol_1.getClassOrSymbol)(token), locals);
53
+ }
54
+ const value = param.fun(context, param.param);
55
+ return (0, isClassValidator_1.isClassValidator)(token)
56
+ ? this.validateAndTransform(token, value)
57
+ : value;
58
+ }
59
+ validateAndTransform(token, value) {
60
+ const obj = (0, class_transformer_1.plainToInstance)(token, value);
61
+ const errors = (0, class_validator_1.validateSync)(obj, this.applicationConfig.validation);
62
+ // todo: deve retornar apenas os erros e não o objeto class-validator inteiro.
63
+ if (errors.length > 0) {
64
+ throw new HttpException_1.HttpException(errors, 400);
65
+ }
66
+ return obj;
67
+ }
68
+ }
69
+ exports.MethodInvoker = MethodInvoker;
@@ -0,0 +1,27 @@
1
+ import { TokenRouteWithProvider } from "./ContainerConfiguration";
2
+ import Memoirist from "../route/memoirist";
3
+ export declare class RouteResolver {
4
+ private router;
5
+ private globalMiddlewares;
6
+ constructor(router: Memoirist<TokenRouteWithProvider>, globalMiddlewares?: any[]);
7
+ resolveControllers(): void;
8
+ private getTopLevelControllers;
9
+ private buildRouteMap;
10
+ private processController;
11
+ private getControllerRoutes;
12
+ private getControllerMiddlewares;
13
+ private applyControllerPath;
14
+ private normalizePath;
15
+ private addRoutesToMap;
16
+ private filterRoutesByMethod;
17
+ private addMethodRoutes;
18
+ private createTokenRouteWithProvider;
19
+ private processChildren;
20
+ private resolveChildrenRoutes;
21
+ private processChildController;
22
+ private getValidChildController;
23
+ private applyChildPaths;
24
+ private buildChildPath;
25
+ private buildChildRoutes;
26
+ private registerRoutes;
27
+ }
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RouteResolver = void 0;
4
+ const ProviderControl_1 = require("../commons/registries/ProviderControl");
5
+ const constants_1 = require("../constants");
6
+ const domain_1 = require("../domain");
7
+ const Metadata_1 = require("../domain/Metadata");
8
+ const provider_type_1 = require("../domain/provider-type");
9
+ class RouteResolver {
10
+ constructor(router, globalMiddlewares) {
11
+ this.router = router;
12
+ this.globalMiddlewares = [];
13
+ this.globalMiddlewares = globalMiddlewares || [];
14
+ }
15
+ resolveControllers() {
16
+ const controllers = this.getTopLevelControllers();
17
+ const hydrateRoute = this.buildRouteMap(controllers);
18
+ this.registerRoutes(hydrateRoute);
19
+ }
20
+ getTopLevelControllers() {
21
+ return ProviderControl_1.GlobalProvider.getByType(provider_type_1.ProviderType.CONTROLLER).filter((controller) => !controller.isChild());
22
+ }
23
+ buildRouteMap(controllers) {
24
+ const hydrateRoute = new Map();
25
+ for (const controller of controllers) {
26
+ this.processController(controller, hydrateRoute);
27
+ }
28
+ return hydrateRoute;
29
+ }
30
+ processController(controller, hydrateRoute) {
31
+ const routes = this.getControllerRoutes(controller);
32
+ if (routes.length === 0)
33
+ return;
34
+ const controllerMiddleware = this.getControllerMiddlewares(controller);
35
+ const processedRoutes = this.applyControllerPath(controller, routes);
36
+ this.addRoutesToMap(hydrateRoute, processedRoutes, controller, controllerMiddleware);
37
+ this.processChildren(controller, hydrateRoute, controllerMiddleware);
38
+ }
39
+ getControllerRoutes(controller) {
40
+ return Metadata_1.Metadata.get(constants_1.CONTROLLER_ROUTES, controller.token);
41
+ }
42
+ getControllerMiddlewares(controller) {
43
+ return Metadata_1.Metadata.get(constants_1.CONTROLLER_MIDDLEWARES, controller.token) || [];
44
+ }
45
+ applyControllerPath(controller, routes) {
46
+ if (!controller.path)
47
+ return routes;
48
+ return routes.map((route) => ({
49
+ ...route,
50
+ path: this.normalizePath(`${controller.path}${route.path}`),
51
+ }));
52
+ }
53
+ normalizePath(path) {
54
+ let normalized = path.endsWith("/") ? path.slice(0, -1) : path;
55
+ return normalized.startsWith("/") ? normalized : `/${normalized}`;
56
+ }
57
+ addRoutesToMap(hydrateRoute, routes, controller, controllerMiddleware) {
58
+ for (const method of Object.keys(domain_1.HttpMethod).map((key) => domain_1.HttpMethod[key])) {
59
+ const methodRoutes = this.filterRoutesByMethod(routes, method);
60
+ if (methodRoutes.length === 0)
61
+ continue;
62
+ this.addMethodRoutes(hydrateRoute, method, methodRoutes, controller, controllerMiddleware);
63
+ }
64
+ }
65
+ filterRoutesByMethod(routes, method) {
66
+ return routes.filter((route) => route.method.toLowerCase() === method);
67
+ }
68
+ addMethodRoutes(hydrateRoute, method, routes, controller, controllerMiddleware) {
69
+ const mappedRoutes = routes.map((route) => this.createTokenRouteWithProvider(route, controller, controllerMiddleware));
70
+ hydrateRoute.set(method, [
71
+ ...(hydrateRoute.get(method) || []),
72
+ ...mappedRoutes,
73
+ ]);
74
+ }
75
+ createTokenRouteWithProvider(route, controller, controllerMiddleware) {
76
+ return {
77
+ ...route,
78
+ provider: controller.token,
79
+ route,
80
+ middlewares: [
81
+ ...this.globalMiddlewares,
82
+ ...controllerMiddleware,
83
+ ...(Metadata_1.Metadata.get(constants_1.ROUTE_MIDDLEWARES, controller.token, route.methodName) || []),
84
+ ],
85
+ };
86
+ }
87
+ processChildren(controller, hydrateRoute, controllerMiddleware) {
88
+ if (!controller.children)
89
+ return;
90
+ const childrenRoutes = this.resolveChildrenRoutes(controller.path ?? "", controller.children, controllerMiddleware);
91
+ childrenRoutes.forEach((route) => {
92
+ const method = route.method.toLowerCase();
93
+ hydrateRoute.set(method, [
94
+ ...(hydrateRoute.get(method) || []),
95
+ route,
96
+ ]);
97
+ });
98
+ }
99
+ resolveChildrenRoutes(parentPath, children, parentMiddlewares) {
100
+ let childrenRoutes = [];
101
+ for (const childController of children) {
102
+ const routes = this.processChildController(childController, parentPath, parentMiddlewares);
103
+ childrenRoutes = [...childrenRoutes, ...routes];
104
+ }
105
+ return childrenRoutes;
106
+ }
107
+ processChildController(childController, parentPath, parentMiddlewares) {
108
+ const controller = this.getValidChildController(childController);
109
+ const childRoutes = this.getControllerRoutes(controller);
110
+ if (childRoutes.length === 0)
111
+ return [];
112
+ const childMiddlewares = this.getControllerMiddlewares(controller);
113
+ const processedRoutes = this.applyChildPaths(childRoutes, parentPath, controller);
114
+ return this.buildChildRoutes(processedRoutes, controller, parentMiddlewares, childMiddlewares);
115
+ }
116
+ getValidChildController(childController) {
117
+ const controller = ProviderControl_1.GlobalProvider.get(childController);
118
+ if (!controller) {
119
+ throw new Error(`Child ${childController} not is an controller. Please, check the providers configuration.`);
120
+ }
121
+ return controller;
122
+ }
123
+ applyChildPaths(routes, parentPath, controller) {
124
+ if (!parentPath)
125
+ return routes;
126
+ return routes.map((route) => ({
127
+ ...route,
128
+ path: this.buildChildPath(parentPath, controller.path, route.path),
129
+ }));
130
+ }
131
+ buildChildPath(parentPath, controllerPath, routePath) {
132
+ let path = controllerPath ?? "";
133
+ if (path.endsWith("/")) {
134
+ path = path.slice(0, -1);
135
+ }
136
+ if (!path.startsWith("/") && path) {
137
+ path = `/${path}`;
138
+ }
139
+ const fullPath = `${parentPath}${path}${routePath}`;
140
+ return this.normalizePath(fullPath);
141
+ }
142
+ buildChildRoutes(routes, controller, parentMiddlewares, childMiddlewares) {
143
+ let childRoutes = [];
144
+ for (const method of Object.keys(domain_1.HttpMethod).map((key) => domain_1.HttpMethod[key])) {
145
+ const methodRoutes = this.filterRoutesByMethod(routes, method);
146
+ if (methodRoutes.length === 0)
147
+ continue;
148
+ const mappedRoutes = methodRoutes.map((route) => ({
149
+ ...route,
150
+ provider: controller.token,
151
+ route,
152
+ middlewares: [
153
+ ...this.globalMiddlewares,
154
+ ...parentMiddlewares,
155
+ ...childMiddlewares,
156
+ ...(Metadata_1.Metadata.get(constants_1.ROUTE_MIDDLEWARES, controller.token, route.methodName) || []),
157
+ ],
158
+ }));
159
+ childRoutes = [...childRoutes, ...mappedRoutes];
160
+ }
161
+ if (controller.children) {
162
+ const nestedRoutes = this.resolveChildrenRoutes(controller.path, controller.children, childMiddlewares);
163
+ childRoutes = [...childRoutes, ...nestedRoutes];
164
+ }
165
+ return childRoutes;
166
+ }
167
+ registerRoutes(hydrateRoute) {
168
+ hydrateRoute.forEach((routes) => {
169
+ routes.forEach((route) => this.router.add(route.method.toLowerCase(), route.path, route));
170
+ });
171
+ }
172
+ }
173
+ exports.RouteResolver = RouteResolver;
@@ -0,0 +1,41 @@
1
+ import { TokenProvider } from '../commons';
2
+ import { Provider, ProviderType } from '../domain';
3
+ export declare class Container extends Map<TokenProvider, Provider> {
4
+ /**
5
+ *
6
+ * @param token
7
+ * @param settings
8
+ */
9
+ add(token: TokenProvider, settings?: Partial<Provider>): this;
10
+ /**
11
+ * Add a provider to the
12
+ * @param token
13
+ * @param settings
14
+ */
15
+ addProvider(token: TokenProvider, settings?: Partial<Provider>): this;
16
+ /**
17
+ *
18
+ * @param token
19
+ */
20
+ hasProvider(token: TokenProvider): boolean;
21
+ /**
22
+ * Add a provider to the
23
+ * @param token
24
+ * @param provider
25
+ */
26
+ setProvider(token: TokenProvider, provider: Provider): this;
27
+ /**
28
+ * The getProvider() method returns a specified element from a Map object.
29
+ * @returns Returns the element associated with the specified key or undefined if the key can't be found in the Map object.
30
+ * @param token
31
+ */
32
+ getProvider<T extends Provider = Provider>(token: TokenProvider): T | undefined;
33
+ /**
34
+ * Get all providers registered in the injector container.
35
+ *
36
+ * @param {ProviderType} type Filter the list by the given ProviderType.
37
+ * @returns {[TokenProvider , Provider<any>][]}
38
+ */
39
+ getProviders(type?: ProviderType | string): Provider[];
40
+ addProviders(container: Map<TokenProvider, Provider>): void;
41
+ }
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Container = void 0;
4
+ const commons_1 = require("../commons");
5
+ const domain_1 = require("../domain");
6
+ class Container extends Map {
7
+ /**
8
+ *
9
+ * @param token
10
+ * @param settings
11
+ */
12
+ add(token, settings = {}) {
13
+ const provider = commons_1.GlobalProvider.get(token)?.clone() || new domain_1.Provider(token);
14
+ Object.assign(provider, settings);
15
+ return this.set(token, provider);
16
+ }
17
+ /**
18
+ * Add a provider to the
19
+ * @param token
20
+ * @param settings
21
+ */
22
+ addProvider(token, settings = {}) {
23
+ return this.add(token, settings);
24
+ }
25
+ /**
26
+ *
27
+ * @param token
28
+ */
29
+ hasProvider(token) {
30
+ return super.has(token);
31
+ }
32
+ /**
33
+ * Add a provider to the
34
+ * @param token
35
+ * @param provider
36
+ */
37
+ setProvider(token, provider) {
38
+ return super.set(token, provider);
39
+ }
40
+ /**
41
+ * The getProvider() method returns a specified element from a Map object.
42
+ * @returns Returns the element associated with the specified key or undefined if the key can't be found in the Map object.
43
+ * @param token
44
+ */
45
+ getProvider(token) {
46
+ return super.get(token);
47
+ }
48
+ /**
49
+ * Get all providers registered in the injector container.
50
+ *
51
+ * @param {ProviderType} type Filter the list by the given ProviderType.
52
+ * @returns {[TokenProvider , Provider<any>][]}
53
+ */
54
+ getProviders(type) {
55
+ // @ts-ignore
56
+ return [...this].reduce((providers, [_, provider]) => {
57
+ if (provider.type === type || !type) {
58
+ return [...providers, provider];
59
+ }
60
+ return providers;
61
+ }, []);
62
+ }
63
+ addProviders(container) {
64
+ container.forEach((provider) => {
65
+ if (!this.hasProvider(provider.provide)) {
66
+ this.setProvider(provider.provide, provider.clone());
67
+ }
68
+ });
69
+ }
70
+ }
71
+ exports.Container = Container;
@@ -0,0 +1,3 @@
1
+ import { Type } from "../commons";
2
+ import { Container } from './container';
3
+ export declare function createContainer(rootModule?: Type<any>): Container;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createContainer = createContainer;
4
+ const container_1 = require("./container");
5
+ function createContainer(rootModule) {
6
+ const container = new container_1.Container();
7
+ // const container = new Container(GlobalProvider.entries());
8
+ if (rootModule) {
9
+ container.delete(rootModule);
10
+ }
11
+ return container;
12
+ }
@@ -0,0 +1,2 @@
1
+ import { InjectorService } from "./InjectorService.js";
2
+ export declare function createInjector(): InjectorService;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createInjector = createInjector;
4
+ const InjectorService_js_1 = require("./InjectorService.js");
5
+ function createInjector() {
6
+ return new InjectorService_js_1.InjectorService();
7
+ }
@@ -0,0 +1,6 @@
1
+ export * from './container';
2
+ export * from './ContainerConfiguration';
3
+ export * from './createContainer';
4
+ export * from './createInjector';
5
+ export * from './middleware.resolver';
6
+ export * from './InjectorService';
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./container"), exports);
18
+ __exportStar(require("./ContainerConfiguration"), exports);
19
+ __exportStar(require("./createContainer"), exports);
20
+ __exportStar(require("./createInjector"), exports);
21
+ __exportStar(require("./middleware.resolver"), exports);
22
+ __exportStar(require("./InjectorService"), exports);
@@ -0,0 +1,9 @@
1
+ import { InjectorService } from './InjectorService';
2
+ import { TokenRouteWithProvider } from './ContainerConfiguration';
3
+ import { LocalsContainer } from '../domain/LocalsContainer';
4
+ declare class MiddlewareResolver {
5
+ resolveMiddlewares(route: TokenRouteWithProvider, injector: InjectorService, local: LocalsContainer): Promise<void>;
6
+ private resolve;
7
+ }
8
+ export declare const MiddlewareRes: MiddlewareResolver;
9
+ export {};
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MiddlewareRes = void 0;
4
+ const Context_1 = require("../domain/Context");
5
+ class MiddlewareResolver {
6
+ async resolveMiddlewares(route, injector, local) {
7
+ if (route.middlewares.length == 0) {
8
+ return;
9
+ }
10
+ await this.resolve(route.middlewares, injector, local);
11
+ }
12
+ async resolve(middlewares, injector, local) {
13
+ const context = local.get(Context_1.Context);
14
+ let currentIndex = 0;
15
+ const next = async () => {
16
+ if (currentIndex >= middlewares.length) {
17
+ // Se já processamos todos os middlewares, não faz nada.
18
+ // Isso evita o erro "Middleware stack exhausted" se um middleware chamar `next()`
19
+ // quando não há mais middlewares.
20
+ return;
21
+ }
22
+ const middleware = middlewares[currentIndex++];
23
+ // @ts-ignore
24
+ const instance = injector.invoke(middleware, local);
25
+ // Await a execução do middleware.
26
+ // Se o middleware lançar uma exceção, ela será propagada.
27
+ await instance.handle(context, next);
28
+ };
29
+ if (middlewares.length === 0)
30
+ return;
31
+ // Inicia a execução dos middlewares
32
+ await next();
33
+ }
34
+ }
35
+ exports.MiddlewareRes = new MiddlewareResolver();
@@ -0,0 +1,3 @@
1
+ export declare class DefaultRoutesCarno {
2
+ favicon(): Promise<boolean>;
3
+ }