@loopback/rest 4.0.0-alpha.8 → 5.0.1

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 (388) hide show
  1. package/CHANGELOG.md +1822 -0
  2. package/LICENSE +1 -1
  3. package/README.md +30 -58
  4. package/dist/body-parsers/body-parser.d.ts +25 -0
  5. package/dist/body-parsers/body-parser.helpers.d.ts +44 -0
  6. package/dist/body-parsers/body-parser.helpers.js +102 -0
  7. package/dist/body-parsers/body-parser.helpers.js.map +1 -0
  8. package/dist/body-parsers/body-parser.js +159 -0
  9. package/dist/body-parsers/body-parser.js.map +1 -0
  10. package/dist/body-parsers/body-parser.json.d.ts +9 -0
  11. package/dist/body-parsers/body-parser.json.js +43 -0
  12. package/dist/body-parsers/body-parser.json.js.map +1 -0
  13. package/dist/body-parsers/body-parser.raw.d.ts +12 -0
  14. package/dist/body-parsers/body-parser.raw.js +39 -0
  15. package/dist/body-parsers/body-parser.raw.js.map +1 -0
  16. package/dist/body-parsers/body-parser.stream.d.ts +12 -0
  17. package/dist/body-parsers/body-parser.stream.js +28 -0
  18. package/dist/body-parsers/body-parser.stream.js.map +1 -0
  19. package/dist/body-parsers/body-parser.text.d.ts +9 -0
  20. package/dist/body-parsers/body-parser.text.js +38 -0
  21. package/dist/body-parsers/body-parser.text.js.map +1 -0
  22. package/dist/body-parsers/body-parser.urlencoded.d.ts +9 -0
  23. package/dist/body-parsers/body-parser.urlencoded.js +36 -0
  24. package/dist/body-parsers/body-parser.urlencoded.js.map +1 -0
  25. package/dist/body-parsers/index.d.ts +8 -0
  26. package/dist/body-parsers/index.js +16 -0
  27. package/dist/body-parsers/index.js.map +1 -0
  28. package/dist/body-parsers/types.d.ts +51 -0
  29. package/dist/body-parsers/types.js +12 -0
  30. package/dist/body-parsers/types.js.map +1 -0
  31. package/dist/coercion/coerce-parameter.d.ts +9 -0
  32. package/dist/coercion/coerce-parameter.js +166 -0
  33. package/dist/coercion/coerce-parameter.js.map +1 -0
  34. package/dist/coercion/utils.d.ts +43 -0
  35. package/dist/coercion/utils.js +96 -0
  36. package/dist/coercion/utils.js.map +1 -0
  37. package/dist/coercion/validator.d.ts +49 -0
  38. package/dist/coercion/validator.js +85 -0
  39. package/dist/coercion/validator.js.map +1 -0
  40. package/dist/http-handler.d.ts +38 -0
  41. package/dist/http-handler.js +68 -0
  42. package/dist/http-handler.js.map +1 -0
  43. package/dist/index.d.ts +36 -1
  44. package/dist/index.js +40 -6
  45. package/dist/index.js.map +1 -0
  46. package/dist/keys.d.ts +198 -0
  47. package/dist/keys.js +202 -0
  48. package/dist/keys.js.map +1 -0
  49. package/dist/parse-json.d.ts +11 -0
  50. package/dist/parse-json.js +42 -0
  51. package/dist/parse-json.js.map +1 -0
  52. package/dist/parser.d.ts +11 -0
  53. package/dist/parser.js +76 -0
  54. package/dist/parser.js.map +1 -0
  55. package/{dist6/src/providers/find-route.d.ts → dist/providers/find-route.provider.d.ts} +3 -1
  56. package/dist/providers/find-route.provider.js +36 -0
  57. package/dist/providers/find-route.provider.js.map +1 -0
  58. package/dist/providers/index.d.ts +6 -0
  59. package/dist/providers/index.js +14 -0
  60. package/dist/providers/index.js.map +1 -0
  61. package/dist/{src/providers/invoke-method.d.ts → providers/invoke-method.provider.d.ts} +3 -1
  62. package/dist/providers/invoke-method.provider.js +30 -0
  63. package/dist/providers/invoke-method.provider.js.map +1 -0
  64. package/dist/providers/log-error.provider.d.ts +6 -0
  65. package/dist/providers/log-error.provider.js +21 -0
  66. package/dist/providers/log-error.provider.js.map +1 -0
  67. package/dist/providers/parse-params.provider.d.ts +15 -0
  68. package/dist/providers/parse-params.provider.js +41 -0
  69. package/dist/providers/parse-params.provider.js.map +1 -0
  70. package/dist/providers/reject.provider.d.ts +10 -0
  71. package/dist/providers/reject.provider.js +47 -0
  72. package/dist/providers/reject.provider.js.map +1 -0
  73. package/dist/{src/providers/send.d.ts → providers/send.provider.d.ts} +1 -4
  74. package/dist/{src/providers/send.js → providers/send.provider.js} +4 -6
  75. package/dist/providers/send.provider.js.map +1 -0
  76. package/dist/request-context.d.ts +36 -0
  77. package/dist/request-context.js +104 -0
  78. package/dist/request-context.js.map +1 -0
  79. package/dist/rest-http-error.d.ts +37 -0
  80. package/dist/rest-http-error.js +51 -0
  81. package/dist/rest-http-error.js.map +1 -0
  82. package/dist/rest.application.d.ts +232 -0
  83. package/dist/rest.application.js +174 -0
  84. package/dist/rest.application.js.map +1 -0
  85. package/dist/rest.component.d.ts +15 -0
  86. package/dist/rest.component.js +72 -0
  87. package/dist/rest.component.js.map +1 -0
  88. package/dist/rest.server.d.ts +443 -0
  89. package/dist/rest.server.js +748 -0
  90. package/dist/rest.server.js.map +1 -0
  91. package/dist/router/base-route.d.ts +29 -0
  92. package/dist/router/base-route.js +41 -0
  93. package/dist/router/base-route.js.map +1 -0
  94. package/dist/router/controller-route.d.ts +61 -0
  95. package/dist/router/controller-route.js +160 -0
  96. package/dist/router/controller-route.js.map +1 -0
  97. package/dist/router/external-express-routes.d.ts +24 -0
  98. package/dist/router/external-express-routes.js +90 -0
  99. package/dist/router/external-express-routes.js.map +1 -0
  100. package/dist/router/handler-route.d.ts +12 -0
  101. package/dist/router/handler-route.js +30 -0
  102. package/dist/router/handler-route.js.map +1 -0
  103. package/dist/router/index.d.ts +14 -0
  104. package/dist/router/index.js +25 -0
  105. package/dist/router/index.js.map +1 -0
  106. package/dist/router/openapi-path.d.ts +14 -0
  107. package/dist/router/openapi-path.js +64 -0
  108. package/dist/router/openapi-path.js.map +1 -0
  109. package/dist/router/redirect-route.d.ts +23 -0
  110. package/dist/router/redirect-route.js +50 -0
  111. package/dist/router/redirect-route.js.map +1 -0
  112. package/dist/router/regexp-router.d.ts +25 -0
  113. package/dist/router/regexp-router.js +84 -0
  114. package/dist/router/regexp-router.js.map +1 -0
  115. package/dist/router/rest-router.d.ts +35 -0
  116. package/dist/{src/internal-types.js → router/rest-router.js} +2 -2
  117. package/dist/router/rest-router.js.map +1 -0
  118. package/dist/router/route-entry.d.ts +46 -0
  119. package/dist/router/route-entry.js +20 -0
  120. package/dist/router/route-entry.js.map +1 -0
  121. package/dist/router/route-sort.d.ts +7 -0
  122. package/dist/router/route-sort.js +75 -0
  123. package/dist/router/route-sort.js.map +1 -0
  124. package/dist/router/router-base.d.ts +42 -0
  125. package/dist/router/router-base.js +101 -0
  126. package/dist/router/router-base.js.map +1 -0
  127. package/dist/router/router-spec.d.ts +3 -0
  128. package/dist/router/router-spec.js +40 -0
  129. package/dist/router/router-spec.js.map +1 -0
  130. package/dist/router/routing-table.d.ts +32 -0
  131. package/dist/router/routing-table.js +86 -0
  132. package/dist/router/routing-table.js.map +1 -0
  133. package/dist/router/trie-router.d.ts +13 -0
  134. package/dist/router/trie-router.js +55 -0
  135. package/dist/router/trie-router.js.map +1 -0
  136. package/dist/router/trie.d.ts +59 -0
  137. package/dist/router/trie.js +180 -0
  138. package/dist/router/trie.js.map +1 -0
  139. package/{dist6/src → dist}/sequence.d.ts +28 -23
  140. package/dist/sequence.js +112 -0
  141. package/dist/sequence.js.map +1 -0
  142. package/dist/spec-enhancers/consolidate.spec-enhancer.d.ts +68 -0
  143. package/dist/spec-enhancers/consolidate.spec-enhancer.js +145 -0
  144. package/dist/spec-enhancers/consolidate.spec-enhancer.js.map +1 -0
  145. package/dist/spec-enhancers/info.spec-enhancer.d.ts +19 -0
  146. package/dist/spec-enhancers/info.spec-enhancer.js +89 -0
  147. package/dist/spec-enhancers/info.spec-enhancer.js.map +1 -0
  148. package/dist/types.d.ts +178 -0
  149. package/dist/types.js +12 -0
  150. package/dist/types.js.map +1 -0
  151. package/dist/validation/ajv-factory.provider.d.ts +12 -0
  152. package/dist/validation/ajv-factory.provider.js +87 -0
  153. package/dist/validation/ajv-factory.provider.js.map +1 -0
  154. package/dist/validation/request-body.validator.d.ts +14 -0
  155. package/dist/validation/request-body.validator.js +161 -0
  156. package/dist/validation/request-body.validator.js.map +1 -0
  157. package/dist/writer.d.ts +9 -0
  158. package/dist/writer.js +62 -0
  159. package/dist/writer.js.map +1 -0
  160. package/package.json +66 -38
  161. package/src/body-parsers/body-parser.helpers.ts +148 -0
  162. package/src/body-parsers/body-parser.json.ts +46 -0
  163. package/src/body-parsers/body-parser.raw.ts +42 -0
  164. package/src/body-parsers/body-parser.stream.ts +27 -0
  165. package/src/body-parsers/body-parser.text.ts +44 -0
  166. package/src/body-parsers/body-parser.ts +208 -0
  167. package/src/body-parsers/body-parser.urlencoded.ts +42 -0
  168. package/src/body-parsers/index.ts +13 -0
  169. package/src/body-parsers/types.ts +60 -0
  170. package/src/coercion/coerce-parameter.ts +207 -0
  171. package/src/coercion/utils.ts +103 -0
  172. package/src/coercion/validator.ts +98 -0
  173. package/src/http-handler.ts +84 -41
  174. package/src/index.ts +37 -30
  175. package/src/keys.ts +273 -20
  176. package/src/parse-json.ts +42 -0
  177. package/src/parser.ts +89 -104
  178. package/src/providers/{find-route.ts → find-route.provider.ts} +10 -7
  179. package/src/providers/index.ts +7 -9
  180. package/src/providers/{invoke-method.ts → invoke-method.provider.ts} +8 -5
  181. package/src/providers/log-error.provider.ts +27 -0
  182. package/src/providers/parse-params.provider.ts +42 -0
  183. package/src/providers/reject.provider.ts +44 -0
  184. package/src/providers/{send.ts → send.provider.ts} +2 -5
  185. package/src/request-context.ts +123 -0
  186. package/src/rest-http-error.ts +87 -0
  187. package/src/rest.application.ts +390 -0
  188. package/src/rest.component.ts +111 -0
  189. package/src/rest.server.ts +1192 -0
  190. package/src/router/base-route.ts +53 -0
  191. package/src/router/controller-route.ts +241 -0
  192. package/src/router/external-express-routes.ts +139 -0
  193. package/src/router/handler-route.ts +44 -0
  194. package/src/router/index.ts +24 -0
  195. package/src/router/openapi-path.ts +67 -0
  196. package/src/router/redirect-route.ts +64 -0
  197. package/src/router/regexp-router.ts +104 -0
  198. package/src/router/rest-router.ts +48 -0
  199. package/src/router/route-entry.ts +74 -0
  200. package/src/router/route-sort.ts +74 -0
  201. package/src/router/router-base.ts +124 -0
  202. package/src/router/router-spec.ts +36 -0
  203. package/src/router/routing-table.ts +83 -279
  204. package/src/router/trie-router.ts +57 -0
  205. package/src/router/trie.ts +233 -0
  206. package/src/sequence.ts +44 -37
  207. package/src/spec-enhancers/consolidate.spec-enhancer.ts +182 -0
  208. package/src/spec-enhancers/info.spec-enhancer.ts +92 -0
  209. package/src/types.ts +216 -0
  210. package/src/validation/ajv-factory.provider.ts +94 -0
  211. package/src/validation/request-body.validator.ts +208 -0
  212. package/src/writer.ts +41 -68
  213. package/api-docs/.DS_Store +0 -0
  214. package/api-docs/apple-touch-icon-114x114-precomposed.png +0 -0
  215. package/api-docs/apple-touch-icon-144x144-precomposed.png +0 -0
  216. package/api-docs/apple-touch-icon-57x57-precomposed.png +0 -0
  217. package/api-docs/apple-touch-icon-72x72-precomposed.png +0 -0
  218. package/api-docs/apple-touch-icon-precomposed.png +0 -0
  219. package/api-docs/apple-touch-icon.png +0 -0
  220. package/api-docs/css/bootstrap.min.css +0 -9
  221. package/api-docs/css/code-themes/arta.css +0 -158
  222. package/api-docs/css/code-themes/ascetic.css +0 -50
  223. package/api-docs/css/code-themes/brown_paper.css +0 -104
  224. package/api-docs/css/code-themes/brown_papersq.png +0 -0
  225. package/api-docs/css/code-themes/dark.css +0 -103
  226. package/api-docs/css/code-themes/default.css +0 -135
  227. package/api-docs/css/code-themes/far.css +0 -111
  228. package/api-docs/css/code-themes/github.css +0 -127
  229. package/api-docs/css/code-themes/googlecode.css +0 -144
  230. package/api-docs/css/code-themes/idea.css +0 -121
  231. package/api-docs/css/code-themes/ir_black.css +0 -104
  232. package/api-docs/css/code-themes/magula.css +0 -121
  233. package/api-docs/css/code-themes/monokai.css +0 -114
  234. package/api-docs/css/code-themes/pojoaque.css +0 -104
  235. package/api-docs/css/code-themes/pojoaque.jpg +0 -0
  236. package/api-docs/css/code-themes/rainbow.css +0 -114
  237. package/api-docs/css/code-themes/school_book.css +0 -111
  238. package/api-docs/css/code-themes/school_book.png +0 -0
  239. package/api-docs/css/code-themes/sl-theme.css +0 -45
  240. package/api-docs/css/code-themes/solarized_dark.css +0 -88
  241. package/api-docs/css/code-themes/solarized_light.css +0 -88
  242. package/api-docs/css/code-themes/sunburst.css +0 -158
  243. package/api-docs/css/code-themes/tomorrow-night-blue.css +0 -52
  244. package/api-docs/css/code-themes/tomorrow-night-bright.css +0 -51
  245. package/api-docs/css/code-themes/tomorrow-night-eighties.css +0 -51
  246. package/api-docs/css/code-themes/tomorrow-night.css +0 -52
  247. package/api-docs/css/code-themes/tomorrow.css +0 -49
  248. package/api-docs/css/code-themes/vs.css +0 -86
  249. package/api-docs/css/code-themes/xcode.css +0 -154
  250. package/api-docs/css/code-themes/zenburn.css +0 -115
  251. package/api-docs/css/main.css +0 -139
  252. package/api-docs/favicon.ico +0 -0
  253. package/api-docs/fonts/0ihfXUL2emPh0ROJezvraLO3LdcAZYWl9Si6vvxL-qU.woff +0 -0
  254. package/api-docs/fonts/OsJ2DjdpjqFRVUSto6IffLO3LdcAZYWl9Si6vvxL-qU.woff +0 -0
  255. package/api-docs/fonts/_aijTyevf54tkVDLy-dlnLO3LdcAZYWl9Si6vvxL-qU.woff +0 -0
  256. package/api-docs/index.html +0 -7082
  257. package/api-docs/js/main.js +0 -19
  258. package/api-docs/js/vendor/bootstrap.min.js +0 -6
  259. package/api-docs/js/vendor/jquery-1.10.1.min.js +0 -6
  260. package/api-docs/js/vendor/jquery.scrollTo-1.4.3.1.js +0 -218
  261. package/api-docs/js/vendor/modernizr-2.6.2-respond-1.1.0.min.js +0 -11
  262. package/dist/src/http-handler.d.ts +0 -19
  263. package/dist/src/http-handler.js +0 -43
  264. package/dist/src/http-handler.js.map +0 -1
  265. package/dist/src/index.d.ts +0 -14
  266. package/dist/src/index.js +0 -33
  267. package/dist/src/index.js.map +0 -1
  268. package/dist/src/internal-types.d.ts +0 -67
  269. package/dist/src/internal-types.js.map +0 -1
  270. package/dist/src/keys.d.ts +0 -22
  271. package/dist/src/keys.js +0 -35
  272. package/dist/src/keys.js.map +0 -1
  273. package/dist/src/parser.d.ts +0 -11
  274. package/dist/src/parser.js +0 -98
  275. package/dist/src/parser.js.map +0 -1
  276. package/dist/src/providers/bind-element.d.ts +0 -7
  277. package/dist/src/providers/bind-element.js +0 -34
  278. package/dist/src/providers/bind-element.js.map +0 -1
  279. package/dist/src/providers/find-route.d.ts +0 -9
  280. package/dist/src/providers/find-route.js +0 -42
  281. package/dist/src/providers/find-route.js.map +0 -1
  282. package/dist/src/providers/get-from-context.d.ts +0 -7
  283. package/dist/src/providers/get-from-context.js +0 -34
  284. package/dist/src/providers/get-from-context.js.map +0 -1
  285. package/dist/src/providers/index.d.ts +0 -8
  286. package/dist/src/providers/index.js +0 -18
  287. package/dist/src/providers/index.js.map +0 -1
  288. package/dist/src/providers/invoke-method.js +0 -36
  289. package/dist/src/providers/invoke-method.js.map +0 -1
  290. package/dist/src/providers/log-error-provider.d.ts +0 -6
  291. package/dist/src/providers/log-error-provider.js +0 -17
  292. package/dist/src/providers/log-error-provider.js.map +0 -1
  293. package/dist/src/providers/parse-params.d.ts +0 -13
  294. package/dist/src/providers/parse-params.js +0 -22
  295. package/dist/src/providers/parse-params.js.map +0 -1
  296. package/dist/src/providers/reject.d.ts +0 -6
  297. package/dist/src/providers/reject.js +0 -40
  298. package/dist/src/providers/reject.js.map +0 -1
  299. package/dist/src/providers/send.js.map +0 -1
  300. package/dist/src/rest-component.d.ts +0 -12
  301. package/dist/src/rest-component.js +0 -50
  302. package/dist/src/rest-component.js.map +0 -1
  303. package/dist/src/rest-server.d.ts +0 -211
  304. package/dist/src/rest-server.js +0 -426
  305. package/dist/src/rest-server.js.map +0 -1
  306. package/dist/src/router/metadata.d.ts +0 -150
  307. package/dist/src/router/metadata.js +0 -410
  308. package/dist/src/router/metadata.js.map +0 -1
  309. package/dist/src/router/routing-table.d.ts +0 -68
  310. package/dist/src/router/routing-table.js +0 -204
  311. package/dist/src/router/routing-table.js.map +0 -1
  312. package/dist/src/sequence.d.ts +0 -81
  313. package/dist/src/sequence.js +0 -104
  314. package/dist/src/sequence.js.map +0 -1
  315. package/dist/src/writer.d.ts +0 -17
  316. package/dist/src/writer.js +0 -87
  317. package/dist/src/writer.js.map +0 -1
  318. package/dist6/index.d.ts +0 -1
  319. package/dist6/index.js +0 -12
  320. package/dist6/src/http-handler.d.ts +0 -19
  321. package/dist6/src/http-handler.js +0 -53
  322. package/dist6/src/http-handler.js.map +0 -1
  323. package/dist6/src/index.d.ts +0 -14
  324. package/dist6/src/index.js +0 -33
  325. package/dist6/src/index.js.map +0 -1
  326. package/dist6/src/internal-types.d.ts +0 -67
  327. package/dist6/src/internal-types.js +0 -7
  328. package/dist6/src/internal-types.js.map +0 -1
  329. package/dist6/src/keys.d.ts +0 -22
  330. package/dist6/src/keys.js +0 -35
  331. package/dist6/src/keys.js.map +0 -1
  332. package/dist6/src/parser.d.ts +0 -11
  333. package/dist6/src/parser.js +0 -108
  334. package/dist6/src/parser.js.map +0 -1
  335. package/dist6/src/providers/bind-element.d.ts +0 -7
  336. package/dist6/src/providers/bind-element.js +0 -34
  337. package/dist6/src/providers/bind-element.js.map +0 -1
  338. package/dist6/src/providers/find-route.js +0 -42
  339. package/dist6/src/providers/find-route.js.map +0 -1
  340. package/dist6/src/providers/get-from-context.d.ts +0 -7
  341. package/dist6/src/providers/get-from-context.js +0 -34
  342. package/dist6/src/providers/get-from-context.js.map +0 -1
  343. package/dist6/src/providers/index.d.ts +0 -8
  344. package/dist6/src/providers/index.js +0 -18
  345. package/dist6/src/providers/index.js.map +0 -1
  346. package/dist6/src/providers/invoke-method.d.ts +0 -7
  347. package/dist6/src/providers/invoke-method.js +0 -44
  348. package/dist6/src/providers/invoke-method.js.map +0 -1
  349. package/dist6/src/providers/log-error-provider.d.ts +0 -6
  350. package/dist6/src/providers/log-error-provider.js +0 -17
  351. package/dist6/src/providers/log-error-provider.js.map +0 -1
  352. package/dist6/src/providers/parse-params.d.ts +0 -13
  353. package/dist6/src/providers/parse-params.js +0 -22
  354. package/dist6/src/providers/parse-params.js.map +0 -1
  355. package/dist6/src/providers/reject.d.ts +0 -6
  356. package/dist6/src/providers/reject.js +0 -40
  357. package/dist6/src/providers/reject.js.map +0 -1
  358. package/dist6/src/providers/send.d.ts +0 -15
  359. package/dist6/src/providers/send.js +0 -24
  360. package/dist6/src/providers/send.js.map +0 -1
  361. package/dist6/src/rest-component.d.ts +0 -12
  362. package/dist6/src/rest-component.js +0 -50
  363. package/dist6/src/rest-component.js.map +0 -1
  364. package/dist6/src/rest-server.d.ts +0 -211
  365. package/dist6/src/rest-server.js +0 -444
  366. package/dist6/src/rest-server.js.map +0 -1
  367. package/dist6/src/router/metadata.d.ts +0 -150
  368. package/dist6/src/router/metadata.js +0 -410
  369. package/dist6/src/router/metadata.js.map +0 -1
  370. package/dist6/src/router/routing-table.d.ts +0 -68
  371. package/dist6/src/router/routing-table.js +0 -218
  372. package/dist6/src/router/routing-table.js.map +0 -1
  373. package/dist6/src/sequence.js +0 -114
  374. package/dist6/src/sequence.js.map +0 -1
  375. package/dist6/src/writer.d.ts +0 -17
  376. package/dist6/src/writer.js +0 -87
  377. package/dist6/src/writer.js.map +0 -1
  378. package/index.d.ts +0 -6
  379. package/index.js +0 -9
  380. package/src/internal-types.ts +0 -96
  381. package/src/providers/bind-element.ts +0 -15
  382. package/src/providers/get-from-context.ts +0 -16
  383. package/src/providers/log-error-provider.ts +0 -23
  384. package/src/providers/parse-params.ts +0 -20
  385. package/src/providers/reject.ts +0 -27
  386. package/src/rest-component.ts +0 -54
  387. package/src/rest-server.ts +0 -584
  388. package/src/router/metadata.ts +0 -517
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ // Copyright IBM Corp. 2017,2020. All Rights Reserved.
3
+ // Node module: @loopback/rest
4
+ // This file is licensed under the MIT License.
5
+ // License text available at https://opensource.org/licenses/MIT
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.RoutingTable = void 0;
8
+ const tslib_1 = require("tslib");
9
+ const debug_1 = tslib_1.__importDefault(require("debug"));
10
+ const http_errors_1 = tslib_1.__importDefault(require("http-errors"));
11
+ const controller_route_1 = require("./controller-route");
12
+ const openapi_path_1 = require("./openapi-path");
13
+ const trie_router_1 = require("./trie-router");
14
+ const debug = debug_1.default('loopback:rest:routing-table');
15
+ /**
16
+ * Routing table
17
+ */
18
+ class RoutingTable {
19
+ constructor(_router = new trie_router_1.TrieRouter(), _externalRoutes) {
20
+ this._router = _router;
21
+ this._externalRoutes = _externalRoutes;
22
+ }
23
+ /**
24
+ * Register a controller as the route
25
+ * @param spec
26
+ * @param controllerCtor
27
+ * @param controllerFactory
28
+ */
29
+ registerController(spec, controllerCtor, controllerFactory) {
30
+ const routes = controller_route_1.createRoutesForController(spec, controllerCtor, controllerFactory);
31
+ for (const route of routes) {
32
+ this.registerRoute(route);
33
+ }
34
+ }
35
+ /**
36
+ * Register a route
37
+ * @param route - A route entry
38
+ */
39
+ registerRoute(route) {
40
+ // TODO(bajtos) handle the case where opSpec.parameters contains $ref
41
+ // See https://github.com/strongloop/loopback-next/issues/435
42
+ /* istanbul ignore if */
43
+ if (debug.enabled) {
44
+ debug('Registering route %s %s -> %s(%s)', route.verb.toUpperCase(), route.path, route.describe(), describeOperationParameters(route.spec));
45
+ }
46
+ openapi_path_1.validateApiPath(route.path);
47
+ this._router.add(route);
48
+ }
49
+ describeApiPaths() {
50
+ const paths = {};
51
+ for (const route of this._router.list()) {
52
+ if (route.spec['x-visibility'] === 'undocumented')
53
+ continue;
54
+ if (!paths[route.path]) {
55
+ paths[route.path] = {};
56
+ }
57
+ paths[route.path][route.verb] = route.spec;
58
+ }
59
+ return paths;
60
+ }
61
+ /**
62
+ * Map a request to a route
63
+ * @param request
64
+ */
65
+ find(request) {
66
+ debug('Finding route for %s %s', request.method, request.path);
67
+ const found = this._router.find(request);
68
+ if (found) {
69
+ debug('Route matched: %j', found);
70
+ return found;
71
+ }
72
+ if (this._externalRoutes) {
73
+ debug('No API route found for %s %s, trying to find an external Express route', request.method, request.path);
74
+ return this._externalRoutes.find(request);
75
+ }
76
+ debug('No route found for %s %s', request.method, request.path);
77
+ throw new http_errors_1.default.NotFound(`Endpoint "${request.method} ${request.path}" not found.`);
78
+ }
79
+ }
80
+ exports.RoutingTable = RoutingTable;
81
+ function describeOperationParameters(opSpec) {
82
+ return (opSpec.parameters || [])
83
+ .map(p => (p === null || p === void 0 ? void 0 : p.name) || '')
84
+ .join(', ');
85
+ }
86
+ //# sourceMappingURL=routing-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-table.js","sourceRoot":"","sources":["../../src/router/routing-table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { RestRouterOptions } from './rest-router';
2
+ import { ResolvedRoute, RouteEntry } from './route-entry';
3
+ import { BaseRouter } from './router-base';
4
+ /**
5
+ * Router implementation based on trie
6
+ */
7
+ export declare class TrieRouter extends BaseRouter {
8
+ private trie;
9
+ constructor(options?: RestRouterOptions);
10
+ protected addRouteWithPathVars(route: RouteEntry): void;
11
+ protected findRouteWithPathVars(verb: string, path: string): ResolvedRoute | undefined;
12
+ protected listRoutesWithPathVars(): RouteEntry[];
13
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ // Copyright IBM Corp. 2018,2019. All Rights Reserved.
3
+ // Node module: @loopback/rest
4
+ // This file is licensed under the MIT License.
5
+ // License text available at https://opensource.org/licenses/MIT
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.TrieRouter = void 0;
8
+ const tslib_1 = require("tslib");
9
+ const context_1 = require("@loopback/context");
10
+ const util_1 = require("util");
11
+ const keys_1 = require("../keys");
12
+ const route_entry_1 = require("./route-entry");
13
+ const router_base_1 = require("./router-base");
14
+ const trie_1 = require("./trie");
15
+ const debug = require('debug')('loopback:rest:router:trie');
16
+ /**
17
+ * Router implementation based on trie
18
+ */
19
+ let TrieRouter = /** @class */ (() => {
20
+ let TrieRouter = class TrieRouter extends router_base_1.BaseRouter {
21
+ constructor(options) {
22
+ super(options);
23
+ this.trie = new trie_1.Trie();
24
+ }
25
+ addRouteWithPathVars(route) {
26
+ // Add the route to the trie
27
+ const key = this.getKeyForRoute(route);
28
+ this.trie.create(key, route);
29
+ }
30
+ findRouteWithPathVars(verb, path) {
31
+ var _a;
32
+ const key = this.getKey(verb, path);
33
+ const found = this.trie.match(key);
34
+ debug('Route matched: %j', found);
35
+ if (found) {
36
+ const route = found.node.value;
37
+ if (route) {
38
+ debug('Route found: %s', util_1.inspect(route, { depth: 5 }));
39
+ return route_entry_1.createResolvedRoute(route, (_a = found.params) !== null && _a !== void 0 ? _a : {});
40
+ }
41
+ }
42
+ return undefined;
43
+ }
44
+ listRoutesWithPathVars() {
45
+ return this.trie.list().map(n => n.value);
46
+ }
47
+ };
48
+ TrieRouter = tslib_1.__decorate([
49
+ tslib_1.__param(0, context_1.inject(keys_1.RestBindings.ROUTER_OPTIONS, { optional: true })),
50
+ tslib_1.__metadata("design:paramtypes", [Object])
51
+ ], TrieRouter);
52
+ return TrieRouter;
53
+ })();
54
+ exports.TrieRouter = TrieRouter;
55
+ //# sourceMappingURL=trie-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trie-router.js","sourceRoot":"","sources":["../../src/router/trie-router.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,8BAA8B;AAC9B,+CAA+C;AAC/C,gEAAgE;;;;AAEhE,+CAAyC;AACzC,+BAA6B;AAC7B,kCAAqC;AAErC,+CAA6E;AAC7E,+CAAyC;AACzC,iCAA4B;AAE5B,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,2BAA2B,CAAC,CAAC;AAE5D;;GAEG;AACH;IAAA,IAAa,UAAU,GAAvB,MAAa,UAAW,SAAQ,wBAAU;QAGxC,YAEE,OAA2B;YAE3B,KAAK,CAAC,OAAO,CAAC,CAAC;YANT,SAAI,GAAG,IAAI,WAAI,EAAc,CAAC;QAOtC,CAAC;QAES,oBAAoB,CAAC,KAAiB;YAC9C,4BAA4B;YAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;QAES,qBAAqB,CAC7B,IAAY,EACZ,IAAY;;YAEZ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAEpC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;YAElC,IAAI,KAAK,EAAE;gBACT,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAM,CAAC;gBAChC,IAAI,KAAK,EAAE;oBACT,KAAK,CAAC,iBAAiB,EAAE,cAAO,CAAC,KAAK,EAAE,EAAC,KAAK,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;oBACrD,OAAO,iCAAmB,CAAC,KAAK,QAAE,KAAK,CAAC,MAAM,mCAAI,EAAE,CAAC,CAAC;iBACvD;aACF;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QAES,sBAAsB;YAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;KACF,CAAA;IAtCY,UAAU;QAIlB,mBAAA,gBAAM,CAAC,mBAAY,CAAC,cAAc,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC,CAAA;;OAJ7C,UAAU,CAsCtB;IAAD,iBAAC;KAAA;AAtCY,gCAAU"}
@@ -0,0 +1,59 @@
1
+ import { PathParameterValues } from '../types';
2
+ /**
3
+ * A Node in the trie
4
+ */
5
+ export interface Node<T> {
6
+ /**
7
+ * Key of the node
8
+ */
9
+ key: string;
10
+ /**
11
+ * Value of the node
12
+ */
13
+ value?: T;
14
+ /**
15
+ * Children of the node
16
+ */
17
+ readonly children: {
18
+ [key: string]: Node<T>;
19
+ };
20
+ /**
21
+ * Regular expression for the template
22
+ */
23
+ regexp?: RegExp;
24
+ /**
25
+ * Names of the node if it contains named parameters
26
+ */
27
+ names?: string[];
28
+ }
29
+ export declare type NodeWithValue<T> = Node<T> & {
30
+ value: T;
31
+ };
32
+ export interface ResolvedNode<T> {
33
+ node: Node<T>;
34
+ params?: PathParameterValues;
35
+ }
36
+ /**
37
+ * An implementation of trie for routes. The key hierarchy is built with parts
38
+ * of the route path delimited by `/`
39
+ */
40
+ export declare class Trie<T> {
41
+ readonly root: Node<T>;
42
+ /**
43
+ * Create a node for a given path template
44
+ * @param pathTemplate - The path template,
45
+ * @param value - Value of the route
46
+ */
47
+ create(routeTemplate: string, value: T): Node<T>;
48
+ /**
49
+ * Match a route path against the trie
50
+ * @param path - The route path, such as `/customers/c01`
51
+ */
52
+ match(path: string): (ResolvedNode<T> & {
53
+ node: NodeWithValue<T>;
54
+ }) | undefined;
55
+ /**
56
+ * List all nodes with value of the trie
57
+ */
58
+ list(): NodeWithValue<T>[];
59
+ }
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ // Copyright IBM Corp. 2018,2019. All Rights Reserved.
3
+ // Node module: @loopback/rest
4
+ // This file is licensed under the MIT License.
5
+ // License text available at https://opensource.org/licenses/MIT
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.Trie = void 0;
8
+ const path_to_regexp_1 = require("path-to-regexp");
9
+ const openapi_path_1 = require("./openapi-path");
10
+ /**
11
+ * An implementation of trie for routes. The key hierarchy is built with parts
12
+ * of the route path delimited by `/`
13
+ */
14
+ class Trie {
15
+ constructor() {
16
+ this.root = { key: '', children: {} };
17
+ }
18
+ /**
19
+ * Create a node for a given path template
20
+ * @param pathTemplate - The path template,
21
+ * @param value - Value of the route
22
+ */
23
+ create(routeTemplate, value) {
24
+ const keys = routeTemplate.split('/').filter(Boolean);
25
+ return createNode(keys, 0, value, this.root);
26
+ }
27
+ /**
28
+ * Match a route path against the trie
29
+ * @param path - The route path, such as `/customers/c01`
30
+ */
31
+ match(path) {
32
+ const keys = path.split('/').filter(Boolean);
33
+ const params = {};
34
+ const resolved = search(keys, 0, params, this.root);
35
+ if (resolved == null || !isNodeWithValue(resolved.node))
36
+ return undefined;
37
+ return {
38
+ node: resolved.node,
39
+ params: resolved.params,
40
+ };
41
+ }
42
+ /**
43
+ * List all nodes with value of the trie
44
+ */
45
+ list() {
46
+ const nodes = [];
47
+ traverse(this.root, node => {
48
+ nodes.push(node);
49
+ });
50
+ return nodes;
51
+ }
52
+ }
53
+ exports.Trie = Trie;
54
+ function isNodeWithValue(node) {
55
+ return node.value != null;
56
+ }
57
+ /**
58
+ * Use depth-first preorder traversal to list all nodes with values
59
+ * @param root - Root node
60
+ * @param visitor - A function to process nodes with values
61
+ */
62
+ function traverse(root, visitor) {
63
+ if (isNodeWithValue(root))
64
+ visitor(root);
65
+ for (const k in root.children) {
66
+ traverse(root.children[k], visitor);
67
+ }
68
+ }
69
+ /**
70
+ * Match the given key to one or more children of the parent node
71
+ * @param key - Key
72
+ * @param parent - Parent node
73
+ */
74
+ function matchChildren(key, parent) {
75
+ const resolvedNodes = [];
76
+ // Match key literal first
77
+ let child = parent.children[key];
78
+ if (child) {
79
+ resolvedNodes.push({
80
+ node: child,
81
+ });
82
+ return resolvedNodes;
83
+ }
84
+ // Match templates
85
+ for (const k in parent.children) {
86
+ child = parent.children[k];
87
+ if (!child.names || !child.regexp)
88
+ continue;
89
+ const match = child.regexp.exec(key);
90
+ if (match) {
91
+ const resolved = { params: {}, node: child };
92
+ let i = 0;
93
+ for (const n of child.names) {
94
+ const val = match[++i];
95
+ resolved.params[n] = decodeURIComponent(val);
96
+ }
97
+ resolvedNodes.push(resolved);
98
+ }
99
+ }
100
+ return resolvedNodes;
101
+ }
102
+ /**
103
+ * Search a sub list of keys against the parent node
104
+ * @param keys - An array of keys
105
+ * @param index - Starting index of the key list
106
+ * @param params - An object to receive resolved parameter values
107
+ * @param parent - Parent node
108
+ */
109
+ function search(keys, index,
110
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
111
+ params, parent) {
112
+ const key = keys[index];
113
+ const resolved = { node: parent, params };
114
+ if (key === undefined)
115
+ return resolved;
116
+ const children = matchChildren(key, parent);
117
+ if (children.length === 0)
118
+ return undefined;
119
+ // There might be multiple matches, such as `/users/{id}` and `/users/{userId}`
120
+ for (const child of children) {
121
+ const result = search(keys, index + 1, params, child.node);
122
+ if (result && isNodeWithValue(result.node)) {
123
+ Object.assign(params, child.params);
124
+ return result;
125
+ }
126
+ }
127
+ // no matches found
128
+ return undefined;
129
+ }
130
+ /**
131
+ * Create a node for a sub list of keys against the parent node
132
+ * @param keys - An array of keys
133
+ * @param index - Starting index of the key list
134
+ * @param value - Value of the node
135
+ * @param parent - Parent node
136
+ */
137
+ function createNode(keys, index, value, parent) {
138
+ const key = keys[index];
139
+ if (key === undefined)
140
+ return parent;
141
+ const isLast = keys.length - 1 === index;
142
+ let child = parent.children[key];
143
+ if (child != null) {
144
+ // Found an existing node
145
+ if (isLast) {
146
+ if (child.value == null) {
147
+ child.value = value;
148
+ }
149
+ else {
150
+ if (child.value !== value) {
151
+ throw new Error('Duplicate key found with different value: ' + keys.join('/'));
152
+ }
153
+ }
154
+ }
155
+ return createNode(keys, index + 1, value, child);
156
+ }
157
+ /**
158
+ * Build a new node
159
+ */
160
+ child = {
161
+ children: {},
162
+ key: key,
163
+ };
164
+ if (isLast) {
165
+ child.value = value;
166
+ }
167
+ // Check if the key has variables such as `{var}`
168
+ const path = openapi_path_1.toExpressPath(key);
169
+ const params = [];
170
+ const re = path_to_regexp_1.pathToRegexp(path, params);
171
+ if (params.length) {
172
+ child.names = params.map(p => `${p.name}`);
173
+ child.regexp = re;
174
+ }
175
+ // Add the node to the parent
176
+ parent.children[key] = child;
177
+ // Create nodes for rest of the keys
178
+ return createNode(keys, index + 1, value, child);
179
+ }
180
+ //# sourceMappingURL=trie.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trie.js","sourceRoot":"","sources":["../../src/router/trie.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,12 @@
1
- /// <reference types="node" />
2
- import { ServerResponse } from 'http';
3
- import { Context } from '@loopback/context';
4
- import { FindRoute, InvokeMethod, ParsedRequest, Send, Reject, ParseParams } from './internal-types';
1
+ import { ValueOrPromise } from '@loopback/context';
2
+ import { InvokeMiddleware } from '@loopback/express';
3
+ import { RequestContext } from './request-context';
4
+ import { FindRoute, InvokeMethod, ParseParams, Reject, Send } from './types';
5
5
  /**
6
6
  * A sequence function is a function implementing a custom
7
7
  * sequence of actions to handle an incoming request.
8
8
  */
9
- export declare type SequenceFunction = (sequence: DefaultSequence, request: ParsedRequest, response: ServerResponse) => Promise<void> | void;
9
+ export declare type SequenceFunction = (context: RequestContext, sequence: DefaultSequence) => ValueOrPromise<void>;
10
10
  /**
11
11
  * A sequence handler is a class implementing sequence of actions
12
12
  * required to handle an incoming request.
@@ -15,14 +15,15 @@ export interface SequenceHandler {
15
15
  /**
16
16
  * Handle the request by running the configured sequence of actions.
17
17
  *
18
- * @param request The incoming HTTP request
19
- * @param response The HTTP server response where to write the result
18
+ * @param context - The request context: HTTP request and response objects,
19
+ * per-request IoC container and more.
20
20
  */
21
- handle(request: ParsedRequest, response: ServerResponse): Promise<void>;
21
+ handle(context: RequestContext): Promise<void>;
22
22
  }
