@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,68 @@
1
+ import { ApplicationConfig } from '@loopback/core';
2
+ import { OASEnhancer, OpenApiSpec } from '@loopback/openapi-v3';
3
+ /**
4
+ * This enhancer consolidates schemas into `/components/schemas` and replaces
5
+ * instances of said schema with a $ref pointer.
6
+ *
7
+ * Please note that the title property must be set on a schema in order to be
8
+ * considered for consolidation.
9
+ *
10
+ * For example, with the following schema instance:
11
+ *
12
+ * ```json
13
+ * schema: {
14
+ * title: 'loopback.example',
15
+ * properties: {
16
+ * test: {
17
+ * type: 'string',
18
+ * },
19
+ * },
20
+ * }
21
+ * ```
22
+ *
23
+ * The consolidator will copy the schema body to
24
+ * `/components/schemas/loopback.example` and replace any instance of the schema
25
+ * with a reference to the component schema as follows:
26
+ *
27
+ * ```json
28
+ * schema: {
29
+ * $ref: '#/components/schemas/loopback.example',
30
+ * }
31
+ * ```
32
+ *
33
+ * When comparing schemas to avoid naming collisions, the description field
34
+ * is ignored.
35
+ */
36
+ export declare class ConsolidationEnhancer implements OASEnhancer {
37
+ readonly config?: ApplicationConfig | undefined;
38
+ name: string;
39
+ disabled: boolean;
40
+ constructor(config?: ApplicationConfig | undefined);
41
+ modifySpec(spec: OpenApiSpec): OpenApiSpec;
42
+ /**
43
+ * Recursively search OpenApiSpec PathsObject for SchemaObjects with title
44
+ * property. Moves reusable schema bodies to #/components/schemas and replace
45
+ * with json pointer. It handles title collisions with schema body comparision.
46
+ */
47
+ private consolidateSchemaObjects;
48
+ private recursiveWalk;
49
+ /**
50
+ * Carry out schema consolidation after tree traversal. If 'title' property
51
+ * set then we consider current schema for consolidation. SchemaObjects with
52
+ * properties (and title set) are moved to #/components/schemas/<title> and
53
+ * replaced with ReferenceObject.
54
+ *
55
+ * Features:
56
+ * - name collision protection
57
+ *
58
+ * @param schema - current schema element to process
59
+ * @param parentPath - path object to parent
60
+ * @param spec - subject OpenApi specification
61
+ */
62
+ private processSchema;
63
+ private getRefSchema;
64
+ private patchRef;
65
+ private patchPath;
66
+ private ifConsolidationCandidate;
67
+ private isTraversable;
68
+ }
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ // Copyright IBM Corp. 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.ConsolidationEnhancer = void 0;
8
+ const tslib_1 = require("tslib");
9
+ const core_1 = require("@loopback/core");
10
+ const openapi_v3_1 = require("@loopback/openapi-v3");
11
+ const debug_1 = tslib_1.__importDefault(require("debug"));
12
+ const json_schema_compare_1 = tslib_1.__importDefault(require("json-schema-compare"));
13
+ const lodash_1 = tslib_1.__importDefault(require("lodash"));
14
+ const debug = debug_1.default('loopback:openapi:spec-enhancer:consolidate');
15
+ /**
16
+ * This enhancer consolidates schemas into `/components/schemas` and replaces
17
+ * instances of said schema with a $ref pointer.
18
+ *
19
+ * Please note that the title property must be set on a schema in order to be
20
+ * considered for consolidation.
21
+ *
22
+ * For example, with the following schema instance:
23
+ *
24
+ * ```json
25
+ * schema: {
26
+ * title: 'loopback.example',
27
+ * properties: {
28
+ * test: {
29
+ * type: 'string',
30
+ * },
31
+ * },
32
+ * }
33
+ * ```
34
+ *
35
+ * The consolidator will copy the schema body to
36
+ * `/components/schemas/loopback.example` and replace any instance of the schema
37
+ * with a reference to the component schema as follows:
38
+ *
39
+ * ```json
40
+ * schema: {
41
+ * $ref: '#/components/schemas/loopback.example',
42
+ * }
43
+ * ```
44
+ *
45
+ * When comparing schemas to avoid naming collisions, the description field
46
+ * is ignored.
47
+ */
48
+ let ConsolidationEnhancer = /** @class */ (() => {
49
+ let ConsolidationEnhancer = class ConsolidationEnhancer {
50
+ constructor(config) {
51
+ var _a, _b, _c;
52
+ this.config = config;
53
+ this.name = 'consolidate';
54
+ this.disabled = ((_c = (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.rest) === null || _b === void 0 ? void 0 : _b.openApiSpec) === null || _c === void 0 ? void 0 : _c.consolidate) === false;
55
+ }
56
+ modifySpec(spec) {
57
+ return !this.disabled ? this.consolidateSchemaObjects(spec) : spec;
58
+ }
59
+ /**
60
+ * Recursively search OpenApiSpec PathsObject for SchemaObjects with title
61
+ * property. Moves reusable schema bodies to #/components/schemas and replace
62
+ * with json pointer. It handles title collisions with schema body comparision.
63
+ */
64
+ consolidateSchemaObjects(spec) {
65
+ // use 'paths' as crawl root
66
+ this.recursiveWalk(spec.paths, ['paths'], spec);
67
+ return spec;
68
+ }
69
+ recursiveWalk(rootSchema, parentPath, spec) {
70
+ if (this.isTraversable(rootSchema)) {
71
+ Object.entries(rootSchema).forEach(([key, subSchema]) => {
72
+ if (subSchema) {
73
+ this.recursiveWalk(subSchema, parentPath.concat(key), spec);
74
+ this.processSchema(subSchema, parentPath.concat(key), spec);
75
+ }
76
+ });
77
+ }
78
+ }
79
+ /**
80
+ * Carry out schema consolidation after tree traversal. If 'title' property
81
+ * set then we consider current schema for consolidation. SchemaObjects with
82
+ * properties (and title set) are moved to #/components/schemas/<title> and
83
+ * replaced with ReferenceObject.
84
+ *
85
+ * Features:
86
+ * - name collision protection
87
+ *
88
+ * @param schema - current schema element to process
89
+ * @param parentPath - path object to parent
90
+ * @param spec - subject OpenApi specification
91
+ */
92
+ processSchema(schema, parentPath, spec) {
93
+ const schemaObj = this.ifConsolidationCandidate(schema);
94
+ if (schemaObj) {
95
+ // name collison protection
96
+ let instanceNo = 1;
97
+ let title = schemaObj.title;
98
+ let refSchema = this.getRefSchema(title, spec);
99
+ while (refSchema &&
100
+ !json_schema_compare_1.default(schemaObj, refSchema, {
101
+ ignore: ['description'],
102
+ })) {
103
+ title = `${schemaObj.title}${instanceNo++}`;
104
+ refSchema = this.getRefSchema(title, spec);
105
+ }
106
+ if (!refSchema) {
107
+ debug('Creating new component $ref with schema %j', schema);
108
+ this.patchRef(title, schema, spec);
109
+ }
110
+ debug('Creating link to $ref %j', title);
111
+ this.patchPath(title, parentPath, spec);
112
+ }
113
+ }
114
+ getRefSchema(name, spec) {
115
+ const schema = lodash_1.default.get(spec, ['components', 'schemas', name]);
116
+ return schema;
117
+ }
118
+ patchRef(name, value, spec) {
119
+ lodash_1.default.set(spec, ['components', 'schemas', name], value);
120
+ }
121
+ patchPath(name, path, spec) {
122
+ const patch = {
123
+ $ref: `#/components/schemas/${name}`,
124
+ };
125
+ lodash_1.default.set(spec, path, patch);
126
+ }
127
+ ifConsolidationCandidate(schema) {
128
+ // use title to discriminate references
129
+ return openapi_v3_1.isSchemaObject(schema) && schema.properties && schema.title
130
+ ? schema
131
+ : undefined;
132
+ }
133
+ isTraversable(schema) {
134
+ return schema && typeof schema === 'object' ? true : false;
135
+ }
136
+ };
137
+ ConsolidationEnhancer = tslib_1.__decorate([
138
+ core_1.bind(openapi_v3_1.asSpecEnhancer, { scope: core_1.BindingScope.SINGLETON }),
139
+ tslib_1.__param(0, core_1.inject(core_1.CoreBindings.APPLICATION_CONFIG, { optional: true })),
140
+ tslib_1.__metadata("design:paramtypes", [Object])
141
+ ], ConsolidationEnhancer);
142
+ return ConsolidationEnhancer;
143
+ })();
144
+ exports.ConsolidationEnhancer = ConsolidationEnhancer;
145
+ //# sourceMappingURL=consolidate.spec-enhancer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consolidate.spec-enhancer.js","sourceRoot":"","sources":["../../src/spec-enhancers/consolidate.spec-enhancer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { ApplicationMetadata } from '@loopback/core';
2
+ import { OASEnhancer, OpenApiSpec } from '@loopback/openapi-v3';
3
+ /**
4
+ * An OpenAPI spec enhancer to populate `info` with application metadata
5
+ * (package.json).
6
+ */
7
+ export declare class InfoSpecEnhancer implements OASEnhancer {
8
+ readonly pkg?: ApplicationMetadata | undefined;
9
+ name: string;
10
+ constructor(pkg?: ApplicationMetadata | undefined);
11
+ modifySpec(spec: OpenApiSpec): OpenApiSpec;
12
+ /**
13
+ * Parse package.json
14
+ * {@link https://docs.npmjs.com/files/package.json#people-fields-author-contributors | author}
15
+ *
16
+ * @param author - Author string or object from package.json
17
+ */
18
+ private static parseAuthor;
19
+ }
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ // Copyright IBM Corp. 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.InfoSpecEnhancer = void 0;
8
+ const tslib_1 = require("tslib");
9
+ const context_1 = require("@loopback/context");
10
+ const core_1 = require("@loopback/core");
11
+ const openapi_v3_1 = require("@loopback/openapi-v3");
12
+ const debug_1 = tslib_1.__importDefault(require("debug"));
13
+ const debug = debug_1.default('loopback:openapi:spec-enhancer:info');
14
+ /**
15
+ * An OpenAPI spec enhancer to populate `info` with application metadata
16
+ * (package.json).
17
+ */
18
+ let InfoSpecEnhancer = /** @class */ (() => {
19
+ var InfoSpecEnhancer_1;
20
+ let InfoSpecEnhancer = InfoSpecEnhancer_1 = class InfoSpecEnhancer {
21
+ constructor(pkg) {
22
+ this.pkg = pkg;
23
+ this.name = 'info';
24
+ }
25
+ modifySpec(spec) {
26
+ if (this.pkg == null) {
27
+ debug('Application metadata is not found. Skipping spec enhancing.');
28
+ return spec;
29
+ }
30
+ const contact = InfoSpecEnhancer_1.parseAuthor(this.pkg.author);
31
+ const patchSpec = {
32
+ info: {
33
+ title: this.pkg.name,
34
+ description: this.pkg.description,
35
+ version: this.pkg.version,
36
+ contact,
37
+ },
38
+ };
39
+ debug('Enhancing OpenAPI spec with %j', patchSpec);
40
+ return openapi_v3_1.mergeOpenAPISpec(spec, patchSpec);
41
+ }
42
+ /**
43
+ * Parse package.json
44
+ * {@link https://docs.npmjs.com/files/package.json#people-fields-author-contributors | author}
45
+ *
46
+ * @param author - Author string or object from package.json
47
+ */
48
+ static parseAuthor(author) {
49
+ var _a, _b, _c, _d, _e, _f;
50
+ let contact = {};
51
+ if (author == null) {
52
+ contact = {};
53
+ }
54
+ else if (typeof author === 'string') {
55
+ // "Barney Rubble <b@rubble.com> (http://barnyrubble.tumblr.com/)"
56
+ const emailRegex = /<([^<>]+)>/; // <email>
57
+ const urlRegex = /\(([^()]+)\)/; // (url)
58
+ const nameRegex = /([^<>()]+)/;
59
+ contact = {
60
+ name: (_b = (_a = nameRegex.exec(author)) === null || _a === void 0 ? void 0 : _a[1]) === null || _b === void 0 ? void 0 : _b.trim(),
61
+ email: (_d = (_c = emailRegex.exec(author)) === null || _c === void 0 ? void 0 : _c[1]) === null || _d === void 0 ? void 0 : _d.trim(),
62
+ url: (_f = (_e = urlRegex.exec(author)) === null || _e === void 0 ? void 0 : _e[1]) === null || _f === void 0 ? void 0 : _f.trim(),
63
+ };
64
+ }
65
+ else if (typeof author === 'object') {
66
+ const authorObj = author;
67
+ contact = {
68
+ name: authorObj.name,
69
+ email: authorObj.email,
70
+ url: authorObj.url,
71
+ };
72
+ }
73
+ // Remove undefined/null values
74
+ for (const p in contact) {
75
+ if (contact[p] == null)
76
+ delete contact[p];
77
+ }
78
+ return contact;
79
+ }
80
+ };
81
+ InfoSpecEnhancer = InfoSpecEnhancer_1 = tslib_1.__decorate([
82
+ context_1.bind(openapi_v3_1.asSpecEnhancer, { scope: context_1.BindingScope.SINGLETON }),
83
+ tslib_1.__param(0, context_1.inject(core_1.CoreBindings.APPLICATION_METADATA, { optional: true })),
84
+ tslib_1.__metadata("design:paramtypes", [Object])
85
+ ], InfoSpecEnhancer);
86
+ return InfoSpecEnhancer;
87
+ })();
88
+ exports.InfoSpecEnhancer = InfoSpecEnhancer;
89
+ //# sourceMappingURL=info.spec-enhancer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.spec-enhancer.js","sourceRoot":"","sources":["../../src/spec-enhancers/info.spec-enhancer.ts"],"names":[],"mappings":";AAAA,iDAAiD;AACjD,8BAA8B;AAC9B,+CAA+C;AAC/C,gEAAgE;;;;AAEhE,+CAM2B;AAC3B,yCAAiE;AACjE,qDAM8B;AAC9B,0DAAiC;AAEjC,MAAM,KAAK,GAAG,eAAY,CAAC,qCAAqC,CAAC,CAAC;AAElE;;;GAGG;AAEH;;IAAA,IAAa,gBAAgB,wBAA7B,MAAa,gBAAgB;QAG3B,YAEW,GAAyB;YAAzB,QAAG,GAAH,GAAG,CAAsB;YAJpC,SAAI,GAAG,MAAM,CAAC;QAKX,CAAC;QAEJ,UAAU,CAAC,IAAiB;YAC1B,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE;gBACpB,KAAK,CAAC,6DAA6D,CAAC,CAAC;gBACrE,OAAO,IAAI,CAAC;aACb;YACD,MAAM,OAAO,GAAkB,kBAAgB,CAAC,WAAW,CACzD,IAAI,CAAC,GAAG,CAAC,MAAM,CAChB,CAAC;YACF,MAAM,SAAS,GAAG;gBAChB,IAAI,EAAE;oBACJ,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI;oBACpB,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW;oBACjC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO;oBACzB,OAAO;iBACR;aACF,CAAC;YACF,KAAK,CAAC,gCAAgC,EAAE,SAAS,CAAC,CAAC;YACnD,OAAO,6BAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC3C,CAAC;QAED;;;;;WAKG;QACK,MAAM,CAAC,WAAW,CAAC,MAAiB;;YAC1C,IAAI,OAAO,GAAkB,EAAE,CAAC;YAChC,IAAI,MAAM,IAAI,IAAI,EAAE;gBAClB,OAAO,GAAG,EAAE,CAAC;aACd;iBAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;gBACrC,kEAAkE;gBAClE,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,UAAU;gBAC3C,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,QAAQ;gBACzC,MAAM,SAAS,GAAG,YAAY,CAAC;gBAC/B,OAAO,GAAG;oBACR,IAAI,cAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,0CAAG,CAAC,2CAAG,IAAI,EAAE;oBACzC,KAAK,cAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,0CAAG,CAAC,2CAAG,IAAI,EAAE;oBAC3C,GAAG,cAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,0CAAG,CAAC,2CAAG,IAAI,EAAE;iBACxC,CAAC;aACH;iBAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;gBACrC,MAAM,SAAS,GAAG,MAAoB,CAAC;gBACvC,OAAO,GAAG;oBACR,IAAI,EAAE,SAAS,CAAC,IAAc;oBAC9B,KAAK,EAAE,SAAS,CAAC,KAAe;oBAChC,GAAG,EAAE,SAAS,CAAC,GAAa;iBAC7B,CAAC;aACH;YACD,+BAA+B;YAC/B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;gBACvB,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI;oBAAE,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;aAC3C;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAA;IA9DY,gBAAgB;QAD5B,cAAI,CAAC,2BAAc,EAAE,EAAC,KAAK,EAAE,sBAAY,CAAC,SAAS,EAAC,CAAC;QAKjD,mBAAA,gBAAM,CAAC,mBAAY,CAAC,oBAAoB,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC,CAAA;;OAJnD,gBAAgB,CA8D5B;IAAD,uBAAC;KAAA;AA9DY,4CAAgB"}
@@ -0,0 +1,178 @@
1
+ import { HandlerContext, Request, Response } from '@loopback/express';
2
+ import { ReferenceObject, SchemaObject } from '@loopback/openapi-v3';
3
+ import ajv, { Ajv, FormatDefinition, KeywordDefinition } from 'ajv';
4
+ import { Options, OptionsJson, OptionsText, OptionsUrlencoded } from 'body-parser';
5
+ import { ResolvedRoute, RouteEntry } from './router';
6
+ /**
7
+ * Re-export types from `./middleware`
8
+ */
9
+ export * from '@loopback/express';
10
+ /**
11
+ * Find a route matching the incoming request.
12
+ * Throw an error when no route was found.
13
+ */
14
+ export declare type FindRoute = (request: Request) => ResolvedRoute;
15
+ /**
16
+ *
17
+ */
18
+ export declare type ParseParams = (request: Request, route: ResolvedRoute) => Promise<OperationArgs>;
19
+ /**
20
+ * Invokes a method defined in the Application Controller
21
+ *
22
+ * @param controller - Name of end-user's application controller
23
+ * class which defines the methods.
24
+ * @param method - Method name in application controller class
25
+ * @param args - Operation arguments for the method
26
+ * @returns OperationRetval Result from method invocation
27
+ */
28
+ export declare type InvokeMethod = (route: RouteEntry, args: OperationArgs) => Promise<OperationRetval>;
29
+ /**
30
+ * Send the operation response back to the client.
31
+ *
32
+ * @param response - The response the response to send to.
33
+ * @param result - The operation result to send.
34
+ */
35
+ export declare type Send = (response: Response, result: OperationRetval) => void;
36
+ /**
37
+ * Reject the request with an error.
38
+ *
39
+ * @param handlerContext - The context object holding HTTP request, response
40
+ * and other data needed to handle an incoming HTTP request.
41
+ * @param err - The error.
42
+ */
43
+ export declare type Reject = (handlerContext: HandlerContext, err: Error) => void;
44
+ /**
45
+ * Log information about a failed request.
46
+ *
47
+ * @param err - The error reported by request handling code.
48
+ * @param statusCode - Status code of the HTTP response
49
+ * @param request - The request that failed.
50
+ */
51
+ export declare type LogError = (err: Error, statusCode: number, request: Request) => void;
52
+ /**
53
+ * Cache for AJV schema validators
54
+ */
55
+ export declare type SchemaValidatorCache = WeakMap<SchemaObject | ReferenceObject, // First keyed by schema object
56
+ Map<string, ajv.ValidateFunction>>;
57
+ /**
58
+ * Options for AJV errors
59
+ */
60
+ export declare type AjvErrorOptions = {
61
+ keepErrors?: boolean;
62
+ singleError?: boolean;
63
+ };
64
+ /**
65
+ * Factory function for Ajv instances
66
+ */
67
+ export declare type AjvFactory = (options?: ajv.Options) => Ajv;
68
+ /**
69
+ * Ajv keyword definition with a name
70
+ */
71
+ export declare type AjvKeyword = KeywordDefinition & {
72
+ name: string;
73
+ };
74
+ /**
75
+ * Ajv format definition with a name
76
+ */
77
+ export declare type AjvFormat = FormatDefinition & {
78
+ name: string;
79
+ };
80
+ /**
81
+ * Options for request body validation using AJV
82
+ */
83
+ export interface RequestBodyValidationOptions extends ajv.Options {
84
+ /**
85
+ * Custom cache for compiled schemas by AJV. This setting makes it possible
86
+ * to skip the default cache.
87
+ */
88
+ compiledSchemaCache?: SchemaValidatorCache;
89
+ /**
90
+ * Enable additional AJV keywords from https://github.com/epoberezkin/ajv-keywords
91
+ * - `true`: Add all keywords from `ajv-keywords`
92
+ * - `string[]`: Add an array of keywords from `ajv-keywords`
93
+ */
94
+ ajvKeywords?: true | string[];
95
+ /**
96
+ * Enable custom error messages in JSON-Schema for AJV validator
97
+ * from https://github.com/epoberezkin/ajv-errors
98
+ * - `true`: Enable `ajv-errors`
99
+ * - `AjvErrorOptions`: Enable `ajv-errors` with options
100
+ */
101
+ ajvErrors?: true | AjvErrorOptions;
102
+ /**
103
+ * A function that transform the `ErrorObject`s reported by AJV.
104
+ * This could be used for error messages customization, localization, etc.
105
+ */
106
+ ajvErrorTransformer?: (errors: ajv.ErrorObject[]) => ajv.ErrorObject[];
107
+ /**
108
+ * A factory to create Ajv instance
109
+ */
110
+ ajvFactory?: (options: ajv.Options) => Ajv;
111
+ }
112
+ /**
113
+ * Options for request body parsing
114
+ * See https://github.com/expressjs/body-parser/#options
115
+ *
116
+ * Built-in parsers retrieve their own options from the request body parser
117
+ * options. The parser specific properties override common ones.
118
+ */
119
+ export interface RequestBodyParserOptions extends Options {
120
+ /**
121
+ * Options for json parser
122
+ */
123
+ json?: OptionsJson;
124
+ /**
125
+ * Options for urlencoded parser
126
+ */
127
+ urlencoded?: OptionsUrlencoded;
128
+ /**
129
+ * Options for text parser
130
+ */
131
+ text?: OptionsText;
132
+ /**
133
+ * Options for raw parser
134
+ */
135
+ raw?: Options;
136
+ /**
137
+ * Validation options for AJV, see https://github.com/epoberezkin/ajv#options
138
+ * This setting is global for all request body parsers and it cannot be
139
+ * overridden inside parser specific properties such as `json` or `text`.
140
+ */
141
+ validation?: RequestBodyValidationOptions;
142
+ /**
143
+ * Common options for all parsers
144
+ */
145
+ [name: string]: unknown;
146
+ }
147
+ export declare type PathParameterValues = {
148
+ [key: string]: any;
149
+ };
150
+ export declare type OperationArgs = any[];
151
+ /**
152
+ * Return value of a controller method (a function implementing an operation).
153
+ * This is a type alias for "any", used to distinguish
154
+ * operation results from other "any" typed values.
155
+ */
156
+ export declare type OperationRetval = any;
157
+ /**
158
+ * user profile to add in session
159
+ */
160
+ export interface SessionUserProfile {
161
+ provider: string;
162
+ token: string;
163
+ email: string;
164
+ [attribute: string]: any;
165
+ }
166
+ /**
167
+ * interface to set variables in user session
168
+ */
169
+ export interface Session {
170
+ profile: SessionUserProfile;
171
+ [key: string]: any;
172
+ }
173
+ /**
174
+ * extending express request type with a session field
175
+ */
176
+ export interface RequestWithSession extends Request {
177
+ session: Session;
178
+ }
package/dist/types.js ADDED
@@ -0,0 +1,12 @@
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
+ const tslib_1 = require("tslib");
8
+ /**
9
+ * Re-export types from `./middleware`
10
+ */
11
+ tslib_1.__exportStar(require("@loopback/express"), exports);
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,8BAA8B;AAC9B,+CAA+C;AAC/C,gEAAgE;;;AAahE;;GAEG;AACH,4DAAkC"}
@@ -0,0 +1,12 @@
1
+ import { Provider } from '@loopback/core';
2
+ import { AjvFactory, RequestBodyValidationOptions } from '../types';
3
+ /**
4
+ * A provider class that instantiate an AJV instance
5
+ */
6
+ export declare class AjvFactoryProvider implements Provider<AjvFactory> {
7
+ private options;
8
+ constructor(options?: RequestBodyValidationOptions);
9
+ private keywords;
10
+ private formats;
11
+ value(): AjvFactory;
12
+ }
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ // Copyright IBM Corp. 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.AjvFactoryProvider = void 0;
8
+ const tslib_1 = require("tslib");
9
+ const core_1 = require("@loopback/core");
10
+ const ajv_1 = tslib_1.__importDefault(require("ajv"));
11
+ const debug_1 = tslib_1.__importDefault(require("debug"));
12
+ const keys_1 = require("../keys");
13
+ const debug = debug_1.default('loopback:rest:ajv');
14
+ const ajvKeywords = require('ajv-keywords');
15
+ const ajvErrors = require('ajv-errors');
16
+ /**
17
+ * A provider class that instantiate an AJV instance
18
+ */
19
+ let AjvFactoryProvider = /** @class */ (() => {
20
+ let AjvFactoryProvider = class AjvFactoryProvider {
21
+ constructor(options = {}) {
22
+ this.options = options;
23
+ }
24
+ value() {
25
+ return options => {
26
+ var _a;
27
+ let validationOptions = {
28
+ ...this.options,
29
+ ...options,
30
+ };
31
+ // See https://github.com/epoberezkin/ajv#options
32
+ validationOptions = {
33
+ allErrors: true,
34
+ jsonPointers: true,
35
+ // nullable: support keyword "nullable" from Open API 3 specification.
36
+ nullable: true,
37
+ // Allow OpenAPI spec binary format
38
+ unknownFormats: ['binary'],
39
+ ...validationOptions,
40
+ };
41
+ debug('AJV options', validationOptions);
42
+ const ajvInst = new ajv_1.default(validationOptions);
43
+ if (validationOptions.ajvKeywords === true) {
44
+ ajvKeywords(ajvInst);
45
+ }
46
+ else if (Array.isArray(validationOptions.ajvKeywords)) {
47
+ ajvKeywords(ajvInst, validationOptions.ajvKeywords);
48
+ }
49
+ if (validationOptions.ajvErrors === true) {
50
+ ajvErrors(ajvInst);
51
+ }
52
+ else if (((_a = validationOptions.ajvErrors) === null || _a === void 0 ? void 0 : _a.constructor) === Object) {
53
+ ajvErrors(ajvInst, validationOptions.ajvErrors);
54
+ }
55
+ if (this.keywords) {
56
+ this.keywords.forEach(keyword => {
57
+ debug('Adding Ajv keyword %s', keyword.name);
58
+ ajvInst.addKeyword(keyword.name, keyword);
59
+ });
60
+ }
61
+ if (this.formats) {
62
+ this.formats.forEach(format => {
63
+ debug('Adding Ajv format %s', format.name);
64
+ ajvInst.addFormat(format.name, format);
65
+ });
66
+ }
67
+ return ajvInst;
68
+ };
69
+ }
70
+ };
71
+ tslib_1.__decorate([
72
+ core_1.inject(core_1.filterByTag(keys_1.RestTags.AJV_KEYWORD)),
73
+ tslib_1.__metadata("design:type", Array)
74
+ ], AjvFactoryProvider.prototype, "keywords", void 0);
75
+ tslib_1.__decorate([
76
+ core_1.inject(core_1.filterByTag(keys_1.RestTags.AJV_FORMAT)),
77
+ tslib_1.__metadata("design:type", Array)
78
+ ], AjvFactoryProvider.prototype, "formats", void 0);
79
+ AjvFactoryProvider = tslib_1.__decorate([
80
+ core_1.bind({ scope: core_1.BindingScope.SINGLETON }),
81
+ tslib_1.__param(0, core_1.inject(keys_1.RestBindings.REQUEST_BODY_PARSER_OPTIONS.deepProperty('validation'), { optional: true })),
82
+ tslib_1.__metadata("design:paramtypes", [Object])
83
+ ], AjvFactoryProvider);
84
+ return AjvFactoryProvider;
85
+ })();
86
+ exports.AjvFactoryProvider = AjvFactoryProvider;
87
+ //# sourceMappingURL=ajv-factory.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ajv-factory.provider.js","sourceRoot":"","sources":["../../src/validation/ajv-factory.provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { RequestBodyObject, SchemasObject } from '@loopback/openapi-v3';
2
+ import { RequestBody } from '..';
3
+ import { RequestBodyValidationOptions } from '../types';
4
+ /**
5
+ * Check whether the request body is valid according to the provided OpenAPI schema.
6
+ * The JSON schema is generated from the OpenAPI schema which is typically defined
7
+ * by `@requestBody()`.
8
+ * The validation leverages AJV schema validator.
9
+ * @param body - The request body parsed from an HTTP request.
10
+ * @param requestBodySpec - The OpenAPI requestBody specification defined in `@requestBody()`.
11
+ * @param globalSchemas - The referenced schemas generated from `OpenAPISpec.components.schemas`.
12
+ * @param options - Request body validation options for AJV
13
+ */
14
+ export declare function validateRequestBody(body: RequestBody, requestBodySpec?: RequestBodyObject, globalSchemas?: SchemasObject, options?: RequestBodyValidationOptions): Promise<void>;