@spinajs/http 2.0.179 → 2.0.181

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 (247) hide show
  1. package/lib/cjs/bootstrap.d.ts +4 -4
  2. package/lib/cjs/bootstrap.js +29 -29
  3. package/lib/cjs/bootstrap.js.map +1 -1
  4. package/lib/cjs/config/http.d.ts +58 -58
  5. package/lib/cjs/config/http.js +86 -86
  6. package/lib/cjs/controllers.d.ts +48 -48
  7. package/lib/cjs/controllers.d.ts.map +1 -1
  8. package/lib/cjs/controllers.js +307 -312
  9. package/lib/cjs/controllers.js.map +1 -1
  10. package/lib/cjs/decorators.d.ts +183 -183
  11. package/lib/cjs/decorators.js +441 -441
  12. package/lib/cjs/hydrators/DateTimeHydrator.d.ts +5 -5
  13. package/lib/cjs/hydrators/DateTimeHydrator.js +36 -36
  14. package/lib/cjs/hydrators/DateTimeHydrator.js.map +1 -1
  15. package/lib/cjs/index.d.ts +9 -9
  16. package/lib/cjs/index.js +25 -25
  17. package/lib/cjs/interfaces.d.ts +569 -550
  18. package/lib/cjs/interfaces.d.ts.map +1 -1
  19. package/lib/cjs/interfaces.js +266 -259
  20. package/lib/cjs/interfaces.js.map +1 -1
  21. package/lib/cjs/middlewares/RealIp.d.ts +8 -8
  22. package/lib/cjs/middlewares/RealIp.js +34 -34
  23. package/lib/cjs/middlewares/RealIp.js.map +1 -1
  24. package/lib/cjs/middlewares/RequestId.d.ts +8 -8
  25. package/lib/cjs/middlewares/RequestId.js +35 -35
  26. package/lib/cjs/middlewares/RequestId.js.map +1 -1
  27. package/lib/cjs/middlewares/ResponseTime.d.ts +10 -10
  28. package/lib/cjs/middlewares/ResponseTime.js +41 -41
  29. package/lib/cjs/middlewares/ResponseTime.js.map +1 -1
  30. package/lib/cjs/response-methods/badRequest.d.ts +12 -12
  31. package/lib/cjs/response-methods/badRequest.js +20 -20
  32. package/lib/cjs/response-methods/conflict.d.ts +12 -12
  33. package/lib/cjs/response-methods/conflict.js +20 -20
  34. package/lib/cjs/response-methods/cookieResponse.d.ts +19 -19
  35. package/lib/cjs/response-methods/cookieResponse.js +73 -73
  36. package/lib/cjs/response-methods/created.d.ts +12 -12
  37. package/lib/cjs/response-methods/created.js +19 -19
  38. package/lib/cjs/response-methods/errorResponse.d.ts +7 -7
  39. package/lib/cjs/response-methods/errorResponse.js +24 -24
  40. package/lib/cjs/response-methods/file.d.ts +26 -26
  41. package/lib/cjs/response-methods/file.d.ts.map +1 -1
  42. package/lib/cjs/response-methods/file.js +112 -133
  43. package/lib/cjs/response-methods/file.js.map +1 -1
  44. package/lib/cjs/response-methods/forbidden.d.ts +12 -12
  45. package/lib/cjs/response-methods/forbidden.js +20 -20
  46. package/lib/cjs/response-methods/index.d.ts +13 -13
  47. package/lib/cjs/response-methods/index.js +29 -29
  48. package/lib/cjs/response-methods/noContent.d.ts +12 -12
  49. package/lib/cjs/response-methods/noContent.js +20 -20
  50. package/lib/cjs/response-methods/notAcceptable.d.ts +13 -13
  51. package/lib/cjs/response-methods/notAcceptable.js +21 -21
  52. package/lib/cjs/response-methods/notAllowed.d.ts +12 -12
  53. package/lib/cjs/response-methods/notAllowed.js +20 -20
  54. package/lib/cjs/response-methods/notFound.d.ts +12 -12
  55. package/lib/cjs/response-methods/notFound.js +20 -20
  56. package/lib/cjs/response-methods/ok.d.ts +12 -12
  57. package/lib/cjs/response-methods/ok.js +19 -19
  58. package/lib/cjs/response-methods/redirect.d.ts +12 -12
  59. package/lib/cjs/response-methods/redirect.js +19 -19
  60. package/lib/cjs/response-methods/serverError.d.ts +12 -12
  61. package/lib/cjs/response-methods/serverError.js +20 -20
  62. package/lib/cjs/response-methods/template.d.ts +15 -15
  63. package/lib/cjs/response-methods/template.js +36 -36
  64. package/lib/cjs/response-methods/unauthorized.d.ts +12 -12
  65. package/lib/cjs/response-methods/unauthorized.js +20 -20
  66. package/lib/cjs/response-methods/validationError.d.ts +12 -12
  67. package/lib/cjs/response-methods/validationError.js +20 -20
  68. package/lib/cjs/responses.d.ts +34 -34
  69. package/lib/cjs/responses.js +173 -173
  70. package/lib/cjs/route-args/ArgAsRequest.d.ts +11 -11
  71. package/lib/cjs/route-args/ArgAsRequest.js +24 -24
  72. package/lib/cjs/route-args/ArgAsRequest.js.map +1 -1
  73. package/lib/cjs/route-args/ArgAsResponse.d.ts +10 -10
  74. package/lib/cjs/route-args/ArgAsResponse.js +24 -24
  75. package/lib/cjs/route-args/ArgAsResponse.js.map +1 -1
  76. package/lib/cjs/route-args/ArgHydrator.d.ts +4 -4
  77. package/lib/cjs/route-args/ArgHydrator.js +6 -6
  78. package/lib/cjs/route-args/FromBody.d.ts +10 -10
  79. package/lib/cjs/route-args/FromBody.js +26 -26
  80. package/lib/cjs/route-args/FromBody.js.map +1 -1
  81. package/lib/cjs/route-args/FromCookie.d.ts +13 -13
  82. package/lib/cjs/route-args/FromCookie.js +72 -72
  83. package/lib/cjs/route-args/FromCookie.js.map +1 -1
  84. package/lib/cjs/route-args/FromDi.d.ts +13 -13
  85. package/lib/cjs/route-args/FromDi.js +35 -35
  86. package/lib/cjs/route-args/FromDi.js.map +1 -1
  87. package/lib/cjs/route-args/FromForm.d.ts +66 -92
  88. package/lib/cjs/route-args/FromForm.d.ts.map +1 -1
  89. package/lib/cjs/route-args/FromForm.js +214 -291
  90. package/lib/cjs/route-args/FromForm.js.map +1 -1
  91. package/lib/cjs/route-args/FromHeaderArg.d.ts +10 -10
  92. package/lib/cjs/route-args/FromHeaderArg.js +25 -25
  93. package/lib/cjs/route-args/FromHeaderArg.js.map +1 -1
  94. package/lib/cjs/route-args/FromParams.d.ts +10 -10
  95. package/lib/cjs/route-args/FromParams.js +27 -27
  96. package/lib/cjs/route-args/FromParams.js.map +1 -1
  97. package/lib/cjs/route-args/FromQuery.d.ts +10 -10
  98. package/lib/cjs/route-args/FromQuery.js +27 -27
  99. package/lib/cjs/route-args/FromQuery.js.map +1 -1
  100. package/lib/cjs/route-args/RequestFields.d.ts +40 -40
  101. package/lib/cjs/route-args/RequestFields.js +110 -110
  102. package/lib/cjs/route-args/RequestFields.js.map +1 -1
  103. package/lib/cjs/route-args/RouteArgs.d.ts +22 -22
  104. package/lib/cjs/route-args/RouteArgs.js +114 -114
  105. package/lib/cjs/route-args/RouteArgs.js.map +1 -1
  106. package/lib/cjs/route-args/index.d.ts +12 -12
  107. package/lib/cjs/route-args/index.js +28 -28
  108. package/lib/cjs/schemas/RouteArgsSchemas.d.ts +36 -36
  109. package/lib/cjs/schemas/RouteArgsSchemas.js +26 -26
  110. package/lib/cjs/server.d.ts +50 -50
  111. package/lib/cjs/server.js +272 -272
  112. package/lib/cjs/server.js.map +1 -1
  113. package/lib/cjs/transformers/PureTransformer.d.ts +9 -9
  114. package/lib/cjs/transformers/PureTransformer.js +27 -27
  115. package/lib/cjs/transformers/PureTransformer.js.map +1 -1
  116. package/lib/cjs/transformers/index.d.ts +1 -1
  117. package/lib/cjs/transformers/index.js +17 -17
  118. package/lib/cjs/uploaders/ImmediateFileUploader.d.ts +19 -0
  119. package/lib/cjs/uploaders/ImmediateFileUploader.d.ts.map +1 -0
  120. package/lib/cjs/uploaders/ImmediateFileUploader.js +69 -0
  121. package/lib/cjs/uploaders/ImmediateFileUploader.js.map +1 -0
  122. package/lib/mjs/bootstrap.d.ts +4 -4
  123. package/lib/mjs/bootstrap.js +26 -26
  124. package/lib/mjs/bootstrap.js.map +1 -1
  125. package/lib/mjs/config/http.d.ts +58 -58
  126. package/lib/mjs/config/http.js +81 -81
  127. package/lib/mjs/controllers.d.ts +48 -48
  128. package/lib/mjs/controllers.d.ts.map +1 -1
  129. package/lib/mjs/controllers.js +276 -281
  130. package/lib/mjs/controllers.js.map +1 -1
  131. package/lib/mjs/decorators.d.ts +183 -183
  132. package/lib/mjs/decorators.js +404 -404
  133. package/lib/mjs/exceptions.d.ts +1 -1
  134. package/lib/mjs/exceptions.js +1 -1
  135. package/lib/mjs/hydrators/DateTimeHydrator.d.ts +5 -5
  136. package/lib/mjs/hydrators/DateTimeHydrator.js +30 -30
  137. package/lib/mjs/hydrators/DateTimeHydrator.js.map +1 -1
  138. package/lib/mjs/index.d.ts +9 -9
  139. package/lib/mjs/index.js +9 -9
  140. package/lib/mjs/interfaces.d.ts +569 -550
  141. package/lib/mjs/interfaces.d.ts.map +1 -1
  142. package/lib/mjs/interfaces.js +257 -251
  143. package/lib/mjs/interfaces.js.map +1 -1
  144. package/lib/mjs/middlewares/RealIp.d.ts +8 -8
  145. package/lib/mjs/middlewares/RealIp.js +31 -31
  146. package/lib/mjs/middlewares/RealIp.js.map +1 -1
  147. package/lib/mjs/middlewares/RequestId.d.ts +8 -8
  148. package/lib/mjs/middlewares/RequestId.js +32 -32
  149. package/lib/mjs/middlewares/RequestId.js.map +1 -1
  150. package/lib/mjs/middlewares/ResponseTime.d.ts +10 -10
  151. package/lib/mjs/middlewares/ResponseTime.js +38 -38
  152. package/lib/mjs/middlewares/ResponseTime.js.map +1 -1
  153. package/lib/mjs/response-methods/badRequest.d.ts +12 -12
  154. package/lib/mjs/response-methods/badRequest.js +16 -16
  155. package/lib/mjs/response-methods/conflict.d.ts +12 -12
  156. package/lib/mjs/response-methods/conflict.js +16 -16
  157. package/lib/mjs/response-methods/cookieResponse.d.ts +19 -19
  158. package/lib/mjs/response-methods/cookieResponse.js +46 -46
  159. package/lib/mjs/response-methods/created.d.ts +12 -12
  160. package/lib/mjs/response-methods/created.js +15 -15
  161. package/lib/mjs/response-methods/errorResponse.d.ts +7 -7
  162. package/lib/mjs/response-methods/errorResponse.js +17 -17
  163. package/lib/mjs/response-methods/file.d.ts +26 -26
  164. package/lib/mjs/response-methods/file.d.ts.map +1 -1
  165. package/lib/mjs/response-methods/file.js +103 -124
  166. package/lib/mjs/response-methods/file.js.map +1 -1
  167. package/lib/mjs/response-methods/forbidden.d.ts +12 -12
  168. package/lib/mjs/response-methods/forbidden.js +16 -16
  169. package/lib/mjs/response-methods/index.d.ts +13 -13
  170. package/lib/mjs/response-methods/index.js +13 -13
  171. package/lib/mjs/response-methods/noContent.d.ts +12 -12
  172. package/lib/mjs/response-methods/noContent.js +16 -16
  173. package/lib/mjs/response-methods/notAcceptable.d.ts +13 -13
  174. package/lib/mjs/response-methods/notAcceptable.js +17 -17
  175. package/lib/mjs/response-methods/notAllowed.d.ts +12 -12
  176. package/lib/mjs/response-methods/notAllowed.js +16 -16
  177. package/lib/mjs/response-methods/notFound.d.ts +12 -12
  178. package/lib/mjs/response-methods/notFound.js +16 -16
  179. package/lib/mjs/response-methods/ok.d.ts +12 -12
  180. package/lib/mjs/response-methods/ok.js +15 -15
  181. package/lib/mjs/response-methods/redirect.d.ts +12 -12
  182. package/lib/mjs/response-methods/redirect.js +15 -15
  183. package/lib/mjs/response-methods/serverError.d.ts +12 -12
  184. package/lib/mjs/response-methods/serverError.js +16 -16
  185. package/lib/mjs/response-methods/template.d.ts +15 -15
  186. package/lib/mjs/response-methods/template.js +29 -29
  187. package/lib/mjs/response-methods/unauthorized.d.ts +12 -12
  188. package/lib/mjs/response-methods/unauthorized.js +16 -16
  189. package/lib/mjs/response-methods/validationError.d.ts +12 -12
  190. package/lib/mjs/response-methods/validationError.js +16 -16
  191. package/lib/mjs/responses.d.ts +34 -34
  192. package/lib/mjs/responses.js +143 -143
  193. package/lib/mjs/route-args/ArgAsRequest.d.ts +11 -11
  194. package/lib/mjs/route-args/ArgAsRequest.js +21 -21
  195. package/lib/mjs/route-args/ArgAsRequest.js.map +1 -1
  196. package/lib/mjs/route-args/ArgAsResponse.d.ts +10 -10
  197. package/lib/mjs/route-args/ArgAsResponse.js +21 -21
  198. package/lib/mjs/route-args/ArgAsResponse.js.map +1 -1
  199. package/lib/mjs/route-args/ArgHydrator.d.ts +4 -4
  200. package/lib/mjs/route-args/ArgHydrator.js +2 -2
  201. package/lib/mjs/route-args/FromBody.d.ts +10 -10
  202. package/lib/mjs/route-args/FromBody.js +23 -23
  203. package/lib/mjs/route-args/FromBody.js.map +1 -1
  204. package/lib/mjs/route-args/FromCookie.d.ts +13 -13
  205. package/lib/mjs/route-args/FromCookie.js +46 -46
  206. package/lib/mjs/route-args/FromCookie.js.map +1 -1
  207. package/lib/mjs/route-args/FromDi.d.ts +13 -13
  208. package/lib/mjs/route-args/FromDi.js +32 -32
  209. package/lib/mjs/route-args/FromDi.js.map +1 -1
  210. package/lib/mjs/route-args/FromForm.d.ts +66 -92
  211. package/lib/mjs/route-args/FromForm.d.ts.map +1 -1
  212. package/lib/mjs/route-args/FromForm.js +210 -284
  213. package/lib/mjs/route-args/FromForm.js.map +1 -1
  214. package/lib/mjs/route-args/FromHeaderArg.d.ts +10 -10
  215. package/lib/mjs/route-args/FromHeaderArg.js +22 -22
  216. package/lib/mjs/route-args/FromHeaderArg.js.map +1 -1
  217. package/lib/mjs/route-args/FromParams.d.ts +10 -10
  218. package/lib/mjs/route-args/FromParams.js +24 -24
  219. package/lib/mjs/route-args/FromParams.js.map +1 -1
  220. package/lib/mjs/route-args/FromQuery.d.ts +10 -10
  221. package/lib/mjs/route-args/FromQuery.js +24 -24
  222. package/lib/mjs/route-args/FromQuery.js.map +1 -1
  223. package/lib/mjs/route-args/RequestFields.d.ts +40 -40
  224. package/lib/mjs/route-args/RequestFields.js +107 -107
  225. package/lib/mjs/route-args/RequestFields.js.map +1 -1
  226. package/lib/mjs/route-args/RouteArgs.d.ts +22 -22
  227. package/lib/mjs/route-args/RouteArgs.js +107 -107
  228. package/lib/mjs/route-args/RouteArgs.js.map +1 -1
  229. package/lib/mjs/route-args/index.d.ts +12 -12
  230. package/lib/mjs/route-args/index.js +12 -12
  231. package/lib/mjs/schemas/RouteArgsSchemas.d.ts +36 -36
  232. package/lib/mjs/schemas/RouteArgsSchemas.js +23 -23
  233. package/lib/mjs/server.d.ts +50 -50
  234. package/lib/mjs/server.js +266 -266
  235. package/lib/mjs/server.js.map +1 -1
  236. package/lib/mjs/transformers/PureTransformer.d.ts +9 -9
  237. package/lib/mjs/transformers/PureTransformer.js +24 -24
  238. package/lib/mjs/transformers/PureTransformer.js.map +1 -1
  239. package/lib/mjs/transformers/index.d.ts +1 -1
  240. package/lib/mjs/transformers/index.js +1 -1
  241. package/lib/mjs/uploaders/ImmediateFileUploader.d.ts +19 -0
  242. package/lib/mjs/uploaders/ImmediateFileUploader.d.ts.map +1 -0
  243. package/lib/mjs/uploaders/ImmediateFileUploader.js +66 -0
  244. package/lib/mjs/uploaders/ImmediateFileUploader.js.map +1 -0
  245. package/lib/tsconfig.cjs.tsbuildinfo +1 -1
  246. package/lib/tsconfig.mjs.tsbuildinfo +1 -1
  247. package/package.json +17 -17