23
23
  /**
24
24
  * The default implementation of SequenceHandler.
25
25
  *
26
+ * @remarks
26
27
  * This class implements default Sequence for the LoopBack framework.
27
28
  * Default sequence is used if user hasn't defined their own Sequence
28
29
  * for their application.
@@ -31,41 +32,45 @@ export interface SequenceHandler {
31
32
  * when the API request comes in. User defines APIs in their Application
32
33
  * Controller class.
33
34
  *
35
+ * @example
34
36
  * User can bind their own Sequence to app as shown below
35
37
  * ```ts
36
38
  * app.bind(CoreBindings.SEQUENCE).toClass(MySequence);
37
39
  * ```
38
40
  */
39
41
  export declare class DefaultSequence implements SequenceHandler {
40
- ctx: Context;
41
42
  protected findRoute: FindRoute;
42
43
  protected parseParams: ParseParams;
43
44
  protected invoke: InvokeMethod;
44
45
  send: Send;
45
46
  reject: Reject;
47
+ /**
48
+ * Optional invoker for registered middleware in a chain.
49
+ * To be injected via SequenceActions.INVOKE_MIDDLEWARE.
50
+ */
51
+ protected invokeMiddleware: InvokeMiddleware;
46
52
  /**
47
53
  * Constructor: Injects findRoute, invokeMethod & logError
48
54
  * methods as promises.
49
55
  *
50
- * @param {Context} ctx The context for the sequence (injected via
51
- * RestBindings.Http.CONTEXT).
52
- * @param {FindRoute} findRoute Finds the appropriate controller method,
56
+ * @param findRoute - Finds the appropriate controller method,
53
57
  * spec and args for invocation (injected via SequenceActions.FIND_ROUTE).
54
- * @param {ParseParams} parseParams The parameter parsing function (injected
58
+ * @param parseParams - The parameter parsing function (injected
55
59
  * via SequenceActions.PARSE_PARAMS).
56
- * @param {InvokeMethod} invoke Invokes the method specified by the route
60
+ * @param invoke - Invokes the method specified by the route
57
61
  * (injected via SequenceActions.INVOKE_METHOD).
58
- * @param {Send} send The action to merge the invoke result with the response
62
+ * @param send - The action to merge the invoke result with the response
59
63
  * (injected via SequenceActions.SEND)
60
- * @param {Reject} reject The action to take if the invoke returns a rejected
64
+ * @param reject - The action to take if the invoke returns a rejected
61
65
  * promise result (injected via SequenceActions.REJECT).
62
66
  */
63
- constructor(ctx: Context, findRoute: FindRoute, parseParams: ParseParams, invoke: InvokeMethod, send: Send, reject: Reject);
67
+ constructor(findRoute: FindRoute, parseParams: ParseParams, invoke: InvokeMethod, send: Send, reject: Reject);
64
68
  /**
65
- * Runs the default sequence. Given a request and response, running the
66
- * sequence will produce a response or an error.
69
+ * Runs the default sequence. Given a handler context (request and response),
70
+ * running the sequence will produce a response or an error.
67
71
  *
68
72
  * Default sequence executes these steps
73
+ * - Executes middleware for CORS, OpenAPI spec endpoints
69
74
  * - Finds the appropriate controller method, swagger spec
70
75
  * and args for invocation
71
76
  * - Parses HTTP request to get API argument list
@@ -73,9 +78,9 @@ export declare class DefaultSequence implements SequenceHandler {
73
78
  * - Writes the result from API into the HTTP response
74
79
  * - Error is caught and logged using 'logError' if any of the above steps
75
80
  * in the sequence fails with an error.
76
- * @param req Parsed incoming HTTP request
77
- * @param res HTTP server response with result from Application controller
78
- * method invocation
81
+ *
82
+ * @param context - The request context: HTTP request and response objects,
83
+ * per-request IoC container and more.
79
84
  */
80
- handle(req: ParsedRequest, res: ServerResponse): Promise<void>;
85
+ handle(context: RequestContext): Promise<void>;
81
86
  }
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ // Copyright IBM Corp. 2017,2020. All Rights Reserved.
3
+ // Node module: @loopback/rest
4
+ // This file is licensed under the MIT License.
5
+ // License text available at https://opensource.org/licenses/MIT
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.DefaultSequence = void 0;
8
+ const tslib_1 = require("tslib");
9
+ const debug = require('debug')('loopback:rest:sequence');
10
+ const context_1 = require("@loopback/context");
11
+ const keys_1 = require("./keys");
12
+ const SequenceActions = keys_1.RestBindings.SequenceActions;
13
+ /**
14
+ * The default implementation of SequenceHandler.
15
+ *
16
+ * @remarks
17
+ * This class implements default Sequence for the LoopBack framework.
18
+ * Default sequence is used if user hasn't defined their own Sequence
19
+ * for their application.
20
+ *
21
+ * Sequence constructor() and run() methods are invoked from [[http-handler]]
22
+ * when the API request comes in. User defines APIs in their Application
23
+ * Controller class.
24
+ *
25
+ * @example
26
+ * User can bind their own Sequence to app as shown below
27
+ * ```ts
28
+ * app.bind(CoreBindings.SEQUENCE).toClass(MySequence);
29
+ * ```
30
+ */
31
+ let DefaultSequence = /** @class */ (() => {
32
+ let DefaultSequence = class DefaultSequence {
33
+ /**
34
+ * Constructor: Injects findRoute, invokeMethod & logError
35
+ * methods as promises.
36
+ *
37
+ * @param findRoute - Finds the appropriate controller method,
38
+ * spec and args for invocation (injected via SequenceActions.FIND_ROUTE).
39
+ * @param parseParams - The parameter parsing function (injected
40
+ * via SequenceActions.PARSE_PARAMS).
41
+ * @param invoke - Invokes the method specified by the route
42
+ * (injected via SequenceActions.INVOKE_METHOD).
43
+ * @param send - The action to merge the invoke result with the response
44
+ * (injected via SequenceActions.SEND)
45
+ * @param reject - The action to take if the invoke returns a rejected
46
+ * promise result (injected via SequenceActions.REJECT).
47
+ */
48
+ constructor(findRoute, parseParams, invoke, send, reject) {
49
+ this.findRoute = findRoute;
50
+ this.parseParams = parseParams;
51
+ this.invoke = invoke;
52
+ this.send = send;
53
+ this.reject = reject;
54
+ /**
55
+ * Optional invoker for registered middleware in a chain.
56
+ * To be injected via SequenceActions.INVOKE_MIDDLEWARE.
57
+ */
58
+ this.invokeMiddleware = () => false;
59
+ }
60
+ /**
61
+ * Runs the default sequence. Given a handler context (request and response),
62
+ * running the sequence will produce a response or an error.
63
+ *
64
+ * Default sequence executes these steps
65
+ * - Executes middleware for CORS, OpenAPI spec endpoints
66
+ * - Finds the appropriate controller method, swagger spec
67
+ * and args for invocation
68
+ * - Parses HTTP request to get API argument list
69
+ * - Invokes the API which is defined in the Application Controller
70
+ * - Writes the result from API into the HTTP response
71
+ * - Error is caught and logged using 'logError' if any of the above steps
72
+ * in the sequence fails with an error.
73
+ *
74
+ * @param context - The request context: HTTP request and response objects,
75
+ * per-request IoC container and more.
76
+ */
77
+ async handle(context) {
78
+ try {
79
+ const { request, response } = context;
80
+ // Invoke registered Express middleware
81
+ const finished = await this.invokeMiddleware(context);
82
+ if (finished) {
83
+ // The response been produced by the middleware chain
84
+ return;
85
+ }
86
+ const route = this.findRoute(request);
87
+ const args = await this.parseParams(request, route);
88
+ const result = await this.invoke(route, args);
89
+ debug('%s result -', route.describe(), result);
90
+ this.send(response, result);
91
+ }
92
+ catch (error) {
93
+ this.reject(context, error);
94
+ }
95
+ }
96
+ };
97
+ tslib_1.__decorate([
98
+ context_1.inject(SequenceActions.INVOKE_MIDDLEWARE, { optional: true }),
99
+ tslib_1.__metadata("design:type", Function)
100
+ ], DefaultSequence.prototype, "invokeMiddleware", void 0);
101
+ DefaultSequence = tslib_1.__decorate([
102
+ tslib_1.__param(0, context_1.inject(SequenceActions.FIND_ROUTE)),
103
+ tslib_1.__param(1, context_1.inject(SequenceActions.PARSE_PARAMS)),
104
+ tslib_1.__param(2, context_1.inject(SequenceActions.INVOKE_METHOD)),
105
+ tslib_1.__param(3, context_1.inject(SequenceActions.SEND)),
106
+ tslib_1.__param(4, context_1.inject(SequenceActions.REJECT)),
107
+ tslib_1.__metadata("design:paramtypes", [Function, Function, Function, Function, Function])
108
+ ], DefaultSequence);
109
+ return DefaultSequence;
110
+ })();
111
+ exports.DefaultSequence = DefaultSequence;
112
+ //# sourceMappingURL=sequence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequence.js","sourceRoot":"","sources":["../src/sequence.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,8BAA8B;AAC9B,+CAA+C;AAC/C,gEAAgE;;;;AAEhE,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,wBAAwB,CAAC,CAAC;AACzD,+CAAyD;AAEzD,iCAAoC;AAIpC,MAAM,eAAe,GAAG,mBAAY,CAAC,eAAe,CAAC;AAyBrD;;;;;;;;;;;;;;;;;GAiBG;AACH;IAAA,IAAa,eAAe,GAA5B,MAAa,eAAe;QAQ1B;;;;;;;;;;;;;;WAcG;QACH,YACgD,SAAoB,EAClB,WAAwB,EACvB,MAAoB,EAChC,IAAU,EACR,MAAc;YAJP,cAAS,GAAT,SAAS,CAAW;YAClB,gBAAW,GAAX,WAAW,CAAa;YACvB,WAAM,GAAN,MAAM,CAAc;YAChC,SAAI,GAAJ,IAAI,CAAM;YACR,WAAM,GAAN,MAAM,CAAQ;YA3BvD;;;eAGG;YAEO,qBAAgB,GAAqB,GAAG,EAAE,CAAC,KAAK,CAAC;QAuBxD,CAAC;QAEJ;;;;;;;;;;;;;;;;WAgBG;QACH,KAAK,CAAC,MAAM,CAAC,OAAuB;YAClC,IAAI;gBACF,MAAM,EAAC,OAAO,EAAE,QAAQ,EAAC,GAAG,OAAO,CAAC;gBACpC,uCAAuC;gBACvC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBACtD,IAAI,QAAQ,EAAE;oBACZ,qDAAqD;oBACrD,OAAO;iBACR;gBACD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBACtC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBAE9C,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;gBAC/C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;aAC7B;YAAC,OAAO,KAAK,EAAE;gBACd,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;aAC7B;QACH,CAAC;KACF,CAAA;IA7DC;QADC,gBAAM,CAAC,eAAe,CAAC,iBAAiB,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;;6DACD;IANhD,eAAe;QAwBvB,mBAAA,gBAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAA;QAClC,mBAAA,gBAAM,CAAC,eAAe,CAAC,YAAY,CAAC,CAAA;QACpC,mBAAA,gBAAM,CAAC,eAAe,CAAC,aAAa,CAAC,CAAA;QACrC,mBAAA,gBAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QAC5B,mBAAA,gBAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;;OA5BtB,eAAe,CAmE3B;IAAD,sBAAC;KAAA;AAnEY,0CAAe"}