@depup/nestjs__core 11.1.17-depup.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (371) hide show
  1. package/LICENSE +22 -0
  2. package/PACKAGE.md +1 -0
  3. package/README.md +25 -0
  4. package/Readme.md +146 -0
  5. package/adapters/http-adapter.d.ts +80 -0
  6. package/adapters/http-adapter.js +90 -0
  7. package/adapters/index.d.ts +1 -0
  8. package/adapters/index.js +4 -0
  9. package/application-config.d.ts +47 -0
  10. package/application-config.js +107 -0
  11. package/changes.json +5 -0
  12. package/constants.d.ts +14 -0
  13. package/constants.js +21 -0
  14. package/discovery/discoverable-meta-host-collection.d.ts +46 -0
  15. package/discovery/discoverable-meta-host-collection.js +98 -0
  16. package/discovery/discovery-module.d.ts +5 -0
  17. package/discovery/discovery-module.js +19 -0
  18. package/discovery/discovery-service.d.ts +76 -0
  19. package/discovery/discovery-service.js +98 -0
  20. package/discovery/index.d.ts +2 -0
  21. package/discovery/index.js +5 -0
  22. package/errors/exception-handler.d.ts +4 -0
  23. package/errors/exception-handler.js +11 -0
  24. package/errors/exceptions/circular-dependency.exception.d.ts +4 -0
  25. package/errors/exceptions/circular-dependency.exception.js +11 -0
  26. package/errors/exceptions/index.d.ts +8 -0
  27. package/errors/exceptions/index.js +11 -0
  28. package/errors/exceptions/invalid-class-module.exception.d.ts +4 -0
  29. package/errors/exceptions/invalid-class-module.exception.js +11 -0
  30. package/errors/exceptions/invalid-class-scope.exception.d.ts +5 -0
  31. package/errors/exceptions/invalid-class-scope.exception.js +16 -0
  32. package/errors/exceptions/invalid-class.exception.d.ts +4 -0
  33. package/errors/exceptions/invalid-class.exception.js +11 -0
  34. package/errors/exceptions/invalid-exception-filter.exception.d.ts +4 -0
  35. package/errors/exceptions/invalid-exception-filter.exception.js +11 -0
  36. package/errors/exceptions/invalid-middleware-configuration.exception.d.ts +4 -0
  37. package/errors/exceptions/invalid-middleware-configuration.exception.js +11 -0
  38. package/errors/exceptions/invalid-middleware.exception.d.ts +4 -0
  39. package/errors/exceptions/invalid-middleware.exception.js +11 -0
  40. package/errors/exceptions/invalid-module.exception.d.ts +4 -0
  41. package/errors/exceptions/invalid-module.exception.js +11 -0
  42. package/errors/exceptions/runtime.exception.d.ts +4 -0
  43. package/errors/exceptions/runtime.exception.js +12 -0
  44. package/errors/exceptions/undefined-dependency.exception.d.ts +6 -0
  45. package/errors/exceptions/undefined-dependency.exception.js +11 -0
  46. package/errors/exceptions/undefined-forwardref.exception.d.ts +5 -0
  47. package/errors/exceptions/undefined-forwardref.exception.js +11 -0
  48. package/errors/exceptions/undefined-module.exception.d.ts +4 -0
  49. package/errors/exceptions/undefined-module.exception.js +11 -0
  50. package/errors/exceptions/unknown-dependencies.exception.d.ts +16 -0
  51. package/errors/exceptions/unknown-dependencies.exception.js +15 -0
  52. package/errors/exceptions/unknown-element.exception.d.ts +4 -0
  53. package/errors/exceptions/unknown-element.exception.js +11 -0
  54. package/errors/exceptions/unknown-export.exception.d.ts +4 -0
  55. package/errors/exceptions/unknown-export.exception.js +11 -0
  56. package/errors/exceptions/unknown-module.exception.d.ts +4 -0
  57. package/errors/exceptions/unknown-module.exception.js +10 -0
  58. package/errors/exceptions/unknown-request-mapping.exception.d.ts +5 -0
  59. package/errors/exceptions/unknown-request-mapping.exception.js +11 -0
  60. package/errors/exceptions-zone.d.ts +5 -0
  61. package/errors/exceptions-zone.js +34 -0
  62. package/errors/messages.d.ts +17 -0
  63. package/errors/messages.js +174 -0
  64. package/exceptions/base-exception-filter-context.d.ts +14 -0
  65. package/exceptions/base-exception-filter-context.js +56 -0
  66. package/exceptions/base-exception-filter.d.ts +20 -0
  67. package/exceptions/base-exception-filter.js +72 -0
  68. package/exceptions/exceptions-handler.d.ts +10 -0
  69. package/exceptions/exceptions-handler.js +34 -0
  70. package/exceptions/external-exception-filter-context.d.ts +12 -0
  71. package/exceptions/external-exception-filter-context.js +42 -0
  72. package/exceptions/external-exception-filter.d.ts +5 -0
  73. package/exceptions/external-exception-filter.js +15 -0
  74. package/exceptions/external-exceptions-handler.d.ts +9 -0
  75. package/exceptions/external-exceptions-handler.js +34 -0
  76. package/exceptions/index.d.ts +1 -0
  77. package/exceptions/index.js +4 -0
  78. package/guards/constants.d.ts +1 -0
  79. package/guards/constants.js +4 -0
  80. package/guards/guards-consumer.d.ts +9 -0
  81. package/guards/guards-consumer.js +39 -0
  82. package/guards/guards-context-creator.d.ts +17 -0
  83. package/guards/guards-context-creator.js +70 -0
  84. package/guards/index.d.ts +3 -0
  85. package/guards/index.js +6 -0
  86. package/helpers/barrier.d.ts +30 -0
  87. package/helpers/barrier.js +46 -0
  88. package/helpers/context-creator.d.ts +10 -0
  89. package/helpers/context-creator.js +33 -0
  90. package/helpers/context-id-factory.d.ts +41 -0
  91. package/helpers/context-id-factory.js +67 -0
  92. package/helpers/context-utils.d.ts +23 -0
  93. package/helpers/context-utils.js +55 -0
  94. package/helpers/execution-context-host.d.ts +19 -0
  95. package/helpers/execution-context-host.js +50 -0
  96. package/helpers/external-context-creator.d.ts +51 -0
  97. package/helpers/external-context-creator.js +166 -0
  98. package/helpers/external-proxy.d.ts +5 -0
  99. package/helpers/external-proxy.js +19 -0
  100. package/helpers/get-class-scope.d.ts +3 -0
  101. package/helpers/get-class-scope.js +8 -0
  102. package/helpers/handler-metadata-storage.d.ts +27 -0
  103. package/helpers/handler-metadata-storage.js +26 -0
  104. package/helpers/http-adapter-host.d.ts +51 -0
  105. package/helpers/http-adapter-host.js +73 -0
  106. package/helpers/index.d.ts +3 -0
  107. package/helpers/index.js +6 -0
  108. package/helpers/interfaces/external-handler-metadata.interface.d.ts +11 -0
  109. package/helpers/interfaces/external-handler-metadata.interface.js +2 -0
  110. package/helpers/interfaces/index.d.ts +2 -0
  111. package/helpers/interfaces/index.js +5 -0
  112. package/helpers/interfaces/params-metadata.interface.d.ts +6 -0
  113. package/helpers/interfaces/params-metadata.interface.js +2 -0
  114. package/helpers/is-durable.d.ts +2 -0
  115. package/helpers/is-durable.js +8 -0
  116. package/helpers/load-adapter.d.ts +1 -0
  117. package/helpers/load-adapter.js +15 -0
  118. package/helpers/messages.d.ts +7 -0
  119. package/helpers/messages.js +29 -0
  120. package/helpers/optional-require.d.ts +1 -0
  121. package/helpers/optional-require.js +11 -0
  122. package/helpers/rethrow.d.ts +1 -0
  123. package/helpers/rethrow.js +7 -0
  124. package/helpers/router-method-factory.d.ts +23 -0
  125. package/helpers/router-method-factory.js +33 -0
  126. package/hooks/before-app-shutdown.hook.d.ts +9 -0
  127. package/hooks/before-app-shutdown.hook.js +51 -0
  128. package/hooks/index.d.ts +5 -0
  129. package/hooks/index.js +8 -0
  130. package/hooks/on-app-bootstrap.hook.d.ts +8 -0
  131. package/hooks/on-app-bootstrap.hook.js +53 -0
  132. package/hooks/on-app-shutdown.hook.d.ts +9 -0
  133. package/hooks/on-app-shutdown.hook.js +54 -0
  134. package/hooks/on-module-destroy.hook.d.ts +8 -0
  135. package/hooks/on-module-destroy.hook.js +53 -0
  136. package/hooks/on-module-init.hook.d.ts +8 -0
  137. package/hooks/on-module-init.hook.js +53 -0
  138. package/hooks/utils/get-instances-grouped-by-hierarchy-level.d.ts +3 -0
  139. package/hooks/utils/get-instances-grouped-by-hierarchy-level.js +27 -0
  140. package/hooks/utils/get-sorted-hierarchy-levels.d.ts +1 -0
  141. package/hooks/utils/get-sorted-hierarchy-levels.js +7 -0
  142. package/index.d.ts +17 -0
  143. package/index.js +32 -0
  144. package/injector/abstract-instance-resolver.d.ts +16 -0
  145. package/injector/abstract-instance-resolver.js +49 -0
  146. package/injector/compiler.d.ts +18 -0
  147. package/injector/compiler.js +35 -0
  148. package/injector/constants.d.ts +3 -0
  149. package/injector/constants.js +8 -0
  150. package/injector/container.d.ts +67 -0
  151. package/injector/container.js +233 -0
  152. package/injector/helpers/provider-classifier.d.ts +4 -0
  153. package/injector/helpers/provider-classifier.js +16 -0
  154. package/injector/helpers/silent-logger.d.ts +10 -0
  155. package/injector/helpers/silent-logger.js +18 -0
  156. package/injector/helpers/transient-instances.d.ts +12 -0
  157. package/injector/helpers/transient-instances.js +28 -0
  158. package/injector/index.d.ts +6 -0
  159. package/injector/index.js +8 -0
  160. package/injector/injector.d.ts +104 -0
  161. package/injector/injector.js +554 -0
  162. package/injector/inquirer/index.d.ts +1 -0
  163. package/injector/inquirer/index.js +4 -0
  164. package/injector/inquirer/inquirer-constants.d.ts +1 -0
  165. package/injector/inquirer/inquirer-constants.js +4 -0
  166. package/injector/inquirer/inquirer-providers.d.ts +2 -0
  167. package/injector/inquirer/inquirer-providers.js +11 -0
  168. package/injector/instance-links-host.d.ts +22 -0
  169. package/injector/instance-links-host.js +56 -0
  170. package/injector/instance-loader.d.ts +23 -0
  171. package/injector/instance-loader.js +88 -0
  172. package/injector/instance-wrapper.d.ts +99 -0
  173. package/injector/instance-wrapper.js +350 -0
  174. package/injector/internal-core-module/index.d.ts +1 -0
  175. package/injector/internal-core-module/index.js +4 -0
  176. package/injector/internal-core-module/internal-core-module-factory.d.ts +9 -0
  177. package/injector/internal-core-module/internal-core-module-factory.js +52 -0
  178. package/injector/internal-core-module/internal-core-module.d.ts +5 -0
  179. package/injector/internal-core-module/internal-core-module.js +40 -0
  180. package/injector/internal-providers-storage.d.ts +9 -0
  181. package/injector/internal-providers-storage.js +19 -0
  182. package/injector/lazy-module-loader/lazy-module-loader-options.interface.d.ts +6 -0
  183. package/injector/lazy-module-loader/lazy-module-loader-options.interface.js +2 -0
  184. package/injector/lazy-module-loader/lazy-module-loader.d.ts +20 -0
  185. package/injector/lazy-module-loader/lazy-module-loader.js +49 -0
  186. package/injector/module-ref.d.ts +106 -0
  187. package/injector/module-ref.js +66 -0
  188. package/injector/module.d.ts +82 -0
  189. package/injector/module.js +432 -0
  190. package/injector/modules-container.d.ts +27 -0
  191. package/injector/modules-container.js +42 -0
  192. package/injector/opaque-key-factory/by-reference-module-opaque-key-factory.d.ts +15 -0
  193. package/injector/opaque-key-factory/by-reference-module-opaque-key-factory.js +41 -0
  194. package/injector/opaque-key-factory/deep-hashed-module-opaque-key-factory.d.ts +15 -0
  195. package/injector/opaque-key-factory/deep-hashed-module-opaque-key-factory.js +83 -0
  196. package/injector/opaque-key-factory/interfaces/module-opaque-key-factory.interface.d.ts +18 -0
  197. package/injector/opaque-key-factory/interfaces/module-opaque-key-factory.interface.js +2 -0
  198. package/injector/settlement-signal.d.ts +37 -0
  199. package/injector/settlement-signal.js +55 -0
  200. package/injector/topology-tree/topology-tree.d.ts +8 -0
  201. package/injector/topology-tree/topology-tree.js +51 -0
  202. package/injector/topology-tree/tree-node.d.ts +14 -0
  203. package/injector/topology-tree/tree-node.js +54 -0
  204. package/inspector/deterministic-uuid-registry.d.ts +6 -0
  205. package/inspector/deterministic-uuid-registry.js +24 -0
  206. package/inspector/graph-inspector.d.ts +26 -0
  207. package/inspector/graph-inspector.js +166 -0
  208. package/inspector/index.d.ts +4 -0
  209. package/inspector/index.js +7 -0
  210. package/inspector/initialize-on-preview.allowlist.d.ts +6 -0
  211. package/inspector/initialize-on-preview.allowlist.js +13 -0
  212. package/inspector/interfaces/edge.interface.d.ts +28 -0
  213. package/inspector/interfaces/edge.interface.js +2 -0
  214. package/inspector/interfaces/enhancer-metadata-cache-entry.interface.d.ts +12 -0
  215. package/inspector/interfaces/enhancer-metadata-cache-entry.interface.js +2 -0
  216. package/inspector/interfaces/entrypoint.interface.d.ts +23 -0
  217. package/inspector/interfaces/entrypoint.interface.js +2 -0
  218. package/inspector/interfaces/extras.interface.d.ts +18 -0
  219. package/inspector/interfaces/extras.interface.js +2 -0
  220. package/inspector/interfaces/node.interface.d.ts +48 -0
  221. package/inspector/interfaces/node.interface.js +2 -0
  222. package/inspector/interfaces/serialized-graph-json.interface.d.ts +14 -0
  223. package/inspector/interfaces/serialized-graph-json.interface.js +2 -0
  224. package/inspector/interfaces/serialized-graph-metadata.interface.d.ts +10 -0
  225. package/inspector/interfaces/serialized-graph-metadata.interface.js +2 -0
  226. package/inspector/noop-graph-inspector.d.ts +2 -0
  227. package/inspector/noop-graph-inspector.js +8 -0
  228. package/inspector/partial-graph.host.d.ts +7 -0
  229. package/inspector/partial-graph.host.js +15 -0
  230. package/inspector/serialized-graph.d.ts +52 -0
  231. package/inspector/serialized-graph.js +124 -0
  232. package/inspector/uuid-factory.d.ts +9 -0
  233. package/inspector/uuid-factory.js +22 -0
  234. package/interceptors/index.d.ts +2 -0
  235. package/interceptors/index.js +5 -0
  236. package/interceptors/interceptors-consumer.d.ts +9 -0
  237. package/interceptors/interceptors-consumer.js +37 -0
  238. package/interceptors/interceptors-context-creator.d.ts +16 -0
  239. package/interceptors/interceptors-context-creator.js +69 -0
  240. package/interfaces/index.d.ts +2 -0
  241. package/interfaces/index.js +2 -0
  242. package/interfaces/module-definition.interface.d.ts +3 -0
  243. package/interfaces/module-definition.interface.js +2 -0
  244. package/interfaces/module-override.interface.d.ts +5 -0
  245. package/interfaces/module-override.interface.js +2 -0
  246. package/internal.d.ts +38 -0
  247. package/internal.js +46 -0
  248. package/metadata-scanner.d.ts +17 -0
  249. package/metadata-scanner.js +83 -0
  250. package/middleware/builder.d.ts +15 -0
  251. package/middleware/builder.js +91 -0
  252. package/middleware/container.d.ts +14 -0
  253. package/middleware/container.js +49 -0
  254. package/middleware/index.d.ts +1 -0
  255. package/middleware/index.js +4 -0
  256. package/middleware/middleware-module.d.ts +33 -0
  257. package/middleware/middleware-module.js +208 -0
  258. package/middleware/resolver.d.ts +10 -0
  259. package/middleware/resolver.js +18 -0
  260. package/middleware/route-info-path-extractor.d.ts +15 -0
  261. package/middleware/route-info-path-extractor.js +81 -0
  262. package/middleware/routes-mapper.d.ts +19 -0
  263. package/middleware/routes-mapper.js +117 -0
  264. package/middleware/utils.d.ts +8 -0
  265. package/middleware/utils.js +106 -0
  266. package/nest-application-context.d.ts +173 -0
  267. package/nest-application-context.js +327 -0
  268. package/nest-application.d.ts +64 -0
  269. package/nest-application.js +328 -0
  270. package/nest-factory.d.ts +83 -0
  271. package/nest-factory.js +232 -0
  272. package/package.json +73 -0
  273. package/pipes/index.d.ts +3 -0
  274. package/pipes/index.js +6 -0
  275. package/pipes/params-token-factory.d.ts +5 -0
  276. package/pipes/params-token-factory.js +19 -0
  277. package/pipes/pipes-consumer.d.ts +10 -0
  278. package/pipes/pipes-consumer.js +21 -0
  279. package/pipes/pipes-context-creator.d.ts +17 -0
  280. package/pipes/pipes-context-creator.js +72 -0
  281. package/repl/assign-to-object.util.d.ts +5 -0
  282. package/repl/assign-to-object.util.js +14 -0
  283. package/repl/constants.d.ts +1 -0
  284. package/repl/constants.js +4 -0
  285. package/repl/index.d.ts +1 -0
  286. package/repl/index.js +4 -0
  287. package/repl/native-functions/debug-repl-fn.d.ts +9 -0
  288. package/repl/native-functions/debug-repl-fn.js +46 -0
  289. package/repl/native-functions/get-repl-fn.d.ts +7 -0
  290. package/repl/native-functions/get-repl-fn.js +19 -0
  291. package/repl/native-functions/help-repl-fn.d.ts +7 -0
  292. package/repl/native-functions/help-repl-fn.js +29 -0
  293. package/repl/native-functions/index.d.ts +6 -0
  294. package/repl/native-functions/index.js +9 -0
  295. package/repl/native-functions/methods-repl-fn.d.ts +8 -0
  296. package/repl/native-functions/methods-repl-fn.js +28 -0
  297. package/repl/native-functions/resolve-repl-fn.d.ts +7 -0
  298. package/repl/native-functions/resolve-repl-fn.js +18 -0
  299. package/repl/native-functions/select-relp-fn.d.ts +7 -0
  300. package/repl/native-functions/select-relp-fn.js +18 -0
  301. package/repl/repl-context.d.ts +26 -0
  302. package/repl/repl-context.js +126 -0
  303. package/repl/repl-function.d.ts +18 -0
  304. package/repl/repl-function.js +19 -0
  305. package/repl/repl-logger.d.ts +5 -0
  306. package/repl/repl-logger.js +22 -0
  307. package/repl/repl-native-commands.d.ts +2 -0
  308. package/repl/repl-native-commands.js +46 -0
  309. package/repl/repl.d.ts +3 -0
  310. package/repl/repl.interfaces.d.ts +16 -0
  311. package/repl/repl.interfaces.js +2 -0
  312. package/repl/repl.js +32 -0
  313. package/router/index.d.ts +3 -0
  314. package/router/index.js +8 -0
  315. package/router/interfaces/exceptions-filter.interface.d.ts +6 -0
  316. package/router/interfaces/exceptions-filter.interface.js +2 -0
  317. package/router/interfaces/exclude-route-metadata.interface.d.ts +15 -0
  318. package/router/interfaces/exclude-route-metadata.interface.js +2 -0
  319. package/router/interfaces/index.d.ts +1 -0
  320. package/router/interfaces/index.js +4 -0
  321. package/router/interfaces/resolver.interface.d.ts +5 -0
  322. package/router/interfaces/resolver.interface.js +2 -0
  323. package/router/interfaces/route-params-factory.interface.d.ts +8 -0
  324. package/router/interfaces/route-params-factory.interface.js +2 -0
  325. package/router/interfaces/route-path-metadata.interface.d.ts +32 -0
  326. package/router/interfaces/route-path-metadata.interface.js +2 -0
  327. package/router/interfaces/routes.interface.d.ts +7 -0
  328. package/router/interfaces/routes.interface.js +2 -0
  329. package/router/legacy-route-converter.d.ts +16 -0
  330. package/router/legacy-route-converter.js +61 -0
  331. package/router/paths-explorer.d.ts +18 -0
  332. package/router/paths-explorer.js +45 -0
  333. package/router/request/index.d.ts +1 -0
  334. package/router/request/index.js +5 -0
  335. package/router/request/request-constants.d.ts +2 -0
  336. package/router/request/request-constants.js +5 -0
  337. package/router/request/request-providers.d.ts +2 -0
  338. package/router/request/request-providers.js +11 -0
  339. package/router/route-params-factory.d.ts +9 -0
  340. package/router/route-params-factory.js +41 -0
  341. package/router/route-path-factory.d.ts +14 -0
  342. package/router/route-path-factory.js +101 -0
  343. package/router/router-exception-filters.d.ts +14 -0
  344. package/router/router-exception-filters.js +40 -0
  345. package/router/router-execution-context.d.ts +54 -0
  346. package/router/router-execution-context.js +186 -0
  347. package/router/router-explorer.d.ts +47 -0
  348. package/router/router-explorer.js +234 -0
  349. package/router/router-module.d.ts +19 -0
  350. package/router/router-module.js +80 -0
  351. package/router/router-proxy.d.ts +6 -0
  352. package/router/router-proxy.js +31 -0
  353. package/router/router-response-controller.d.ts +28 -0
  354. package/router/router-response-controller.js +98 -0
  355. package/router/routes-resolver.d.ts +27 -0
  356. package/router/routes-resolver.js +129 -0
  357. package/router/sse-stream.d.ts +43 -0
  358. package/router/sse-stream.js +83 -0
  359. package/router/utils/exclude-route.util.d.ts +4 -0
  360. package/router/utils/exclude-route.util.js +19 -0
  361. package/router/utils/flatten-route-paths.util.d.ts +6 -0
  362. package/router/utils/flatten-route-paths.util.js +25 -0
  363. package/router/utils/index.d.ts +2 -0
  364. package/router/utils/index.js +5 -0
  365. package/scanner.d.ts +89 -0
  366. package/scanner.js +416 -0
  367. package/services/index.d.ts +1 -0
  368. package/services/index.js +4 -0
  369. package/services/reflector.service.d.ts +111 -0
  370. package/services/reflector.service.js +100 -0
  371. package/tsconfig.build.json +21 -0
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RouterExplorer = void 0;
4
+ const constants_1 = require("@nestjs/common/constants");
5
+ const enums_1 = require("@nestjs/common/enums");
6
+ const exceptions_1 = require("@nestjs/common/exceptions");
7
+ const logger_service_1 = require("@nestjs/common/services/logger.service");
8
+ const shared_utils_1 = require("@nestjs/common/utils/shared.utils");
9
+ const path_to_regexp_1 = require("path-to-regexp");
10
+ const unknown_request_mapping_exception_1 = require("../errors/exceptions/unknown-request-mapping.exception");
11
+ const guards_1 = require("../guards");
12
+ const context_id_factory_1 = require("../helpers/context-id-factory");
13
+ const execution_context_host_1 = require("../helpers/execution-context-host");
14
+ const messages_1 = require("../helpers/messages");
15
+ const router_method_factory_1 = require("../helpers/router-method-factory");
16
+ const constants_2 = require("../injector/constants");
17
+ const interceptors_1 = require("../interceptors");
18
+ const pipes_1 = require("../pipes");
19
+ const paths_explorer_1 = require("./paths-explorer");
20
+ const request_constants_1 = require("./request/request-constants");
21
+ const route_params_factory_1 = require("./route-params-factory");
22
+ const router_execution_context_1 = require("./router-execution-context");
23
+ class RouterExplorer {
24
+ constructor(metadataScanner, container, injector, routerProxy, exceptionsFilter, config, routePathFactory, graphInspector) {
25
+ this.container = container;
26
+ this.injector = injector;
27
+ this.routerProxy = routerProxy;
28
+ this.exceptionsFilter = exceptionsFilter;
29
+ this.routePathFactory = routePathFactory;
30
+ this.graphInspector = graphInspector;
31
+ this.routerMethodFactory = new router_method_factory_1.RouterMethodFactory();
32
+ this.logger = new logger_service_1.Logger(RouterExplorer.name, {
33
+ timestamp: true,
34
+ });
35
+ this.exceptionFiltersCache = new WeakMap();
36
+ this.pathsExplorer = new paths_explorer_1.PathsExplorer(metadataScanner);
37
+ const routeParamsFactory = new route_params_factory_1.RouteParamsFactory();
38
+ const pipesContextCreator = new pipes_1.PipesContextCreator(container, config);
39
+ const pipesConsumer = new pipes_1.PipesConsumer();
40
+ const guardsContextCreator = new guards_1.GuardsContextCreator(container, config);
41
+ const guardsConsumer = new guards_1.GuardsConsumer();
42
+ const interceptorsContextCreator = new interceptors_1.InterceptorsContextCreator(container, config);
43
+ const interceptorsConsumer = new interceptors_1.InterceptorsConsumer();
44
+ this.executionContextCreator = new router_execution_context_1.RouterExecutionContext(routeParamsFactory, pipesContextCreator, pipesConsumer, guardsContextCreator, guardsConsumer, interceptorsContextCreator, interceptorsConsumer, container.getHttpAdapterRef());
45
+ }
46
+ explore(instanceWrapper, moduleKey, httpAdapterRef, host, routePathMetadata) {
47
+ const { instance } = instanceWrapper;
48
+ const routerPaths = this.pathsExplorer.scanForPaths(instance);
49
+ this.applyPathsToRouterProxy(httpAdapterRef, routerPaths, instanceWrapper, moduleKey, routePathMetadata, host);
50
+ }
51
+ extractRouterPath(metatype) {
52
+ const path = Reflect.getMetadata(constants_1.PATH_METADATA, metatype);
53
+ if ((0, shared_utils_1.isUndefined)(path)) {
54
+ throw new unknown_request_mapping_exception_1.UnknownRequestMappingException(metatype);
55
+ }
56
+ if (Array.isArray(path)) {
57
+ return path.map(p => (0, shared_utils_1.addLeadingSlash)(p));
58
+ }
59
+ return [(0, shared_utils_1.addLeadingSlash)(path)];
60
+ }
61
+ applyPathsToRouterProxy(router, routeDefinitions, instanceWrapper, moduleKey, routePathMetadata, host) {
62
+ (routeDefinitions || []).forEach(routeDefinition => {
63
+ const { version: methodVersion } = routeDefinition;
64
+ routePathMetadata.methodVersion = methodVersion;
65
+ this.applyCallbackToRouter(router, routeDefinition, instanceWrapper, moduleKey, routePathMetadata, host);
66
+ });
67
+ }
68
+ applyCallbackToRouter(router, routeDefinition, instanceWrapper, moduleKey, routePathMetadata, host) {
69
+ const { path: paths, requestMethod, targetCallback, methodName, } = routeDefinition;
70
+ const { instance } = instanceWrapper;
71
+ const routerMethodRef = this.routerMethodFactory
72
+ .get(router, requestMethod)
73
+ .bind(router);
74
+ const isRequestScoped = !instanceWrapper.isDependencyTreeStatic();
75
+ const proxy = isRequestScoped
76
+ ? this.createRequestScopedHandler(instanceWrapper, requestMethod, this.container.getModuleByKey(moduleKey), moduleKey, methodName)
77
+ : this.createCallbackProxy(instance, targetCallback, methodName, moduleKey, requestMethod);
78
+ const isVersioned = (routePathMetadata.methodVersion ||
79
+ routePathMetadata.controllerVersion) &&
80
+ routePathMetadata.versioningOptions;
81
+ let routeHandler = this.applyHostFilter(host, proxy);
82
+ paths.forEach(path => {
83
+ if (isVersioned &&
84
+ routePathMetadata.versioningOptions.type !== enums_1.VersioningType.URI) {
85
+ // All versioning (except for URI Versioning) is done via the "Version Filter"
86
+ routeHandler = this.applyVersionFilter(router, routePathMetadata, routeHandler);
87
+ }
88
+ routePathMetadata.methodPath = path;
89
+ const pathsToRegister = this.routePathFactory.create(routePathMetadata, requestMethod);
90
+ pathsToRegister.forEach(path => {
91
+ const entrypointDefinition = {
92
+ type: 'http-endpoint',
93
+ methodName,
94
+ className: instanceWrapper.name,
95
+ classNodeId: instanceWrapper.id,
96
+ metadata: {
97
+ key: path,
98
+ path,
99
+ requestMethod: enums_1.RequestMethod[requestMethod],
100
+ methodVersion: routePathMetadata.methodVersion,
101
+ controllerVersion: routePathMetadata.controllerVersion,
102
+ },
103
+ };
104
+ this.copyMetadataToCallback(targetCallback, routeHandler);
105
+ const normalizedPath = router.normalizePath
106
+ ? router.normalizePath(path)
107
+ : path;
108
+ const httpAdapter = this.container.getHttpAdapterRef();
109
+ const onRouteTriggered = httpAdapter.getOnRouteTriggered?.();
110
+ if (onRouteTriggered) {
111
+ routerMethodRef(normalizedPath, (...args) => {
112
+ onRouteTriggered(requestMethod, path);
113
+ return routeHandler(...args);
114
+ });
115
+ }
116
+ else {
117
+ routerMethodRef(normalizedPath, routeHandler);
118
+ }
119
+ this.graphInspector.insertEntrypointDefinition(entrypointDefinition, instanceWrapper.id);
120
+ });
121
+ const pathsToLog = this.routePathFactory.create({
122
+ ...routePathMetadata,
123
+ versioningOptions: undefined,
124
+ }, requestMethod);
125
+ pathsToLog.forEach(path => {
126
+ if (isVersioned) {
127
+ const version = this.routePathFactory.getVersion(routePathMetadata);
128
+ this.logger.log((0, messages_1.VERSIONED_ROUTE_MAPPED_MESSAGE)(path, requestMethod, version));
129
+ }
130
+ else {
131
+ this.logger.log((0, messages_1.ROUTE_MAPPED_MESSAGE)(path, requestMethod));
132
+ }
133
+ });
134
+ });
135
+ }
136
+ applyHostFilter(host, handler) {
137
+ if (!host) {
138
+ return handler;
139
+ }
140
+ const httpAdapterRef = this.container.getHttpAdapterRef();
141
+ const hosts = Array.isArray(host) ? host : [host];
142
+ const hostRegExps = hosts.map((host) => {
143
+ if (typeof host === 'string') {
144
+ try {
145
+ return (0, path_to_regexp_1.pathToRegexp)(host);
146
+ }
147
+ catch (e) {
148
+ if (e instanceof TypeError) {
149
+ this.logger.error(`Unsupported host "${host}" syntax. In past releases, ?, *, and + were used to denote optional or repeating path parameters. The latest version of "path-to-regexp" now requires the use of named parameters. For example, instead of using a route like /users/* to capture all routes starting with "/users", you should use /users/*path. Please see the migration guide for more information.`);
150
+ }
151
+ throw e;
152
+ }
153
+ }
154
+ return { regexp: host, keys: [] };
155
+ });
156
+ const unsupportedFilteringErrorMessage = Array.isArray(host)
157
+ ? `HTTP adapter does not support filtering on hosts: ["${host.join('", "')}"]`
158
+ : `HTTP adapter does not support filtering on host: "${host}"`;
159
+ return (req, res, next) => {
160
+ req.hosts = {};
161
+ const hostname = httpAdapterRef.getRequestHostname(req) || '';
162
+ for (const exp of hostRegExps) {
163
+ const match = hostname.match(exp.regexp);
164
+ if (match) {
165
+ if (exp.keys.length > 0) {
166
+ exp.keys.forEach((key, i) => (req.hosts[key.name] = match[i + 1]));
167
+ }
168
+ else if (exp.regexp && match.groups) {
169
+ for (const groupName in match.groups) {
170
+ req.hosts[groupName] = match.groups[groupName];
171
+ }
172
+ }
173
+ return handler(req, res, next);
174
+ }
175
+ }
176
+ if (!next) {
177
+ throw new exceptions_1.InternalServerErrorException(unsupportedFilteringErrorMessage);
178
+ }
179
+ return next();
180
+ };
181
+ }
182
+ applyVersionFilter(router, routePathMetadata, handler) {
183
+ const version = this.routePathFactory.getVersion(routePathMetadata);
184
+ return router.applyVersionFilter(handler, version, routePathMetadata.versioningOptions);
185
+ }
186
+ createCallbackProxy(instance, callback, methodName, moduleRef, requestMethod, contextId = constants_2.STATIC_CONTEXT, inquirerId) {
187
+ const executionContext = this.executionContextCreator.create(instance, callback, methodName, moduleRef, requestMethod, contextId, inquirerId);
188
+ const exceptionFilter = this.exceptionsFilter.create(instance, callback, moduleRef, contextId, inquirerId);
189
+ return this.routerProxy.createProxy(executionContext, exceptionFilter);
190
+ }
191
+ createRequestScopedHandler(instanceWrapper, requestMethod, moduleRef, moduleKey, methodName) {
192
+ const { instance } = instanceWrapper;
193
+ const collection = moduleRef.controllers;
194
+ const isTreeDurable = instanceWrapper.isDependencyTreeDurable();
195
+ return async (req, res, next) => {
196
+ try {
197
+ const contextId = this.getContextId(req, isTreeDurable);
198
+ const contextInstance = await this.injector.loadPerContext(instance, moduleRef, collection, contextId);
199
+ await this.createCallbackProxy(contextInstance, contextInstance[methodName], methodName, moduleKey, requestMethod, contextId, instanceWrapper.id)(req, res, next);
200
+ }
201
+ catch (err) {
202
+ let exceptionFilter = this.exceptionFiltersCache.get(instance[methodName]);
203
+ if (!exceptionFilter) {
204
+ exceptionFilter = this.exceptionsFilter.create(instance, instance[methodName], moduleKey);
205
+ this.exceptionFiltersCache.set(instance[methodName], exceptionFilter);
206
+ }
207
+ const host = new execution_context_host_1.ExecutionContextHost([req, res, next]);
208
+ exceptionFilter.next(err, host);
209
+ }
210
+ };
211
+ }
212
+ getContextId(request, isTreeDurable) {
213
+ const contextId = context_id_factory_1.ContextIdFactory.getByRequest(request);
214
+ if (!request[request_constants_1.REQUEST_CONTEXT_ID]) {
215
+ Object.defineProperty(request, request_constants_1.REQUEST_CONTEXT_ID, {
216
+ value: contextId,
217
+ enumerable: false,
218
+ writable: false,
219
+ configurable: false,
220
+ });
221
+ const requestProviderValue = isTreeDurable
222
+ ? contextId.payload
223
+ : Object.assign(request, contextId.payload);
224
+ this.container.registerRequestProvider(requestProviderValue, contextId);
225
+ }
226
+ return contextId;
227
+ }
228
+ copyMetadataToCallback(originalCallback, targetCallback) {
229
+ for (const key of Reflect.getMetadataKeys(originalCallback)) {
230
+ Reflect.defineMetadata(key, Reflect.getMetadata(key, originalCallback), targetCallback);
231
+ }
232
+ }
233
+ }
234
+ exports.RouterExplorer = RouterExplorer;
@@ -0,0 +1,19 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ import { Module as ModuleClass } from '../injector/module';
3
+ import { ModulesContainer } from '../injector/modules-container';
4
+ import { Routes } from './interfaces';
5
+ export declare const ROUTES: unique symbol;
6
+ export declare const targetModulesByContainer: WeakMap<ModulesContainer, WeakSet<ModuleClass>>;
7
+ /**
8
+ * @publicApi
9
+ */
10
+ export declare class RouterModule {
11
+ private readonly modulesContainer;
12
+ private readonly routes;
13
+ constructor(modulesContainer: ModulesContainer, routes: Routes);
14
+ static register(routes: Routes): DynamicModule;
15
+ private deepCloneRoutes;
16
+ private initialize;
17
+ private registerModulePathMetadata;
18
+ private updateTargetModulesCache;
19
+ }
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var RouterModule_1;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.RouterModule = exports.targetModulesByContainer = exports.ROUTES = void 0;
5
+ const tslib_1 = require("tslib");
6
+ const common_1 = require("@nestjs/common");
7
+ const constants_1 = require("@nestjs/common/constants");
8
+ const shared_utils_1 = require("@nestjs/common/utils/shared.utils");
9
+ const modules_container_1 = require("../injector/modules-container");
10
+ const utils_1 = require("./utils");
11
+ exports.ROUTES = Symbol('ROUTES');
12
+ exports.targetModulesByContainer = new WeakMap();
13
+ /**
14
+ * @publicApi
15
+ */
16
+ let RouterModule = RouterModule_1 = class RouterModule {
17
+ constructor(modulesContainer, routes) {
18
+ this.modulesContainer = modulesContainer;
19
+ this.routes = routes;
20
+ this.routes = this.deepCloneRoutes(routes);
21
+ this.initialize();
22
+ }
23
+ static register(routes) {
24
+ return {
25
+ module: RouterModule_1,
26
+ providers: [
27
+ {
28
+ provide: exports.ROUTES,
29
+ useValue: routes,
30
+ },
31
+ ],
32
+ };
33
+ }
34
+ deepCloneRoutes(routes) {
35
+ return routes.map((routeOrType) => {
36
+ if (typeof routeOrType === 'function') {
37
+ return routeOrType;
38
+ }
39
+ if (routeOrType.children) {
40
+ return {
41
+ ...routeOrType,
42
+ children: this.deepCloneRoutes(routeOrType.children),
43
+ };
44
+ }
45
+ return { ...routeOrType };
46
+ });
47
+ }
48
+ initialize() {
49
+ const flattenedRoutes = (0, utils_1.flattenRoutePaths)(this.routes);
50
+ flattenedRoutes.forEach(route => {
51
+ const modulePath = (0, shared_utils_1.normalizePath)(route.path);
52
+ this.registerModulePathMetadata(route.module, modulePath);
53
+ this.updateTargetModulesCache(route.module);
54
+ });
55
+ }
56
+ registerModulePathMetadata(moduleCtor, modulePath) {
57
+ Reflect.defineMetadata(constants_1.MODULE_PATH + this.modulesContainer.applicationId, modulePath, moduleCtor);
58
+ }
59
+ updateTargetModulesCache(moduleCtor) {
60
+ let moduleClassSet;
61
+ if (exports.targetModulesByContainer.has(this.modulesContainer)) {
62
+ moduleClassSet = exports.targetModulesByContainer.get(this.modulesContainer);
63
+ }
64
+ else {
65
+ moduleClassSet = new WeakSet();
66
+ exports.targetModulesByContainer.set(this.modulesContainer, moduleClassSet);
67
+ }
68
+ const moduleRef = Array.from(this.modulesContainer.values()).find(item => item?.metatype === moduleCtor);
69
+ if (!moduleRef) {
70
+ return;
71
+ }
72
+ moduleClassSet.add(moduleRef);
73
+ }
74
+ };
75
+ exports.RouterModule = RouterModule;
76
+ exports.RouterModule = RouterModule = RouterModule_1 = tslib_1.__decorate([
77
+ (0, common_1.Module)({}),
78
+ tslib_1.__param(1, (0, common_1.Inject)(exports.ROUTES)),
79
+ tslib_1.__metadata("design:paramtypes", [modules_container_1.ModulesContainer, Array])
80
+ ], RouterModule);
@@ -0,0 +1,6 @@
1
+ import { ExceptionsHandler } from '../exceptions/exceptions-handler';
2
+ export type RouterProxyCallback = <TRequest, TResponse>(req: TRequest, res: TResponse, next: () => void) => void | Promise<void>;
3
+ export declare class RouterProxy {
4
+ createProxy(targetCallback: RouterProxyCallback, exceptionsHandler: ExceptionsHandler): <TRequest, TResponse>(req: TRequest, res: TResponse, next: () => void) => Promise<TResponse | undefined>;
5
+ createExceptionLayerProxy(targetCallback: <TError, TRequest, TResponse>(err: TError, req: TRequest, res: TResponse, next: () => void) => void | Promise<void>, exceptionsHandler: ExceptionsHandler): <TError, TRequest, TResponse>(err: TError, req: TRequest, res: TResponse, next: () => void) => Promise<TResponse | undefined>;
6
+ }
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RouterProxy = void 0;
4
+ const execution_context_host_1 = require("../helpers/execution-context-host");
5
+ class RouterProxy {
6
+ createProxy(targetCallback, exceptionsHandler) {
7
+ return async (req, res, next) => {
8
+ try {
9
+ await targetCallback(req, res, next);
10
+ }
11
+ catch (e) {
12
+ const host = new execution_context_host_1.ExecutionContextHost([req, res, next]);
13
+ exceptionsHandler.next(e, host);
14
+ return res;
15
+ }
16
+ };
17
+ }
18
+ createExceptionLayerProxy(targetCallback, exceptionsHandler) {
19
+ return async (err, req, res, next) => {
20
+ try {
21
+ await targetCallback(err, req, res, next);
22
+ }
23
+ catch (e) {
24
+ const host = new execution_context_host_1.ExecutionContextHost([req, res, next]);
25
+ exceptionsHandler.next(e, host);
26
+ return res;
27
+ }
28
+ };
29
+ }
30
+ }
31
+ exports.RouterProxy = RouterProxy;
@@ -0,0 +1,28 @@
1
+ import { HttpServer, RequestMethod } from '@nestjs/common';
2
+ import { IncomingMessage } from 'http';
3
+ import { Observable } from 'rxjs';
4
+ import { AdditionalHeaders, WritableHeaderStream } from './sse-stream';
5
+ export interface CustomHeader {
6
+ name: string;
7
+ value: string | (() => string);
8
+ }
9
+ export interface RedirectResponse {
10
+ url: string;
11
+ statusCode?: number;
12
+ }
13
+ export declare class RouterResponseController {
14
+ private readonly applicationRef;
15
+ private readonly logger;
16
+ constructor(applicationRef: HttpServer);
17
+ apply<TInput = any, TResponse = any>(result: TInput, response: TResponse, httpStatusCode?: number): Promise<any>;
18
+ redirect<TInput = any, TResponse = any>(resultOrDeferred: TInput, response: TResponse, redirectResponse: RedirectResponse): Promise<void>;
19
+ render<TInput = unknown, TResponse = unknown>(resultOrDeferred: TInput, response: TResponse, template: string): Promise<any>;
20
+ transformToResult(resultOrDeferred: any): Promise<any>;
21
+ getStatusByMethod(requestMethod: RequestMethod): number;
22
+ setHeaders<TResponse = unknown>(response: TResponse, headers: CustomHeader[]): void;
23
+ setStatus<TResponse = unknown>(response: TResponse, statusCode: number): void;
24
+ sse<TInput extends Observable<unknown> = any, TResponse extends WritableHeaderStream = any, TRequest extends IncomingMessage = any>(result: TInput | Promise<TInput>, response: TResponse, request: TRequest, options?: {
25
+ additionalHeaders: AdditionalHeaders;
26
+ }): Promise<void>;
27
+ private assertObservable;
28
+ }
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RouterResponseController = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const shared_utils_1 = require("@nestjs/common/utils/shared.utils");
6
+ const rxjs_1 = require("rxjs");
7
+ const operators_1 = require("rxjs/operators");
8
+ const sse_stream_1 = require("./sse-stream");
9
+ class RouterResponseController {
10
+ constructor(applicationRef) {
11
+ this.applicationRef = applicationRef;
12
+ this.logger = new common_1.Logger(RouterResponseController.name);
13
+ }
14
+ async apply(result, response, httpStatusCode) {
15
+ return this.applicationRef.reply(response, result, httpStatusCode);
16
+ }
17
+ async redirect(resultOrDeferred, response, redirectResponse) {
18
+ const result = await this.transformToResult(resultOrDeferred);
19
+ const statusCode = result && result.statusCode
20
+ ? result.statusCode
21
+ : redirectResponse.statusCode
22
+ ? redirectResponse.statusCode
23
+ : common_1.HttpStatus.FOUND;
24
+ const url = result && result.url ? result.url : redirectResponse.url;
25
+ this.applicationRef.redirect(response, statusCode, url);
26
+ }
27
+ async render(resultOrDeferred, response, template) {
28
+ const result = await this.transformToResult(resultOrDeferred);
29
+ return this.applicationRef.render(response, template, result);
30
+ }
31
+ async transformToResult(resultOrDeferred) {
32
+ if ((0, rxjs_1.isObservable)(resultOrDeferred)) {
33
+ return (0, rxjs_1.lastValueFrom)(resultOrDeferred);
34
+ }
35
+ return resultOrDeferred;
36
+ }
37
+ getStatusByMethod(requestMethod) {
38
+ switch (requestMethod) {
39
+ case common_1.RequestMethod.POST:
40
+ return common_1.HttpStatus.CREATED;
41
+ default:
42
+ return common_1.HttpStatus.OK;
43
+ }
44
+ }
45
+ setHeaders(response, headers) {
46
+ headers.forEach(({ name, value }) => this.applicationRef.setHeader(response, name, typeof value === 'function' ? value() : value));
47
+ }
48
+ setStatus(response, statusCode) {
49
+ this.applicationRef.status(response, statusCode);
50
+ }
51
+ async sse(result, response, request, options) {
52
+ // It's possible that we sent headers already so don't use a stream
53
+ if (response.writableEnded) {
54
+ return;
55
+ }
56
+ const observableResult = await Promise.resolve(result);
57
+ this.assertObservable(observableResult);
58
+ const stream = new sse_stream_1.SseStream(request);
59
+ // Extract custom status code from response if it was set
60
+ const customStatusCode = response.statusCode;
61
+ const pipeOptions = typeof customStatusCode !== 'undefined'
62
+ ? { ...options, statusCode: customStatusCode }
63
+ : options;
64
+ stream.pipe(response, pipeOptions);
65
+ const subscription = observableResult
66
+ .pipe((0, operators_1.map)((message) => {
67
+ if ((0, shared_utils_1.isObject)(message)) {
68
+ return message;
69
+ }
70
+ return { data: message };
71
+ }), (0, operators_1.concatMap)(message => new Promise(resolve => stream.writeMessage(message, () => resolve()))), (0, operators_1.catchError)(err => {
72
+ const data = err instanceof Error ? err.message : err;
73
+ stream.writeMessage({ type: 'error', data }, writeError => {
74
+ if (writeError) {
75
+ this.logger.error(writeError);
76
+ }
77
+ });
78
+ return rxjs_1.EMPTY;
79
+ }))
80
+ .subscribe({
81
+ complete: () => {
82
+ response.end();
83
+ },
84
+ });
85
+ request.on('close', () => {
86
+ subscription.unsubscribe();
87
+ if (!stream.writableEnded) {
88
+ stream.end();
89
+ }
90
+ });
91
+ }
92
+ assertObservable(value) {
93
+ if (!(0, rxjs_1.isObservable)(value)) {
94
+ throw new ReferenceError('You must return an Observable stream to use Server-Sent Events (SSE).');
95
+ }
96
+ }
97
+ }
98
+ exports.RouterResponseController = RouterResponseController;
@@ -0,0 +1,27 @@
1
+ import { Controller, HttpServer } from '@nestjs/common/interfaces';
2
+ import { ApplicationConfig } from '../application-config';
3
+ import { NestContainer } from '../injector/container';
4
+ import { Injector } from '../injector/injector';
5
+ import { InstanceWrapper } from '../injector/instance-wrapper';
6
+ import { GraphInspector } from '../inspector/graph-inspector';
7
+ import { Resolver } from './interfaces/resolver.interface';
8
+ export declare class RoutesResolver implements Resolver {
9
+ private readonly container;
10
+ private readonly applicationConfig;
11
+ private readonly injector;
12
+ private readonly logger;
13
+ private readonly routerProxy;
14
+ private readonly routePathFactory;
15
+ private readonly routerExceptionsFilter;
16
+ private readonly routerExplorer;
17
+ constructor(container: NestContainer, applicationConfig: ApplicationConfig, injector: Injector, graphInspector: GraphInspector);
18
+ resolve<T extends HttpServer>(applicationRef: T, globalPrefix: string): void;
19
+ registerRouters(routes: Map<string | symbol | Function, InstanceWrapper<Controller>>, moduleName: string, globalPrefix: string, modulePath: string, applicationRef: HttpServer): void;
20
+ registerNotFoundHandler(): void;
21
+ registerExceptionHandler(): void;
22
+ mapExternalException(err: any): any;
23
+ private isHttpFastifyError;
24
+ private getModulePathMetadata;
25
+ private getHostMetadata;
26
+ private getVersionMetadata;
27
+ }
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RoutesResolver = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const constants_1 = require("@nestjs/common/constants");
6
+ const logger_service_1 = require("@nestjs/common/services/logger.service");
7
+ const messages_1 = require("../helpers/messages");
8
+ const metadata_scanner_1 = require("../metadata-scanner");
9
+ const route_path_factory_1 = require("./route-path-factory");
10
+ const router_exception_filters_1 = require("./router-exception-filters");
11
+ const router_explorer_1 = require("./router-explorer");
12
+ const router_proxy_1 = require("./router-proxy");
13
+ class RoutesResolver {
14
+ constructor(container, applicationConfig, injector, graphInspector) {
15
+ this.container = container;
16
+ this.applicationConfig = applicationConfig;
17
+ this.injector = injector;
18
+ this.logger = new logger_service_1.Logger(RoutesResolver.name, {
19
+ timestamp: true,
20
+ });
21
+ this.routerProxy = new router_proxy_1.RouterProxy();
22
+ const httpAdapterRef = container.getHttpAdapterRef();
23
+ this.routerExceptionsFilter = new router_exception_filters_1.RouterExceptionFilters(container, applicationConfig, httpAdapterRef);
24
+ this.routePathFactory = new route_path_factory_1.RoutePathFactory(this.applicationConfig);
25
+ const metadataScanner = new metadata_scanner_1.MetadataScanner();
26
+ this.routerExplorer = new router_explorer_1.RouterExplorer(metadataScanner, this.container, this.injector, this.routerProxy, this.routerExceptionsFilter, this.applicationConfig, this.routePathFactory, graphInspector);
27
+ }
28
+ resolve(applicationRef, globalPrefix) {
29
+ const modules = this.container.getModules();
30
+ modules.forEach(({ controllers, metatype }, moduleName) => {
31
+ const modulePath = this.getModulePathMetadata(metatype);
32
+ this.registerRouters(controllers, moduleName, globalPrefix, modulePath, applicationRef);
33
+ });
34
+ }
35
+ registerRouters(routes, moduleName, globalPrefix, modulePath, applicationRef) {
36
+ routes.forEach(instanceWrapper => {
37
+ const { metatype } = instanceWrapper;
38
+ const host = this.getHostMetadata(metatype);
39
+ const routerPaths = this.routerExplorer.extractRouterPath(metatype);
40
+ const controllerVersion = this.getVersionMetadata(metatype);
41
+ const controllerName = metatype.name;
42
+ routerPaths.forEach(path => {
43
+ const pathsToLog = this.routePathFactory.create({
44
+ ctrlPath: path,
45
+ modulePath,
46
+ globalPrefix,
47
+ });
48
+ if (!controllerVersion) {
49
+ pathsToLog.forEach(path => {
50
+ const logMessage = (0, messages_1.CONTROLLER_MAPPING_MESSAGE)(controllerName, path);
51
+ this.logger.log(logMessage);
52
+ });
53
+ }
54
+ else {
55
+ pathsToLog.forEach(path => {
56
+ const logMessage = (0, messages_1.VERSIONED_CONTROLLER_MAPPING_MESSAGE)(controllerName, path, controllerVersion);
57
+ this.logger.log(logMessage);
58
+ });
59
+ }
60
+ const versioningOptions = this.applicationConfig.getVersioning();
61
+ const routePathMetadata = {
62
+ ctrlPath: path,
63
+ modulePath,
64
+ globalPrefix,
65
+ controllerVersion,
66
+ versioningOptions,
67
+ };
68
+ this.routerExplorer.explore(instanceWrapper, moduleName, applicationRef, host, routePathMetadata);
69
+ });
70
+ });
71
+ }
72
+ registerNotFoundHandler() {
73
+ const applicationRef = this.container.getHttpAdapterRef();
74
+ const callback = (req, res) => {
75
+ const method = applicationRef.getRequestMethod(req);
76
+ const url = applicationRef.getRequestUrl(req);
77
+ throw new common_1.NotFoundException(`Cannot ${method} ${url}`);
78
+ };
79
+ const handler = this.routerExceptionsFilter.create({}, callback, undefined);
80
+ const proxy = this.routerProxy.createProxy(callback, handler);
81
+ applicationRef.setNotFoundHandler &&
82
+ applicationRef.setNotFoundHandler(proxy, this.applicationConfig.getGlobalPrefix());
83
+ }
84
+ registerExceptionHandler() {
85
+ const callback = (err, req, res, next) => {
86
+ throw this.mapExternalException(err);
87
+ };
88
+ const handler = this.routerExceptionsFilter.create({}, callback, undefined);
89
+ const proxy = this.routerProxy.createExceptionLayerProxy(callback, handler);
90
+ const applicationRef = this.container.getHttpAdapterRef();
91
+ applicationRef.setErrorHandler &&
92
+ applicationRef.setErrorHandler(proxy, this.applicationConfig.getGlobalPrefix());
93
+ }
94
+ mapExternalException(err) {
95
+ switch (true) {
96
+ // SyntaxError is thrown by Express body-parser when given invalid JSON (#422, #430)
97
+ // URIError is thrown by Express when given a path parameter with an invalid percentage
98
+ // encoding, e.g. '%FF' (#8915)
99
+ case err instanceof SyntaxError || err instanceof URIError:
100
+ return new common_1.BadRequestException(err.message);
101
+ case this.isHttpFastifyError(err):
102
+ return new common_1.HttpException(err.message, err.statusCode);
103
+ default:
104
+ return err;
105
+ }
106
+ }
107
+ isHttpFastifyError(error) {
108
+ // condition based on this code - https://github.com/fastify/fastify-error/blob/d669b150a82968322f9f7be992b2f6b463272de3/index.js#L22
109
+ return (error.statusCode !== undefined &&
110
+ error instanceof Error &&
111
+ error.name === 'FastifyError');
112
+ }
113
+ getModulePathMetadata(metatype) {
114
+ const modulesContainer = this.container.getModules();
115
+ const modulePath = Reflect.getMetadata(constants_1.MODULE_PATH + modulesContainer.applicationId, metatype);
116
+ return modulePath ?? Reflect.getMetadata(constants_1.MODULE_PATH, metatype);
117
+ }
118
+ getHostMetadata(metatype) {
119
+ return Reflect.getMetadata(constants_1.HOST_METADATA, metatype);
120
+ }
121
+ getVersionMetadata(metatype) {
122
+ const versioningConfig = this.applicationConfig.getVersioning();
123
+ if (versioningConfig) {
124
+ return (Reflect.getMetadata(constants_1.VERSION_METADATA, metatype) ??
125
+ versioningConfig.defaultVersion);
126
+ }
127
+ }
128
+ }
129
+ exports.RoutesResolver = RoutesResolver;