@@ -1,313 +1,308 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
- 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;
22
- return c > 3 && r && Object.defineProperty(target, key, r), r;
23
- };
24
- var __importStar = (this && this.__importStar) || function (mod) {
25
- if (mod && mod.__esModule) return mod;
26
- var result = {};
27
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
28
- __setModuleDefault(result, mod);
29
- return result;
30
- };
31
- var __metadata = (this && this.__metadata) || function (k, v) {
32
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
33
- };
34
- var __importDefault = (this && this.__importDefault) || function (mod) {
35
- return (mod && mod.__esModule) ? mod : { "default": mod };
36
- };
37
- Object.defineProperty(exports, "__esModule", { value: true });
38
- exports.Controllers = exports.BaseController = void 0;
39
- const interfaces_js_1 = require("./interfaces.js");
40
- const di_1 = require("@spinajs/di");
41
- const express = __importStar(require("express"));
42
- const decorators_js_1 = require("./decorators.js");
43
- const exceptions_1 = require("@spinajs/exceptions");
44
- const reflection_1 = require("@spinajs/reflection");
45
- const server_js_1 = require("./server.js");
46
- const log_1 = require("@spinajs/log");
47
- const validation_1 = require("@spinajs/validation");
48
- const node_async_hooks_1 = require("node:async_hooks");
49
- const types_1 = require("node:util/types");
50
- const interfaces_js_2 = require("./interfaces.js");
51
- const fs = __importStar(require("fs"));
52
- const node_path_1 = require("node:path");
53
- const configuration_1 = require("@spinajs/configuration");
54
- const lodash_1 = __importDefault(require("lodash"));
55
- class BaseController extends di_1.AsyncService {
56
- /**
57
- * Express router with middleware stack
58
- */
59
- get Router() {
60
- return this._router;
61
- }
62
- /**
63
- * Controller descriptor
64
- */
65
- get Descriptor() {
66
- return Reflect.getMetadata(decorators_js_1.CONTROLLED_DESCRIPTOR_SYMBOL, this);
67
- }
68
- /**
69
- * Base path for all controller routes eg. my/custom/path/
70
- *
71
- * It can be defined via `@BasePath` decorator, defaults to controller name without `Controller` part.
72
- */
73
- get BasePath() {
74
- return this.Descriptor.BasePath ? this.Descriptor.BasePath : this.constructor.name.toLowerCase();
75
- }
76
- async resolve() {
77
- const self = this;
78
- if (!this.Descriptor) {
79
- this._log.warn(`Controller ${this.constructor.name} does not have descriptor. It its abstract or base class ignore this message.`);
80
- return;
81
- }
82
- this._router = express.Router();
83
- this._actionLocalStorage = di_1.DI.get((node_async_hooks_1.AsyncLocalStorage));
84
- for (const [, route] of this.Descriptor.Routes) {
85
- const handlers = [];
86
- let path = '';
87
- if (route.Path) {
88
- if (route.Path === '/') {
89
- path = `/${this.BasePath}`;
90
- }
91
- else {
92
- path = `/${this.BasePath}/${route.Path}`;
93
- }
94
- }
95
- else {
96
- path = `/${this.BasePath}/${route.Method}`;
97
- }
98
- const middlewares = await Promise.all(this.Descriptor.Middlewares.concat(route.Middlewares || []).map((m) => {
99
- return self._container.resolve(m.Type, m.Options);
100
- }));
101
- const policies = await Promise.all(this.Descriptor.Policies.concat(route.Policies || [])
102
- .map((m) => {
103
- if (lodash_1.default.isString(m.Type)) {
104
- const policyType = this._cfg.get(m.Type);
105
- if (!di_1.DI.checkType(interfaces_js_1.BasePolicy, policyType)) {
106
- self._log.warn(`No policy named ${policyType} is registered ( check your configuration at ${m.Type})`);
107
- return null;
108
- }
109
- else {
110
- self._log.trace(`Policy ${policyType} is used in controller ${self.constructor.name}::${route.Method} at path ${path}`);
111
- return self._container.resolve(policyType, m.Options);
112
- }
113
- }
114
- else {
115
- self._log.trace(`Policy ${m.Type.name} is used in controller ${self.constructor.name}::${route.Method} at path ${path}`);
116
- return self._container.resolve(m.Type, m.Options);
117
- }
118
- })
119
- .filter((x) => x !== null));
120
- const enabledMiddlewares = middlewares.filter((m) => m.isEnabled(route, this));
121
- this._log.trace(`Registering route ${route.Type.toUpperCase()} ${this.constructor.name}::${route.Method} at ${path}`);
122
- handlers.push(...policies.filter((p) => p.isEnabled(route, this)).map((p) => _invokePolicyAction(p, p.execute.bind(p), route)));
123
- handlers.push(...enabledMiddlewares.map((m) => _invokeAction(m, m.onBefore.bind(m), route)));
124
- const acionWrapper = async (req, res, next) => {
125
- try {
126
- await this._actionLocalStorage.run(req.storage, async () => {
127
- const args = (await _extractRouteArgs(route, req, res)).concat([req, res, next]);
128
- try {
129
- const result = this[route.Method].call(this, ...args);
130
- if ((0, types_1.isPromise)(result)) {
131
- result
132
- .then((r) => {
133
- if (r instanceof interfaces_js_2.Response) {
134
- enabledMiddlewares.forEach((x) => x.onResponse(r, route, this));
135
- }
136
- res.locals.response = r;
137
- next();
138
- })
139
- .catch((err) => {
140
- next(err);
141
- });
142
- }
143
- else {
144
- if (result instanceof interfaces_js_2.Response) {
145
- enabledMiddlewares.forEach((x) => x.onResponse(result, route, this));
146
- }
147
- res.locals.response = result;
148
- next();
149
- }
150
- }
151
- catch (err) {
152
- next(err);
153
- }
154
- });
155
- }
156
- catch (err) {
157
- next(err);
158
- }
159
- };
160
- Object.defineProperty(acionWrapper, 'name', {
161
- value: this.constructor.name,
162
- writable: true,
163
- });
164
- handlers.push(acionWrapper);
165
- handlers.push(...enabledMiddlewares.map((m) => _invokeAction(m, m.onAfter.bind(m), route)));
166
- // register to express router
167
- this._router[route.InternalType](path, handlers);
168
- }
169
- function _invokeAction(source, action, route) {
170
- const wrapper = (req, res, next) => {
171
- action(req, res, route, self)
172
- .then(() => {
173
- next();
174
- })
175
- .catch((err) => {
176
- next(err);
177
- });
178
- };
179
- Object.defineProperty(wrapper, 'name', {
180
- value: source.constructor.name,
181
- writable: true,
182
- });
183
- return wrapper;
184
- }
185
- function _invokePolicyAction(source, action, route) {
186
- const wrapper = (req, _res, next) => {
187
- action(req, route, self)
188
- .then(next)
189
- .catch((err) => {
190
- self._log.trace(`route ${self.constructor.name}:${route.Method} ${self.BasePath}${route.Path} error ${err}, policy: ${source.constructor.name}`);
191
- next(err);
192
- });
193
- };
194
- Object.defineProperty(wrapper, 'name', {
195
- value: source.constructor.name,
196
- writable: true,
197
- });
198
- return wrapper;
199
- }
200
- async function _extractRouteArgs(route, req, res) {
201
- const args = new Array(route.Parameters.size);
202
- let callData = {
203
- Payload: {},
204
- };
205
- const argsCache = new Map();
206
- let formCache = null;
207
- for (const [, param] of route.Parameters) {
208
- if (!argsCache.has(param.Type)) {
209
- const fArg = await di_1.DI.resolve(param.Type, formCache ? [formCache.Data] : []);
210
- argsCache.set(param.Type, fArg);
211
- if (!formCache && (param.Type === interfaces_js_1.ParameterType.FormField || param.Type === interfaces_js_1.ParameterType.FromCSV || param.Type === interfaces_js_1.ParameterType.FromJSONFile || param.Type === interfaces_js_1.ParameterType.FromForm || param.Type === interfaces_js_1.ParameterType.FromFile)) {
212
- formCache = fArg;
213
- }
214
- }
215
- const extractor = argsCache.get(param.Type);
216
- if (!extractor) {
217
- throw new exceptions_1.UnexpectedServerError('invalid route parameter type for param: ' + param.Name);
218
- }
219
- const { Args } = await extractor.extract(callData, param, req, res, route);
220
- args[param.Index] = Args;
221
- }
222
- return args;
223
- }
224
- }
225
- }
226
- __decorate([
227
- (0, di_1.Autoinject)(di_1.Container),
228
- __metadata("design:type", Object)
229
- ], BaseController.prototype, "_container", void 0);
230
- __decorate([
231
- (0, di_1.Autoinject)(),
232
- __metadata("design:type", validation_1.DataValidator)
233
- ], BaseController.prototype, "_validator", void 0);
234
- __decorate([
235
- (0, log_1.Logger)('http'),
236
- __metadata("design:type", log_1.Log)
237
- ], BaseController.prototype, "_log", void 0);
238
- __decorate([
239
- (0, di_1.Autoinject)(),
240
- __metadata("design:type", node_async_hooks_1.AsyncLocalStorage)
241
- ], BaseController.prototype, "_actionLocalStorage", void 0);
242
- __decorate([
243
- (0, di_1.Autoinject)(configuration_1.Configuration),
244
- __metadata("design:type", configuration_1.Configuration)
245
- ], BaseController.prototype, "_cfg", void 0);
246
- exports.BaseController = BaseController;
247
- class Controllers extends di_1.AsyncService {
248
- async registerFromFile(file) {
249
- if (!fs.existsSync(file)) {
250
- throw new exceptions_1.IOFail(`Controller file at path ${file} not found`);
251
- }
252
- const types = await di_1.DI.__spinajs_require__(file.replace('.js', '.d.ts'));
253
- const typeName = (0, node_path_1.basename)((0, node_path_1.basename)(file, '.js'), '.ts');
254
- const type = types[typeName];
255
- const instance = await di_1.DI.resolve(type);
256
- const ci = new di_1.ClassInfo();
257
- ci.file = file.replace('.js', '.d.ts');
258
- ci.instance = instance;
259
- ci.name = typeName;
260
- ci.type = type;
261
- return await this.register(ci);
262
- }
263
- async register(controller) {
264
- this.Log.trace(`Loading controller: ${controller.name}`);
265
- const compiler = new reflection_1.TypescriptCompiler(controller.file.replace('.js', '.d.ts'));
266
- const members = compiler.getClassMembers(controller.name);
267
- if (!controller.instance.Descriptor) {
268
- this.Log.warn(`Controller ${controller.name} in file ${controller.file} dont have descriptor or routes defined`);
269
- }
270
- else {
271
- for (const [name, route] of controller.instance.Descriptor.Routes) {
272
- if (members.has(name)) {
273
- const member = members.get(name);
274
- for (const [index, rParam] of route.Parameters) {
275
- const parameterInfo = member.parameters[index];
276
- if (parameterInfo) {
277
- rParam.Name = parameterInfo.name.text;
278
- }
279
- }
280
- }
281
- else {
282
- this.Log.error(`Controller ${controller.name} does not have member ${name} for route ${route.Path}`);
283
- }
284
- }
285
- this.Server.use(controller.instance.Router);
286
- }
287
- }
288
- async resolve() {
289
- const controllers = await this.Controllers;
290
- // extract parameters info from controllers source code & register in http server
291
- for (const controller of controllers.filter((x) => x !== undefined && x !== null)) {
292
- this.register(controller);
293
- }
294
- }
295
- }
296
- __decorate([
297
- (0, reflection_1.ResolveFromFiles)('/**/!(*.d).{ts,js}', 'system.dirs.controllers'),
298
- __metadata("design:type", Promise)
299
- ], Controllers.prototype, "Controllers", void 0);
300
- __decorate([
301
- (0, log_1.Logger)('http'),
302
- __metadata("design:type", log_1.Log)
303
- ], Controllers.prototype, "Log", void 0);
304
- __decorate([
305
- (0, di_1.Autoinject)(di_1.Container),
306
- __metadata("design:type", Object)
307
- ], Controllers.prototype, "Container", void 0);
308
- __decorate([
309
- (0, di_1.Autoinject)(),
310
- __metadata("design:type", server_js_1.HttpServer)
311
- ], Controllers.prototype, "Server", void 0);
312
- exports.Controllers = Controllers;
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ 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;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || function (mod) {
25
+ if (mod && mod.__esModule) return mod;
26
+ var result = {};
27
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
28
+ __setModuleDefault(result, mod);
29
+ return result;
30
+ };
31
+ var __metadata = (this && this.__metadata) || function (k, v) {
32
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.Controllers = exports.BaseController = void 0;
39
+ const node_async_hooks_1 = require("node:async_hooks");
40
+ const types_1 = require("node:util/types");
41
+ const node_path_1 = require("node:path");
42
+ const fs = __importStar(require("node:fs"));
43
+ const express = __importStar(require("express"));
44
+ const lodash_1 = __importDefault(require("lodash"));
45
+ const di_1 = require("@spinajs/di");
46
+ const exceptions_1 = require("@spinajs/exceptions");
47
+ const reflection_1 = require("@spinajs/reflection");
48
+ const log_1 = require("@spinajs/log");
49
+ const validation_1 = require("@spinajs/validation");
50
+ const configuration_1 = require("@spinajs/configuration");
51
+ const server_js_1 = require("./server.js");
52
+ const interfaces_js_1 = require("./interfaces.js");
53
+ const decorators_js_1 = require("./decorators.js");
54
+ const util_1 = require("@spinajs/util");
55
+ class BaseController extends di_1.AsyncService {
56
+ /**
57
+ * Express router with middleware stack
58
+ */
59
+ get Router() {
60
+ return this._router;
61
+ }
62
+ /**
63
+ * Controller descriptor
64
+ */
65
+ get Descriptor() {
66
+ return Reflect.getMetadata(decorators_js_1.CONTROLLED_DESCRIPTOR_SYMBOL, this);
67
+ }
68
+ /**
69
+ * Base path for all controller routes eg. my/custom/path/
70
+ *
71
+ * It can be defined via `@BasePath` decorator, defaults to controller name without `Controller` part.
72
+ */
73
+ get BasePath() {
74
+ return this.Descriptor.BasePath ? this.Descriptor.BasePath : this.constructor.name.toLowerCase();
75
+ }
76
+ async resolve() {
77
+ const self = this;
78
+ if (!this.Descriptor) {
79
+ this._log.warn(`Controller ${this.constructor.name} does not have descriptor. It its abstract or base class ignore this message.`);
80
+ return;
81
+ }
82
+ this._router = express.Router();
83
+ this._actionLocalStorage = di_1.DI.get((node_async_hooks_1.AsyncLocalStorage));
84
+ for (const [, route] of this.Descriptor.Routes) {
85
+ const handlers = [];
86
+ let path = '';
87
+ if (route.Path) {
88
+ if (route.Path === '/') {
89
+ path = `/${this.BasePath}`;
90
+ }
91
+ else {
92
+ path = `/${this.BasePath}/${route.Path}`;
93
+ }
94
+ }
95
+ else {
96
+ path = `/${this.BasePath}/${route.Method}`;
97
+ }
98
+ const middlewares = await Promise.all(this.Descriptor.Middlewares.concat(route.Middlewares || []).map((m) => {
99
+ return self._container.resolve(m.Type, m.Options);
100
+ }));
101
+ const policies = await Promise.all(this.Descriptor.Policies.concat(route.Policies || [])
102
+ .map((m) => {
103
+ if (lodash_1.default.isString(m.Type)) {
104
+ const policyType = this._cfg.get(m.Type);
105
+ if (!di_1.DI.checkType(interfaces_js_1.BasePolicy, policyType)) {
106
+ self._log.warn(`No policy named ${policyType} is registered ( check your configuration at ${m.Type})`);
107
+ return null;
108
+ }
109
+ else {
110
+ self._log.trace(`Policy ${policyType} is used in controller ${self.constructor.name}::${route.Method} at path ${path}`);
111
+ return self._container.resolve(policyType, m.Options);
112
+ }
113
+ }
114
+ else {
115
+ self._log.trace(`Policy ${m.Type.name} is used in controller ${self.constructor.name}::${route.Method} at path ${path}`);
116
+ return self._container.resolve(m.Type, m.Options);
117
+ }
118
+ })
119
+ .filter((x) => x !== null));
120
+ const enabledMiddlewares = middlewares.filter((m) => m.isEnabled(route, this));
121
+ this._log.trace(`Registering route ${route.Type.toUpperCase()} ${this.constructor.name}::${route.Method} at ${path}`);
122
+ handlers.push(...policies.filter((p) => p.isEnabled(route, this)).map((p) => _invokePolicyAction(p, p.execute.bind(p), route)));
123
+ handlers.push(...enabledMiddlewares.map((m) => _invokeAction(m, m.onBefore.bind(m), route)));
124
+ const acionWrapper = async (req, res, next) => {
125
+ try {
126
+ await this._actionLocalStorage.run(req.storage, async () => {
127
+ const args = (await _extractRouteArgs(route, req, res)).concat([req, res, next]);
128
+ try {
129
+ const result = this[route.Method].call(this, ...args);
130
+ if ((0, types_1.isPromise)(result)) {
131
+ result
132
+ .then((r) => {
133
+ if (r instanceof interfaces_js_1.Response) {
134
+ enabledMiddlewares.forEach((x) => x.onResponse(r, route, this));
135
+ }
136
+ res.locals.response = r;
137
+ next();
138
+ })
139
+ .catch((err) => {
140
+ next(err);
141
+ });
142
+ }
143
+ else {
144
+ if (result instanceof interfaces_js_1.Response) {
145
+ enabledMiddlewares.forEach((x) => x.onResponse(result, route, this));
146
+ }
147
+ res.locals.response = result;
148
+ next();
149
+ }
150
+ }
151
+ catch (err) {
152
+ next(err);
153
+ }
154
+ });
155
+ }
156
+ catch (err) {
157
+ next(err);
158
+ }
159
+ };
160
+ Object.defineProperty(acionWrapper, 'name', {
161
+ value: this.constructor.name,
162
+ writable: true,
163
+ });
164
+ handlers.push(acionWrapper);
165
+ handlers.push(...enabledMiddlewares.map((m) => _invokeAction(m, m.onAfter.bind(m), route)));
166
+ // register to express router
167
+ this._router[route.InternalType](path, handlers);
168
+ }
169
+ function _invokeAction(source, action, route) {
170
+ const wrapper = (req, res, next) => {
171
+ action(req, res, route, self)
172
+ .then(() => {
173
+ next();
174
+ })
175
+ .catch((err) => {
176
+ next(err);
177
+ });
178
+ };
179
+ Object.defineProperty(wrapper, 'name', {
180
+ value: source.constructor.name,
181
+ writable: true,
182
+ });
183
+ return wrapper;
184
+ }
185
+ function _invokePolicyAction(source, action, route) {
186
+ const wrapper = (req, _res, next) => {
187
+ action(req, route, self)
188
+ .then(next)
189
+ .catch((err) => {
190
+ self._log.trace(`route ${self.constructor.name}:${route.Method} ${self.BasePath}${route.Path} error ${err}, policy: ${source.constructor.name}`);
191
+ next(err);
192
+ });
193
+ };
194
+ Object.defineProperty(wrapper, 'name', {
195
+ value: source.constructor.name,
196
+ writable: true,
197
+ });
198
+ return wrapper;
199
+ }
200
+ async function _extractRouteArgs(route, req, res) {
201
+ const callArgs = new Array(route.Parameters.size);
202
+ const argsCache = new Map();
203
+ let callData = {
204
+ Payload: {},
205
+ };
206
+ for (const [, param] of route.Parameters) {
207
+ const routeArgsHandler = await (0, util_1.tryGetHash)(argsCache, param.Type, () => di_1.DI.resolve(param.Type));
208
+ if (!routeArgsHandler) {
209
+ throw new exceptions_1.UnexpectedServerError(`invalid route parameter type for param: ${param.Name},
210
+ method: ${route.Method},
211
+ controller: ${self.constructor.name}`);
212
+ }
213
+ const { Args, CallData } = await routeArgsHandler.extract(callData, param, req, res, route);
214
+ callData = CallData;
215
+ callArgs[param.Index] = Args;
216
+ }
217
+ return callArgs;
218
+ }
219
+ }
220
+ }
221
+ exports.BaseController = BaseController;
222
+ __decorate([
223
+ (0, di_1.Autoinject)(di_1.Container),
224
+ __metadata("design:type", Object)
225
+ ], BaseController.prototype, "_container", void 0);
226
+ __decorate([
227
+ (0, di_1.Autoinject)(),
228
+ __metadata("design:type", validation_1.DataValidator)
229
+ ], BaseController.prototype, "_validator", void 0);
230
+ __decorate([
231
+ (0, log_1.Logger)('http'),
232
+ __metadata("design:type", log_1.Log)
233
+ ], BaseController.prototype, "_log", void 0);
234
+ __decorate([
235
+ (0, di_1.Autoinject)(),
236
+ __metadata("design:type", node_async_hooks_1.AsyncLocalStorage)
237
+ ], BaseController.prototype, "_actionLocalStorage", void 0);
238
+ __decorate([
239
+ (0, di_1.Autoinject)(configuration_1.Configuration),
240
+ __metadata("design:type", configuration_1.Configuration)
241
+ ], BaseController.prototype, "_cfg", void 0);
242
+ class Controllers extends di_1.AsyncService {
243
+ async registerFromFile(file) {
244
+ if (!fs.existsSync(file)) {
245
+ throw new exceptions_1.IOFail(`Controller file at path ${file} not found`);
246
+ }
247
+ const types = await di_1.DI.__spinajs_require__(file.replace('.js', '.d.ts'));
248
+ const typeName = (0, node_path_1.basename)((0, node_path_1.basename)(file, '.js'), '.ts');
249
+ const type = types[typeName];
250
+ const instance = await di_1.DI.resolve(type);
251
+ const ci = new di_1.ClassInfo();
252
+ ci.file = file.replace('.js', '.d.ts');
253
+ ci.instance = instance;
254
+ ci.name = typeName;
255
+ ci.type = type;
256
+ return await this.register(ci);
257
+ }
258
+ async register(controller) {
259
+ this.Log.trace(`Loading controller: ${controller.name}`);
260
+ const compiler = new reflection_1.TypescriptCompiler(controller.file.replace('.js', '.d.ts'));
261
+ const members = compiler.getClassMembers(controller.name);
262
+ if (!controller.instance.Descriptor) {
263
+ this.Log.warn(`Controller ${controller.name} in file ${controller.file} dont have descriptor or routes defined`);
264
+ }
265
+ else {
266
+ for (const [name, route] of controller.instance.Descriptor.Routes) {
267
+ if (members.has(name)) {
268
+ const member = members.get(name);
269
+ for (const [index, rParam] of route.Parameters) {
270
+ const parameterInfo = member.parameters[index];
271
+ if (parameterInfo) {
272
+ rParam.Name = parameterInfo.name.text;
273
+ }
274
+ }
275
+ }
276
+ else {
277
+ this.Log.error(`Controller ${controller.name} does not have member ${name} for route ${route.Path}`);
278
+ }
279
+ }
280
+ this.Server.use(controller.instance.Router);
281
+ }
282
+ }
283
+ async resolve() {
284
+ const controllers = await this.Controllers;
285
+ // extract parameters info from controllers source code & register in http server
286
+ for (const controller of controllers.filter((x) => x !== undefined && x !== null)) {
287
+ this.register(controller);
288
+ }
289
+ }
290
+ }
291
+ exports.Controllers = Controllers;
292
+ __decorate([
293
+ (0, reflection_1.ResolveFromFiles)('/**/!(*.d).{ts,js}', 'system.dirs.controllers'),
294
+ __metadata("design:type", Promise)
295
+ ], Controllers.prototype, "Controllers", void 0);
296
+ __decorate([
297
+ (0, log_1.Logger)('http'),
298
+ __metadata("design:type", log_1.Log)
299
+ ], Controllers.prototype, "Log", void 0);
300
+ __decorate([
301
+ (0, di_1.Autoinject)(di_1.Container),
302
+ __metadata("design:type", Object)
303
+ ], Controllers.prototype, "Container", void 0);
304
+ __decorate([
305
+ (0, di_1.Autoinject)(),
306
+ __metadata("design:type", server_js_1.HttpServer)
307
+ ], Controllers.prototype, "Server", void 0);
313
308
  //# sourceMappingURL=controllers.js.map