@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
package/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) IBM Corp. 2017. All Rights Reserved.
1
+ Copyright (c) IBM Corp. 2017,2019.
2
2
  Node module: @loopback/rest
3
3
  This project is licensed under the MIT License, full text below.
4
4
 
package/README.md CHANGED
@@ -1,84 +1,55 @@
1
1
  # @loopback/rest
2
2
 
3
- The REST API package for [loopback-next](https://github.com/strongloop/loopback-next).
4
-
5
- ## STATUS: ALPHA
6
- This package is not yet ready for production use, and the API has not yet
7
- stabilized. Additionally, this document is also a work-in-progress and some
8
- sections may not have corresponding code!
3
+ The REST API package for
4
+ [loopback-next](https://github.com/strongloop/loopback-next).
9
5
 
10
6
  ## Overview
7
+
11
8
  This component provides a REST server for your application instances, complete
12
9
  with:
10
+
13
11
  - new custom routing engine (special thanks to @bajtos)!
14
12
  - tools for defining your application routes
15
- - OpenAPI 2.0 spec (`swagger.json`/`swagger.yaml`) generation
13
+ - OpenAPI 3.0 spec (`openapi.json`/`openapi.yaml`) generation using
14
+ `@loopback/openapi-v3`
16
15
  - a default sequence implementation to manage the request and response lifecycle
16
+
17
17
  ## Installation
18
- To use this package, you'll need to install both `@loopback/core` and
19
- `@loopback/rest`.
20
18
 
21
- ```shell
22
- $ npm install --save @loopback/core @loopback/rest
19
+ To use this package, you'll need to install `@loopback/rest`.
20
+
21
+ ```sh
22
+ npm i @loopback/rest
23
23
  ```
24
24
 
25
25
  ## Basic Use
26
- Here's a basic "Hello World" application using `@loopback/core` and
27
- `@loopback/rest`:
28
-
29
- ```ts
30
- import {Application} from '@loopback/core';
31
- import {RestComponent, RestServer} from '@loopback/rest';
32
-
33
- const app = new Application({
34
- components: [
35
- RestComponent,
36
- ]
37
- });
38
-
39
- (async function start() {
40
- const rest = await app.getServer(RestServer);
41
- rest.handler((sequence, request, response) => {
42
- sequence.send(response, 'hello world');
43
- });
44
- await app.start();
45
- console.log(`REST server running on port: ${rest.getSync('rest.port')}`);
46
- })();
47
- ```
48
26
 
49
- ## Configuration
50
- The rest package is configured by passing a `rest` property inside of your
51
- Application options.
27
+ Here's a basic "Hello World" application using `@loopback/rest`:
52
28
 
53
29
  ```ts
54
- const app = new Application({
55
- components: [
56
- RestComponent,
57
- ],
58
- rest: {
59
- port: 3001
60
- }
61
- });
62
- ```
30
+ import {RestApplication, RestServer} from '@loopback/rest';
63
31
 
64
- ### `rest` options
32
+ const app = new RestApplication();
33
+ app.handler(({request, response}, sequence) => {
34
+ sequence.send(response, 'hello world');
35
+ });
65
36
 
66
- | Property | Type | Purpose |
67
- |----------|------|---------|
68
- | port | number | Specify the port on which the RestServer will listen for traffic. |
69
- | secure (NOT YET IMPLEMENTED) | HttpsConfiguration | Provide a collection of secure key materials to the RestServer, which switches it to HTTPS mode. |
70
- | sequence | SequenceHandler | Use a custom SequenceHandler to change the behaviour of the RestServer for the request-response lifecycle. |
37
+ (async function start() {
38
+ await app.start();
71
39
 
72
- #### HttpsConfiguration
73
- <!-- TODO(@kjdelisle): Define the contents of this type for users. -->
40
+ const server = await app.getServer(RestServer);
41
+ const port = await server.get('rest.port');
42
+ console.log(`Server is running at http://127.0.0.1:${port}`);
43
+ })();
44
+ ```
45
+
46
+ ## Configuration
74
47
 
75
- #### SequenceHandler
76
- <!-- TODO(@kjdelisle): Point to the request-response lifecycle doc
77
- (or migrate it here?) -->
48
+ See https://loopback.io/doc/en/lb4/Server.html#configuration.
78
49
 
79
50
  ## Contributions
80
51
 
81
- - [Guidelines](https://github.com/strongloop/loopback-next/wiki/Contributing#guidelines)
52
+ - [Guidelines](https://github.com/strongloop/loopback-next/blob/master/docs/CONTRIBUTING.md)
82
53
  - [Join the team](https://github.com/strongloop/loopback-next/issues/110)
83
54
 
84
55
  ## Tests
@@ -87,7 +58,8 @@ Run `npm test` from the root folder.
87
58
 
88
59
  ## Contributors
89
60
 
90
- See [all contributors](https://github.com/strongloop/loopback-next/graphs/contributors).
61
+ See
62
+ [all contributors](https://github.com/strongloop/loopback-next/graphs/contributors).
91
63
 
92
64
  ## License
93
65
 
@@ -0,0 +1,25 @@
1
+ import { Context } from '@loopback/context';
2
+ import { OperationObject } from '@loopback/openapi-v3';
3
+ import { Request } from '../types';
4
+ import { BodyParser, RequestBody } from './types';
5
+ export declare class RequestBodyParser {
6
+ private readonly ctx?;
7
+ readonly parsers: BodyParser[];
8
+ constructor(parsers?: BodyParser[], ctx?: Context | undefined);
9
+ loadRequestBodyIfNeeded(operationSpec: OperationObject, request: Request): Promise<RequestBody>;
10
+ /**
11
+ * Match the http request to a given media type of the request body spec
12
+ */
13
+ private _matchRequestBodySpec;
14
+ /**
15
+ * Find a body parser that supports the media type
16
+ * @param matchedMediaType - Media type
17
+ */
18
+ private _findParser;
19
+ /**
20
+ * Resolve and invoke a custom parser
21
+ * @param customParser - The parser name, class or function
22
+ * @param request - Http request
23
+ */
24
+ private _invokeCustomParser;
25
+ }
@@ -0,0 +1,44 @@
1
+ import { Options, OptionsJson, OptionsText, OptionsUrlencoded } from 'body-parser';
2
+ import { HttpError } from 'http-errors';
3
+ import { Request, RequestBodyParserOptions, Response } from '../types';
4
+ /**
5
+ * Get the content-type header value from the request
6
+ * @param req - Http request
7
+ */
8
+ export declare function getContentType(req: Request): string | undefined;
9
+ /**
10
+ * Express body parser function type
11
+ */
12
+ export declare type BodyParserMiddleware = (request: Request, response: Response, next: (err: HttpError) => void) => void;
13
+ /**
14
+ * Normalize parsing errors as `4xx`
15
+ * @param err
16
+ */
17
+ export declare function normalizeParsingError(err: HttpError): HttpError;
18
+ /**
19
+ * Parse the request body asynchronously
20
+ * @param handle - The express middleware handler
21
+ * @param request - Http request
22
+ */
23
+ export declare function invokeBodyParserMiddleware(handle: BodyParserMiddleware, request: Request): Promise<any>;
24
+ export declare const DEFAULT_LIMIT = "1mb";
25
+ /**
26
+ * Extract parser options based on the parser type
27
+ * @param type - json|urlencoded|text
28
+ * @param options
29
+ */
30
+ export declare function getParserOptions(type: 'json', options: RequestBodyParserOptions): OptionsJson;
31
+ export declare function getParserOptions(type: 'urlencoded', options: RequestBodyParserOptions): OptionsUrlencoded;
32
+ export declare function getParserOptions(type: 'text', options: RequestBodyParserOptions): OptionsText;
33
+ export declare function getParserOptions(type: 'raw', options: RequestBodyParserOptions): Options;
34
+ export declare namespace builtinParsers {
35
+ const json: unique symbol;
36
+ const urlencoded: unique symbol;
37
+ const text: unique symbol;
38
+ const raw: unique symbol;
39
+ const stream: unique symbol;
40
+ const names: (string | symbol)[];
41
+ const mapping: {
42
+ [name: string]: symbol;
43
+ };
44
+ }
@@ -0,0 +1,102 @@
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.builtinParsers = exports.getParserOptions = exports.DEFAULT_LIMIT = exports.invokeBodyParserMiddleware = exports.normalizeParsingError = exports.getContentType = void 0;
8
+ const tslib_1 = require("tslib");
9
+ const debug_1 = tslib_1.__importDefault(require("debug"));
10
+ const debug = debug_1.default('loopback:rest:body-parser');
11
+ /**
12
+ * Get the content-type header value from the request
13
+ * @param req - Http request
14
+ */
15
+ function getContentType(req) {
16
+ return req.get('content-type');
17
+ }
18
+ exports.getContentType = getContentType;
19
+ /**
20
+ * Normalize parsing errors as `4xx`
21
+ * @param err
22
+ */
23
+ function normalizeParsingError(err) {
24
+ debug('Cannot parse request body %j', err);
25
+ if (!err.statusCode || err.statusCode >= 500) {
26
+ err.statusCode = 400;
27
+ }
28
+ return err;
29
+ }
30
+ exports.normalizeParsingError = normalizeParsingError;
31
+ /* eslint-disable @typescript-eslint/no-explicit-any */
32
+ /**
33
+ * Parse the request body asynchronously
34
+ * @param handle - The express middleware handler
35
+ * @param request - Http request
36
+ */
37
+ function invokeBodyParserMiddleware(handle, request) {
38
+ // A hack to fool TypeScript as we don't need `response`
39
+ const response = {};
40
+ return new Promise((resolve, reject) => {
41
+ handle(request, response, err => {
42
+ if (err) {
43
+ reject(err);
44
+ return;
45
+ }
46
+ resolve(request.body);
47
+ });
48
+ });
49
+ }
50
+ exports.invokeBodyParserMiddleware = invokeBodyParserMiddleware;
51
+ // Default limit of the body length
52
+ exports.DEFAULT_LIMIT = '1mb';
53
+ function getParserOptions(type, options) {
54
+ const opts = { limit: exports.DEFAULT_LIMIT };
55
+ switch (type) {
56
+ case 'json':
57
+ // Allow */json and */*+json
58
+ opts.type = ['*/json', '*/*+json'];
59
+ opts.strict = false;
60
+ break;
61
+ case 'urlencoded':
62
+ opts.type = type;
63
+ opts.extended = true;
64
+ break;
65
+ case 'text':
66
+ // Set media type to `text/*` to match `text/plain` or `text/html`
67
+ opts.type = 'text/*';
68
+ break;
69
+ case 'raw':
70
+ opts.type = ['application/octet-stream', '*/*'];
71
+ break;
72
+ }
73
+ Object.assign(opts, options[type], options);
74
+ for (const k of ['json', 'urlencoded', 'text', 'raw']) {
75
+ delete opts[k];
76
+ }
77
+ return opts;
78
+ }
79
+ exports.getParserOptions = getParserOptions;
80
+ var builtinParsers;
81
+ (function (builtinParsers) {
82
+ builtinParsers.json = Symbol('json');
83
+ builtinParsers.urlencoded = Symbol('urlencoded');
84
+ builtinParsers.text = Symbol('text');
85
+ builtinParsers.raw = Symbol('raw');
86
+ builtinParsers.stream = Symbol('stream');
87
+ builtinParsers.names = [
88
+ builtinParsers.json,
89
+ builtinParsers.urlencoded,
90
+ builtinParsers.text,
91
+ builtinParsers.raw,
92
+ builtinParsers.stream,
93
+ ];
94
+ builtinParsers.mapping = {
95
+ json: builtinParsers.json,
96
+ urlencoded: builtinParsers.urlencoded,
97
+ text: builtinParsers.text,
98
+ raw: builtinParsers.raw,
99
+ stream: builtinParsers.stream,
100
+ };
101
+ })(builtinParsers = exports.builtinParsers || (exports.builtinParsers = {}));
102
+ //# sourceMappingURL=body-parser.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body-parser.helpers.js","sourceRoot":"","sources":["../../src/body-parsers/body-parser.helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ // Copyright IBM Corp. 2018,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.RequestBodyParser = void 0;
8
+ const tslib_1 = require("tslib");
9
+ const context_1 = require("@loopback/context");
10
+ const openapi_v3_1 = require("@loopback/openapi-v3");
11
+ const debug_1 = tslib_1.__importDefault(require("debug"));
12
+ const type_is_1 = require("type-is");
13
+ const rest_http_error_1 = require("../rest-http-error");
14
+ const body_parser_helpers_1 = require("./body-parser.helpers");
15
+ const types_1 = require("./types");
16
+ const debug = debug_1.default('loopback:rest:body-parser');
17
+ let RequestBodyParser = /** @class */ (() => {
18
+ let RequestBodyParser = class RequestBodyParser {
19
+ constructor(parsers, ctx) {
20
+ this.ctx = ctx;
21
+ this.parsers = sortParsers(parsers !== null && parsers !== void 0 ? parsers : []);
22
+ if (debug.enabled) {
23
+ debug('Body parsers: ', this.parsers.map(p => p.name));
24
+ }
25
+ }
26
+ async loadRequestBodyIfNeeded(operationSpec, request) {
27
+ const { requestBody, customParser } = await this._matchRequestBodySpec(operationSpec, request);
28
+ if (!operationSpec.requestBody)
29
+ return requestBody;
30
+ const matchedMediaType = requestBody.mediaType;
31
+ try {
32
+ if (customParser) {
33
+ // Invoke the custom parser
34
+ const body = await this._invokeCustomParser(customParser, request);
35
+ return Object.assign(requestBody, body);
36
+ }
37
+ else {
38
+ const parser = this._findParser(matchedMediaType);
39
+ if (parser) {
40
+ const body = await parser.parse(request);
41
+ return Object.assign(requestBody, body);
42
+ }
43
+ }
44
+ }
45
+ catch (err) {
46
+ throw body_parser_helpers_1.normalizeParsingError(err);
47
+ }
48
+ throw rest_http_error_1.RestHttpErrors.unsupportedMediaType(matchedMediaType);
49
+ }
50
+ /**
51
+ * Match the http request to a given media type of the request body spec
52
+ */
53
+ async _matchRequestBodySpec(operationSpec, request) {
54
+ var _a;
55
+ const requestBody = {
56
+ value: undefined,
57
+ };
58
+ if (!operationSpec.requestBody)
59
+ return { requestBody };
60
+ const contentType = (_a = body_parser_helpers_1.getContentType(request)) !== null && _a !== void 0 ? _a : 'application/json';
61
+ debug('Loading request body with content type %j', contentType);
62
+ // the type of `operationSpec.requestBody` could be `RequestBodyObject`
63
+ // or `ReferenceObject`, resolving a `$ref` value is not supported yet.
64
+ if (openapi_v3_1.isReferenceObject(operationSpec.requestBody)) {
65
+ throw new Error('$ref requestBody is not supported yet.');
66
+ }
67
+ let content = operationSpec.requestBody.content || {};
68
+ if (!Object.keys(content).length) {
69
+ content = {
70
+ // default to allow json and urlencoded
71
+ 'application/json': { schema: { type: 'object' } },
72
+ 'application/x-www-form-urlencoded': { schema: { type: 'object' } },
73
+ };
74
+ }
75
+ // Check of the request content type matches one of the expected media
76
+ // types in the request body spec
77
+ let matchedMediaType = false;
78
+ let customParser = undefined;
79
+ for (const type in content) {
80
+ matchedMediaType = type_is_1.is(contentType, type);
81
+ if (matchedMediaType) {
82
+ debug('Matched media type: %s -> %s', type, contentType);
83
+ requestBody.mediaType = contentType;
84
+ requestBody.schema = content[type].schema;
85
+ customParser = content[type]['x-parser'];
86
+ break;
87
+ }
88
+ }
89
+ if (!matchedMediaType) {
90
+ // No matching media type found, fail fast
91
+ throw rest_http_error_1.RestHttpErrors.unsupportedMediaType(contentType, Object.keys(content));
92
+ }
93
+ return { requestBody, customParser };
94
+ }
95
+ /**
96
+ * Find a body parser that supports the media type
97
+ * @param matchedMediaType - Media type
98
+ */
99
+ _findParser(matchedMediaType) {
100
+ for (const parser of this.parsers) {
101
+ if (!parser.supports(matchedMediaType)) {
102
+ debug('Body parser %s does not support %s', parser.name, matchedMediaType);
103
+ continue;
104
+ }
105
+ debug('Body parser %s found for %s', parser.name, matchedMediaType);
106
+ return parser;
107
+ }
108
+ }
109
+ /**
110
+ * Resolve and invoke a custom parser
111
+ * @param customParser - The parser name, class or function
112
+ * @param request - Http request
113
+ */
114
+ async _invokeCustomParser(customParser, request) {
115
+ if (typeof customParser === 'string') {
116
+ const parser = this.parsers.find(p => p.name === customParser ||
117
+ p.name === body_parser_helpers_1.builtinParsers.mapping[customParser]);
118
+ if (parser) {
119
+ debug('Using custom parser %s', customParser);
120
+ return parser.parse(request);
121
+ }
122
+ }
123
+ else if (typeof customParser === 'function') {
124
+ if (isBodyParserClass(customParser)) {
125
+ debug('Using custom parser class %s', customParser.name);
126
+ const parser = await context_1.instantiateClass(customParser, this.ctx);
127
+ return parser.parse(request);
128
+ }
129
+ else {
130
+ debug('Using custom parser function %s', customParser.name);
131
+ return customParser(request);
132
+ }
133
+ }
134
+ throw new Error('Custom parser not found: ' + customParser);
135
+ }
136
+ };
137
+ RequestBodyParser = tslib_1.__decorate([
138
+ tslib_1.__param(0, context_1.inject(context_1.filterByTag(types_1.REQUEST_BODY_PARSER_TAG), { optional: true })),
139
+ tslib_1.__param(1, context_1.inject.context()),
140
+ tslib_1.__metadata("design:paramtypes", [Array, context_1.Context])
141
+ ], RequestBodyParser);
142
+ return RequestBodyParser;
143
+ })();
144
+ exports.RequestBodyParser = RequestBodyParser;
145
+ /**
146
+ * Test if a function is a body parser class or plain function
147
+ * @param fn
148
+ */
149
+ function isBodyParserClass(fn) {
150
+ return fn.toString().startsWith('class ');
151
+ }
152
+ /**
153
+ * Sort body parsers so that built-in ones are used after extensions
154
+ * @param parsers
155
+ */
156
+ function sortParsers(parsers) {
157
+ return parsers.sort((a, b) => context_1.compareByOrder(a.name, b.name, body_parser_helpers_1.builtinParsers.names));
158
+ }
159
+ //# sourceMappingURL=body-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body-parser.js","sourceRoot":"","sources":["../../src/body-parsers/body-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Request, RequestBodyParserOptions } from '../types';
2
+ import { BodyParser, RequestBody } from './types';
3
+ export declare class JsonBodyParser implements BodyParser {
4
+ name: symbol;
5
+ private jsonParser;
6
+ constructor(options?: RequestBodyParserOptions);
7
+ supports(mediaType: string): boolean;
8
+ parse(request: Request): Promise<RequestBody>;
9
+ }
@@ -0,0 +1,43 @@
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.JsonBodyParser = void 0;
8
+ const tslib_1 = require("tslib");
9
+ const context_1 = require("@loopback/context");
10
+ const body_parser_1 = require("body-parser");
11
+ const type_is_1 = require("type-is");
12
+ const keys_1 = require("../keys");
13
+ const body_parser_helpers_1 = require("./body-parser.helpers");
14
+ const parse_json_1 = require("../parse-json");
15
+ let JsonBodyParser = /** @class */ (() => {
16
+ let JsonBodyParser = class JsonBodyParser {
17
+ constructor(options = {}) {
18
+ this.name = body_parser_helpers_1.builtinParsers.json;
19
+ const jsonOptions = body_parser_helpers_1.getParserOptions('json', options);
20
+ jsonOptions.reviver = parse_json_1.sanitizeJsonParse(jsonOptions.reviver);
21
+ this.jsonParser = body_parser_1.json(jsonOptions);
22
+ }
23
+ supports(mediaType) {
24
+ return !!type_is_1.is(mediaType, '*/json', '*/*+json');
25
+ }
26
+ async parse(request) {
27
+ let body = await body_parser_helpers_1.invokeBodyParserMiddleware(this.jsonParser, request);
28
+ // https://github.com/expressjs/body-parser/blob/master/lib/types/json.js#L71-L76
29
+ const contentLength = request.get('content-length');
30
+ if (contentLength != null && +contentLength === 0) {
31
+ body = undefined;
32
+ }
33
+ return { value: body };
34
+ }
35
+ };
36
+ JsonBodyParser = tslib_1.__decorate([
37
+ tslib_1.__param(0, context_1.inject(keys_1.RestBindings.REQUEST_BODY_PARSER_OPTIONS, { optional: true })),
38
+ tslib_1.__metadata("design:paramtypes", [Object])
39
+ ], JsonBodyParser);
40
+ return JsonBodyParser;
41
+ })();
42
+ exports.JsonBodyParser = JsonBodyParser;
43
+ //# sourceMappingURL=body-parser.json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body-parser.json.js","sourceRoot":"","sources":["../../src/body-parsers/body-parser.json.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,8BAA8B;AAC9B,+CAA+C;AAC/C,gEAAgE;;;;AAEhE,+CAAyC;AACzC,6CAAiC;AACjC,qCAA2B;AAC3B,kCAAqC;AAErC,+DAK+B;AAE/B,8CAAgD;AAEhD;IAAA,IAAa,cAAc,GAA3B,MAAa,cAAc;QAIzB,YAEE,UAAoC,EAAE;YALxC,SAAI,GAAG,oCAAc,CAAC,IAAI,CAAC;YAOzB,MAAM,WAAW,GAAG,sCAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACtD,WAAW,CAAC,OAAO,GAAG,8BAAiB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC7D,IAAI,CAAC,UAAU,GAAG,kBAAI,CAAC,WAAW,CAAC,CAAC;QACtC,CAAC;QAED,QAAQ,CAAC,SAAiB;YACxB,OAAO,CAAC,CAAC,YAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC/C,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,OAAgB;YAC1B,IAAI,IAAI,GAAG,MAAM,gDAA0B,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACtE,iFAAiF;YACjF,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YACpD,IAAI,aAAa,IAAI,IAAI,IAAI,CAAC,aAAa,KAAK,CAAC,EAAE;gBACjD,IAAI,GAAG,SAAS,CAAC;aAClB;YACD,OAAO,EAAC,KAAK,EAAE,IAAI,EAAC,CAAC;QACvB,CAAC;KACF,CAAA;IA1BY,cAAc;QAKtB,mBAAA,gBAAM,CAAC,mBAAY,CAAC,2BAA2B,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC,CAAA;;OAL1D,cAAc,CA0B1B;IAAD,qBAAC;KAAA;AA1BY,wCAAc"}
@@ -0,0 +1,12 @@
1
+ import { Request, RequestBodyParserOptions } from '../types';
2
+ import { BodyParser, RequestBody } from './types';
3
+ /**
4
+ * Parsing the request body into Buffer
5
+ */
6
+ export declare class RawBodyParser implements BodyParser {
7
+ name: symbol;
8
+ private rawParser;
9
+ constructor(options?: RequestBodyParserOptions);
10
+ supports(mediaType: string): boolean;
11
+ parse(request: Request): Promise<RequestBody>;
12
+ }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ // Copyright IBM Corp. 2018. 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.RawBodyParser = void 0;
8
+ const tslib_1 = require("tslib");
9
+ const context_1 = require("@loopback/context");
10
+ const body_parser_1 = require("body-parser");
11
+ const type_is_1 = require("type-is");
12
+ const keys_1 = require("../keys");
13
+ const body_parser_helpers_1 = require("./body-parser.helpers");
14
+ /**
15
+ * Parsing the request body into Buffer
16
+ */
17
+ let RawBodyParser = /** @class */ (() => {
18
+ let RawBodyParser = class RawBodyParser {
19
+ constructor(options = {}) {
20
+ this.name = body_parser_helpers_1.builtinParsers.raw;
21
+ const rawOptions = body_parser_helpers_1.getParserOptions('raw', options);
22
+ this.rawParser = body_parser_1.raw(rawOptions);
23
+ }
24
+ supports(mediaType) {
25
+ return !!type_is_1.is(mediaType, 'application/octet-stream');
26
+ }
27
+ async parse(request) {
28
+ const body = await body_parser_helpers_1.invokeBodyParserMiddleware(this.rawParser, request);
29
+ return { value: body };
30
+ }
31
+ };
32
+ RawBodyParser = tslib_1.__decorate([
33
+ tslib_1.__param(0, context_1.inject(keys_1.RestBindings.REQUEST_BODY_PARSER_OPTIONS, { optional: true })),
34
+ tslib_1.__metadata("design:paramtypes", [Object])
35
+ ], RawBodyParser);
36
+ return RawBodyParser;
37
+ })();
38
+ exports.RawBodyParser = RawBodyParser;
39
+ //# sourceMappingURL=body-parser.raw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body-parser.raw.js","sourceRoot":"","sources":["../../src/body-parsers/body-parser.raw.ts"],"names":[],"mappings":";AAAA,iDAAiD;AACjD,8BAA8B;AAC9B,+CAA+C;AAC/C,gEAAgE;;;;AAEhE,+CAAyC;AACzC,6CAAgC;AAChC,qCAA2B;AAC3B,kCAAqC;AAErC,+DAK+B;AAG/B;;GAEG;AACH;IAAA,IAAa,aAAa,GAA1B,MAAa,aAAa;QAIxB,YAEE,UAAoC,EAAE;YALxC,SAAI,GAAG,oCAAc,CAAC,GAAG,CAAC;YAOxB,MAAM,UAAU,GAAG,sCAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACpD,IAAI,CAAC,SAAS,GAAG,iBAAG,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC;QAED,QAAQ,CAAC,SAAiB;YACxB,OAAO,CAAC,CAAC,YAAE,CAAC,SAAS,EAAE,0BAA0B,CAAC,CAAC;QACrD,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,OAAgB;YAC1B,MAAM,IAAI,GAAG,MAAM,gDAA0B,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACvE,OAAO,EAAC,KAAK,EAAE,IAAI,EAAC,CAAC;QACvB,CAAC;KACF,CAAA;IApBY,aAAa;QAKrB,mBAAA,gBAAM,CAAC,mBAAY,CAAC,2BAA2B,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC,CAAA;;OAL1D,aAAa,CAoBzB;IAAD,oBAAC;KAAA;AApBY,sCAAa"}
@@ -0,0 +1,12 @@
1
+ import { Request } from '../types';
2
+ import { BodyParser, RequestBody } from './types';
3
+ /**
4
+ * A special body parser to retain request stream as is.
5
+ * It will be used by explicitly setting `x-parser` to `'stream'` in the request
6
+ * body spec.
7
+ */
8
+ export declare class StreamBodyParser implements BodyParser {
9
+ name: symbol;
10
+ supports(mediaType: string): boolean;
11
+ parse(request: Request): Promise<RequestBody>;
12
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ // Copyright IBM Corp. 2018. 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.StreamBodyParser = void 0;
8
+ const body_parser_helpers_1 = require("./body-parser.helpers");
9
+ /**
10
+ * A special body parser to retain request stream as is.
11
+ * It will be used by explicitly setting `x-parser` to `'stream'` in the request
12
+ * body spec.
13
+ */
14
+ class StreamBodyParser {
15
+ constructor() {
16
+ this.name = body_parser_helpers_1.builtinParsers.stream;
17
+ }
18
+ supports(mediaType) {
19
+ // Return `false` so that this parser can only be trigged by the
20
+ // `{x-parser: 'stream'}` extension in the request body spec
21
+ return false;
22
+ }
23
+ async parse(request) {
24
+ return { value: request };
25
+ }
26
+ }
27
+ exports.StreamBodyParser = StreamBodyParser;
28
+ //# sourceMappingURL=body-parser.stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body-parser.stream.js","sourceRoot":"","sources":["../../src/body-parsers/body-parser.stream.ts"],"names":[],"mappings":";AAAA,iDAAiD;AACjD,8BAA8B;AAC9B,+CAA+C;AAC/C,gEAAgE;;;AAIhE,+DAAqD;AAErD;;;;GAIG;AACH,MAAa,gBAAgB;IAA7B;QACE,SAAI,GAAG,oCAAc,CAAC,MAAM,CAAC;IAW/B,CAAC;IATC,QAAQ,CAAC,SAAiB;QACxB,gEAAgE;QAChE,4DAA4D;QAC5D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAgB;QAC1B,OAAO,EAAC,KAAK,EAAE,OAAO,EAAC,CAAC;IAC1B,CAAC;CACF;AAZD,4CAYC"}
@@ -0,0 +1,9 @@
1
+ import { Request, RequestBodyParserOptions } from '../types';
2
+ import { BodyParser, RequestBody } from './types';
3
+ export declare class TextBodyParser implements BodyParser {
4
+ name: symbol;
5
+ private textParser;
6
+ constructor(options?: RequestBodyParserOptions);
7
+ supports(mediaType: string): boolean;
8
+ parse(request: Request): Promise<RequestBody>;
9
+ }