@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,390 @@
1
+ // Copyright IBM Corp. 2018,2019. All Rights Reserved.
2
+ // Node module: @loopback/rest
3
+ // This file is licensed under the MIT License.
4
+ // License text available at https://opensource.org/licenses/MIT
5
+
6
+ import {
7
+ Binding,
8
+ BindingAddress,
9
+ Constructor,
10
+ Context,
11
+ Provider,
12
+ } from '@loopback/context';
13
+ import {Application, ApplicationConfig, Server} from '@loopback/core';
14
+ import {
15
+ ExpressMiddlewareFactory,
16
+ ExpressRequestHandler,
17
+ Middleware,
18
+ MiddlewareBindingOptions,
19
+ } from '@loopback/express';
20
+ import {OpenApiSpec, OperationObject} from '@loopback/openapi-v3';
21
+ import {PathParams} from 'express-serve-static-core';
22
+ import {ServeStaticOptions} from 'serve-static';
23
+ import {format} from 'util';
24
+ import {BodyParser} from './body-parsers';
25
+ import {RestBindings} from './keys';
26
+ import {RestComponent} from './rest.component';
27
+ import {HttpRequestListener, HttpServerLike, RestServer} from './rest.server';
28
+ import {ControllerClass, ControllerFactory, RouteEntry} from './router';
29
+ import {RouterSpec} from './router/router-spec';
30
+ import {SequenceFunction, SequenceHandler} from './sequence';
31
+
32
+ export const ERR_NO_MULTI_SERVER = format(
33
+ 'RestApplication does not support multiple servers!',
34
+ 'To create your own server bindings, please extend the Application class.',
35
+ );
36
+
37
+ // To help cut down on verbosity!
38
+ export const SequenceActions = RestBindings.SequenceActions;
39
+
40
+ /**
41
+ * An implementation of the Application class that automatically provides
42
+ * an instance of a REST server. This application class is intended to be
43
+ * a single-server implementation. Any attempt to bind additional servers
44
+ * will throw an error.
45
+ *
46
+ */
47
+ export class RestApplication extends Application implements HttpServerLike {
48
+ /**
49
+ * The main REST server instance providing REST API for this application.
50
+ */
51
+ get restServer(): RestServer {
52
+ // FIXME(kjdelisle): I attempted to mimic the pattern found in RestServer
53
+ // with no success, so until I've got a better way, this is functional.
54
+ return this.getSync<RestServer>('servers.RestServer');
55
+ }
56
+
57
+ /**
58
+ * Handle incoming HTTP(S) request by invoking the corresponding
59
+ * Controller method via the configured Sequence.
60
+ *
61
+ * @example
62
+ *
63
+ * ```ts
64
+ * const app = new RestApplication();
65
+ * // setup controllers, etc.
66
+ *
67
+ * const server = http.createServer(app.requestHandler);
68
+ * server.listen(3000);
69
+ * ```
70
+ *
71
+ * @param req - The request.
72
+ * @param res - The response.
73
+ */
74
+ get requestHandler(): HttpRequestListener {
75
+ return this.restServer.requestHandler;
76
+ }
77
+
78
+ /**
79
+ * Create a REST application with the given parent context
80
+ * @param parent - Parent context
81
+ */
82
+ constructor(parent: Context);
83
+ /**
84
+ * Create a REST application with the given configuration and parent context
85
+ * @param config - Application configuration
86
+ * @param parent - Parent context
87
+ */
88
+ constructor(config?: ApplicationConfig, parent?: Context);
89
+
90
+ constructor(configOrParent?: ApplicationConfig | Context, parent?: Context) {
91
+ super(configOrParent, parent);
92
+ this.component(RestComponent);
93
+ }
94
+
95
+ server(server: Constructor<Server>, name?: string): Binding {
96
+ if (this.findByTag('server').length > 0) {
97
+ throw new Error(ERR_NO_MULTI_SERVER);
98
+ }
99
+ return super.server(server, name);
100
+ }
101
+
102
+ sequence(sequence: Constructor<SequenceHandler>): Binding {
103
+ return this.bind(RestBindings.SEQUENCE).toClass(sequence);
104
+ }
105
+
106
+ handler(handlerFn: SequenceFunction) {
107
+ this.restServer.handler(handlerFn);
108
+ }
109
+
110
+ /**
111
+ * Mount static assets to the REST server.
112
+ * See https://expressjs.com/en/4x/api.html#express.static
113
+ * @param path - The path(s) to serve the asset.
114
+ * See examples at https://expressjs.com/en/4x/api.html#path-examples
115
+ * To avoid performance penalty, `/` is not allowed for now.
116
+ * @param rootDir - The root directory from which to serve static assets
117
+ * @param options - Options for serve-static
118
+ */
119
+ static(path: PathParams, rootDir: string, options?: ServeStaticOptions) {
120
+ this.restServer.static(path, rootDir, options);
121
+ }
122
+
123
+ /**
124
+ * Bind a body parser to the server context
125
+ * @param parserClass - Body parser class
126
+ * @param address - Optional binding address
127
+ */
128
+ bodyParser(
129
+ bodyParserClass: Constructor<BodyParser>,
130
+ address?: BindingAddress<BodyParser>,
131
+ ): Binding<BodyParser> {
132
+ return this.restServer.bodyParser(bodyParserClass, address);
133
+ }
134
+
135
+ /**
136
+ * Configure the `basePath` for the rest server
137
+ * @param path - Base path
138
+ */
139
+ basePath(path = '') {
140
+ this.restServer.basePath(path);
141
+ }
142
+
143
+ /**
144
+ * Bind an Express middleware to this server context
145
+ *
146
+ * @example
147
+ * ```ts
148
+ * import myExpressMiddlewareFactory from 'my-express-middleware';
149
+ * const myExpressMiddlewareConfig= {};
150
+ * const myExpressMiddleware = myExpressMiddlewareFactory(myExpressMiddlewareConfig);
151
+ * server.expressMiddleware('middleware.express.my', myExpressMiddleware);
152
+ * ```
153
+ * @param key - Middleware binding key
154
+ * @param middleware - Express middleware handler function(s)
155
+ *
156
+ */
157
+ expressMiddleware(
158
+ key: BindingAddress,
159
+ middleware: ExpressRequestHandler | ExpressRequestHandler[],
160
+ options?: MiddlewareBindingOptions,
161
+ ): Binding<Middleware>;
162
+
163
+ /**
164
+ * Bind an Express middleware to this server context
165
+ *
166
+ * @example
167
+ * ```ts
168
+ * import myExpressMiddlewareFactory from 'my-express-middleware';
169
+ * const myExpressMiddlewareConfig= {};
170
+ * server.expressMiddleware(myExpressMiddlewareFactory, myExpressMiddlewareConfig);
171
+ * ```
172
+ * @param middlewareFactory - Middleware module name or factory function
173
+ * @param middlewareConfig - Middleware config
174
+ * @param options - Options for registration
175
+ *
176
+ * @typeParam CFG - Configuration type
177
+ */
178
+ expressMiddleware<CFG>(
179
+ middlewareFactory: ExpressMiddlewareFactory<CFG>,
180
+ middlewareConfig?: CFG,
181
+ options?: MiddlewareBindingOptions,
182
+ ): Binding<Middleware>;
183
+
184
+ expressMiddleware<CFG>(
185
+ factoryOrKey: ExpressMiddlewareFactory<CFG> | BindingAddress<Middleware>,
186
+ configOrHandlers: CFG | ExpressRequestHandler | ExpressRequestHandler[],
187
+ options: MiddlewareBindingOptions = {},
188
+ ): Binding<Middleware> {
189
+ return this.restServer.expressMiddleware(
190
+ factoryOrKey,
191
+ configOrHandlers,
192
+ options,
193
+ );
194
+ }
195
+
196
+ /**
197
+ * Register a middleware function or provider class
198
+ *
199
+ * @example
200
+ * ```ts
201
+ * const log: Middleware = async (requestCtx, next) {
202
+ * // ...
203
+ * }
204
+ * server.middleware(log);
205
+ * ```
206
+ *
207
+ * @param middleware - Middleware function or provider class
208
+ * @param options - Middleware binding options
209
+ */
210
+ middleware(
211
+ middleware: Middleware | Constructor<Provider<Middleware>>,
212
+ options: MiddlewareBindingOptions = {},
213
+ ): Binding<Middleware> {
214
+ return this.restServer.middleware(middleware, options);
215
+ }
216
+
217
+ /**
218
+ * Register a new Controller-based route.
219
+ *
220
+ * @example
221
+ * ```ts
222
+ * class MyController {
223
+ * greet(name: string) {
224
+ * return `hello ${name}`;
225
+ * }
226
+ * }
227
+ * app.route('get', '/greet', operationSpec, MyController, 'greet');
228
+ * ```
229
+ *
230
+ * @param verb - HTTP verb of the endpoint
231
+ * @param path - URL path of the endpoint
232
+ * @param spec - The OpenAPI spec describing the endpoint (operation)
233
+ * @param controllerCtor - Controller constructor
234
+ * @param controllerFactory - A factory function to create controller instance
235
+ * @param methodName - The name of the controller method
236
+ */
237
+ route<T>(
238
+ verb: string,
239
+ path: string,
240
+ spec: OperationObject,
241
+ controllerCtor: ControllerClass<T>,
242
+ controllerFactory: ControllerFactory<T>,
243
+ methodName: string,
244
+ ): Binding;
245
+
246
+ /**
247
+ * Register a new route invoking a handler function.
248
+ *
249
+ * @example
250
+ * ```ts
251
+ * function greet(name: string) {
252
+ * return `hello ${name}`;
253
+ * }
254
+ * app.route('get', '/', operationSpec, greet);
255
+ * ```
256
+ *
257
+ * @param verb - HTTP verb of the endpoint
258
+ * @param path - URL path of the endpoint
259
+ * @param spec - The OpenAPI spec describing the endpoint (operation)
260
+ * @param handler - The function to invoke with the request parameters
261
+ * described in the spec.
262
+ */
263
+ route(
264
+ verb: string,
265
+ path: string,
266
+ spec: OperationObject,
267
+ handler: Function,
268
+ ): Binding;
269
+
270
+ /**
271
+ * Register a new route.
272
+ *
273
+ * @example
274
+ * ```ts
275
+ * function greet(name: string) {
276
+ * return `hello ${name}`;
277
+ * }
278
+ * const route = new Route('get', '/', operationSpec, greet);
279
+ * app.route(route);
280
+ * ```
281
+ *
282
+ * @param route - The route to add.
283
+ */
284
+ route(route: RouteEntry): Binding;
285
+
286
+ /**
287
+ * Register a new route.
288
+ *
289
+ * @example
290
+ * ```ts
291
+ * function greet(name: string) {
292
+ * return `hello ${name}`;
293
+ * }
294
+ * app.route('get', '/', operationSpec, greet);
295
+ * ```
296
+ */
297
+ route(
298
+ verb: string,
299
+ path: string,
300
+ spec: OperationObject,
301
+ handler: Function,
302
+ ): Binding;
303
+
304
+ route<T>(
305
+ routeOrVerb: RouteEntry | string,
306
+ path?: string,
307
+ spec?: OperationObject,
308
+ controllerCtorOrHandler?: ControllerClass<T> | Function,
309
+ controllerFactory?: ControllerFactory<T>,
310
+ methodName?: string,
311
+ ): Binding {
312
+ const server = this.restServer;
313
+ if (typeof routeOrVerb === 'object') {
314
+ return server.route(routeOrVerb);
315
+ } else if (arguments.length === 4) {
316
+ return server.route(
317
+ routeOrVerb,
318
+ path!,
319
+ spec!,
320
+ controllerCtorOrHandler as Function,
321
+ );
322
+ } else {
323
+ return server.route(
324
+ routeOrVerb,
325
+ path!,
326
+ spec!,
327
+ controllerCtorOrHandler as ControllerClass<T>,
328
+ controllerFactory!,
329
+ methodName!,
330
+ );
331
+ }
332
+ }
333
+
334
+ /**
335
+ * Register a route redirecting callers to a different URL.
336
+ *
337
+ * @example
338
+ * ```ts
339
+ * app.redirect('/explorer', '/explorer/');
340
+ * ```
341
+ *
342
+ * @param fromPath - URL path of the redirect endpoint
343
+ * @param toPathOrUrl - Location (URL path or full URL) where to redirect to.
344
+ * If your server is configured with a custom `basePath`, then the base path
345
+ * is prepended to the target location.
346
+ * @param statusCode - HTTP status code to respond with,
347
+ * defaults to 303 (See Other).
348
+ */
349
+ redirect(
350
+ fromPath: string,
351
+ toPathOrUrl: string,
352
+ statusCode?: number,
353
+ ): Binding {
354
+ return this.restServer.redirect(fromPath, toPathOrUrl, statusCode);
355
+ }
356
+
357
+ /**
358
+ * Set the OpenAPI specification that defines the REST API schema for this
359
+ * application. All routes, parameter definitions and return types will be
360
+ * defined in this way.
361
+ *
362
+ * Note that this will override any routes defined via decorators at the
363
+ * controller level (this function takes precedent).
364
+ *
365
+ * @param spec - The OpenAPI specification, as an object.
366
+ * @returns Binding for the api spec
367
+ */
368
+ api(spec: OpenApiSpec): Binding {
369
+ return this.bind(RestBindings.API_SPEC).to(spec);
370
+ }
371
+
372
+ /**
373
+ * Mount an Express router to expose additional REST endpoints handled
374
+ * via legacy Express-based stack.
375
+ *
376
+ * @param basePath - Path where to mount the router at, e.g. `/` or `/api`.
377
+ * @param router - The Express router to handle the requests.
378
+ * @param spec - A partial OpenAPI spec describing endpoints provided by the
379
+ * router. LoopBack will prepend `basePath` to all endpoints automatically.
380
+ * This argument is optional. You can leave it out if you don't want to
381
+ * document the routes.
382
+ */
383
+ mountExpressRouter(
384
+ basePath: string,
385
+ router: ExpressRequestHandler,
386
+ spec?: RouterSpec,
387
+ ): void {
388
+ this.restServer.mountExpressRouter(basePath, router, spec);
389
+ }
390
+ }
@@ -0,0 +1,111 @@
1
+ // Copyright IBM Corp. 2018,2020. All Rights Reserved.
2
+ // Node module: @loopback/rest
3
+ // This file is licensed under the MIT License.
4
+ // License text available at https://opensource.org/licenses/MIT
5
+
6
+ import {
7
+ Binding,
8
+ Constructor,
9
+ createBindingFromClass,
10
+ inject,
11
+ } from '@loopback/context';
12
+ import {
13
+ Application,
14
+ Component,
15
+ CoreBindings,
16
+ ProviderMap,
17
+ Server,
18
+ } from '@loopback/core';
19
+ import {InvokeMiddlewareProvider} from '@loopback/express';
20
+ import {createEmptyApiSpec} from '@loopback/openapi-v3';
21
+ import {
22
+ JsonBodyParser,
23
+ RequestBodyParser,
24
+ StreamBodyParser,
25
+ TextBodyParser,
26
+ UrlEncodedBodyParser,
27
+ } from './body-parsers';
28
+ import {RawBodyParser} from './body-parsers/body-parser.raw';
29
+ import {RestBindings} from './keys';
30
+ import {
31
+ FindRouteProvider,
32
+ InvokeMethodProvider,
33
+ LogErrorProvider,
34
+ ParseParamsProvider,
35
+ RejectProvider,
36
+ SendProvider,
37
+ } from './providers';
38
+ import {
39
+ createBodyParserBinding,
40
+ RestServer,
41
+ RestServerConfig,
42
+ } from './rest.server';
43
+ import {DefaultSequence} from './sequence';
44
+ import {ConsolidationEnhancer} from './spec-enhancers/consolidate.spec-enhancer';
45
+ import {InfoSpecEnhancer} from './spec-enhancers/info.spec-enhancer';
46
+ import {AjvFactoryProvider} from './validation/ajv-factory.provider';
47
+
48
+ export class RestComponent implements Component {
49
+ providers: ProviderMap = {
50
+ [RestBindings.SequenceActions.LOG_ERROR.key]: LogErrorProvider,
51
+ [RestBindings.SequenceActions.INVOKE_MIDDLEWARE
52
+ .key]: InvokeMiddlewareProvider,
53
+ [RestBindings.SequenceActions.FIND_ROUTE.key]: FindRouteProvider,
54
+ [RestBindings.SequenceActions.INVOKE_METHOD.key]: InvokeMethodProvider,
55
+ [RestBindings.SequenceActions.REJECT.key]: RejectProvider,
56
+ [RestBindings.SequenceActions.PARSE_PARAMS.key]: ParseParamsProvider,
57
+ [RestBindings.SequenceActions.SEND.key]: SendProvider,
58
+ [RestBindings.AJV_FACTORY.key]: AjvFactoryProvider,
59
+ };
60
+ /**
61
+ * Add built-in body parsers
62
+ */
63
+ bindings: Binding[] = [
64
+ // FIXME(rfeng): We now register request body parsers in TRANSIENT scope
65
+ // so that they can be bound at application or server level
66
+ Binding.bind(RestBindings.REQUEST_BODY_PARSER).toClass(RequestBodyParser),
67
+ createBodyParserBinding(
68
+ JsonBodyParser,
69
+ RestBindings.REQUEST_BODY_PARSER_JSON,
70
+ ),
71
+ createBodyParserBinding(
72
+ TextBodyParser,
73
+ RestBindings.REQUEST_BODY_PARSER_TEXT,
74
+ ),
75
+ createBodyParserBinding(
76
+ UrlEncodedBodyParser,
77
+ RestBindings.REQUEST_BODY_PARSER_URLENCODED,
78
+ ),
79
+ createBodyParserBinding(
80
+ RawBodyParser,
81
+ RestBindings.REQUEST_BODY_PARSER_RAW,
82
+ ),
83
+ createBodyParserBinding(
84
+ StreamBodyParser,
85
+ RestBindings.REQUEST_BODY_PARSER_STREAM,
86
+ ),
87
+ createBindingFromClass(InfoSpecEnhancer),
88
+ createBindingFromClass(ConsolidationEnhancer),
89
+ ];
90
+ servers: {
91
+ [name: string]: Constructor<Server>;
92
+ } = {
93
+ RestServer,
94
+ };
95
+
96
+ constructor(
97
+ @inject(CoreBindings.APPLICATION_INSTANCE) app: Application,
98
+ @inject(RestBindings.CONFIG) config?: RestComponentConfig,
99
+ ) {
100
+ app.bind(RestBindings.SEQUENCE).toClass(DefaultSequence);
101
+ const apiSpec = createEmptyApiSpec();
102
+ // Merge the OpenAPI `servers` spec from the config into the empty one
103
+ if (config?.openApiSpec?.servers) {
104
+ Object.assign(apiSpec, {servers: config.openApiSpec.servers});
105
+ }
106
+ app.bind(RestBindings.API_SPEC).to(apiSpec);
107
+ }
108
+ }
109
+
110
+ // TODO(kevin): Extend this interface def to include multiple servers?
111
+ export type RestComponentConfig = RestServerConfig;