@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 @@
1
+ {"version":3,"file":"openapi-path.js","sourceRoot":"","sources":["../../src/router/openapi-path.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,8BAA8B;AAC9B,+CAA+C;AAC/C,gEAAgE;;;AAEhE,mDAAqC;AAErC;;;;;;GAMG;AACH,MAAM,wBAAwB,GAAG,eAAe,CAAC;AACjD,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAEhD;;;GAGG;AACH,SAAgB,eAAe,CAAC,IAAI,GAAG,GAAG;IACxC,MAAM,MAAM,GAAG,sBAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YACxB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,EAAE,EAAE;gBAC3C,MAAM,IAAI,KAAK,CACb,2BAA2B,IAAI,kBAAkB,IAAI,kBAAkB,IAAI,GAAG,CAC/E,CAAC;aACH;YACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;gBAC5B,MAAM,IAAI,KAAK,CAAC,6CAA6C,IAAI,GAAG,CAAC,CAAC;aACvE;YACD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACxD,IAAI,CAAC,KAAK,EAAE;gBACV,MAAM,IAAI,KAAK,CACb,2BAA2B,KAAK,CAAC,MAAM,oBAAoB,IAAI,GAAG,CACnE,CAAC;aACH;YACD,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;gBAC5C,MAAM,IAAI,KAAK,CACb,wBAAwB,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,6BAA6B,IAAI,EAAE,CAC1F,CAAC;aACH;SACF;KACF;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AA5BD,0CA4BC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;AAC9C,CAAC;AAFD,4CAEC;AAED;;;GAGG;AACH,SAAgB,aAAa,CAAC,IAAY;IACxC,yEAAyE;IACzE,gBAAgB;IAChB,OAAO,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC7E,CAAC;AAJD,sCAIC"}
@@ -0,0 +1,23 @@
1
+ import { OperationObject, SchemasObject } from '@loopback/openapi-v3';
2
+ import { ResolvedRoute, RouteEntry } from '.';
3
+ import { RequestContext } from '../request-context';
4
+ import { OperationArgs, OperationRetval, PathParameterValues } from '../types';
5
+ export declare class RedirectRoute implements RouteEntry, ResolvedRoute {
6
+ readonly sourcePath: string;
7
+ readonly targetLocation: string;
8
+ readonly statusCode: number;
9
+ readonly pathParams: PathParameterValues;
10
+ readonly schemas: SchemasObject;
11
+ readonly verb: string;
12
+ readonly path: string;
13
+ readonly spec: OperationObject;
14
+ constructor(sourcePath: string, targetLocation: string, statusCode?: number);
15
+ invokeHandler({ response }: RequestContext, args: OperationArgs): Promise<OperationRetval>;
16
+ updateBindings(requestContext: RequestContext): void;
17
+ describe(): string;
18
+ /**
19
+ * type guard type checker for this class
20
+ * @param obj
21
+ */
22
+ static isRedirectRoute(obj: any): obj is RedirectRoute;
23
+ }
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ // Copyright IBM Corp. 2019,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.RedirectRoute = void 0;
8
+ class RedirectRoute {
9
+ constructor(sourcePath, targetLocation, statusCode = 303) {
10
+ this.sourcePath = sourcePath;
11
+ this.targetLocation = targetLocation;
12
+ this.statusCode = statusCode;
13
+ // ResolvedRoute API
14
+ this.pathParams = [];
15
+ this.schemas = {};
16
+ // RouteEntry implementation
17
+ this.verb = 'get';
18
+ this.spec = {
19
+ description: 'LoopBack Redirect route',
20
+ 'x-visibility': 'undocumented',
21
+ responses: {},
22
+ };
23
+ this.path = sourcePath;
24
+ }
25
+ async invokeHandler({ response }, args) {
26
+ response.redirect(this.statusCode, this.targetLocation);
27
+ }
28
+ updateBindings(requestContext) {
29
+ // no-op
30
+ }
31
+ describe() {
32
+ return `RedirectRoute from "${this.sourcePath}" to "${this.targetLocation}"`;
33
+ }
34
+ /**
35
+ * type guard type checker for this class
36
+ * @param obj
37
+ */
38
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
39
+ static isRedirectRoute(obj) {
40
+ const redirectOptions = obj;
41
+ if ((redirectOptions === null || redirectOptions === void 0 ? void 0 : redirectOptions.targetLocation) &&
42
+ redirectOptions.spec &&
43
+ redirectOptions.spec.description === 'LoopBack Redirect route') {
44
+ return true;
45
+ }
46
+ return false;
47
+ }
48
+ }
49
+ exports.RedirectRoute = RedirectRoute;
50
+ //# sourceMappingURL=redirect-route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirect-route.js","sourceRoot":"","sources":["../../src/router/redirect-route.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,8BAA8B;AAC9B,+CAA+C;AAC/C,gEAAgE;;;AAOhE,MAAa,aAAa;IAcxB,YACkB,UAAkB,EAClB,cAAsB,EACtB,aAAqB,GAAG;QAFxB,eAAU,GAAV,UAAU,CAAQ;QAClB,mBAAc,GAAd,cAAc,CAAQ;QACtB,eAAU,GAAV,UAAU,CAAc;QAhB1C,oBAAoB;QACX,eAAU,GAAwB,EAAE,CAAC;QACrC,YAAO,GAAkB,EAAE,CAAC;QAErC,4BAA4B;QACnB,SAAI,GAAW,KAAK,CAAC;QAErB,SAAI,GAAoB;YAC/B,WAAW,EAAE,yBAAyB;YACtC,cAAc,EAAE,cAAc;YAC9B,SAAS,EAAE,EAAE;SACd,CAAC;QAOA,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,EAAC,QAAQ,EAAiB,EAC1B,IAAmB;QAEnB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC1D,CAAC;IAED,cAAc,CAAC,cAA8B;QAC3C,QAAQ;IACV,CAAC;IAED,QAAQ;QACN,OAAO,uBAAuB,IAAI,CAAC,UAAU,SAAS,IAAI,CAAC,cAAc,GAAG,CAAC;IAC/E,CAAC;IAED;;;OAGG;IACH,8DAA8D;IAC9D,MAAM,CAAC,eAAe,CAAC,GAAQ;QAC7B,MAAM,eAAe,GAAG,GAAoB,CAAC;QAC7C,IACE,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,cAAc;YAC/B,eAAe,CAAC,IAAI;YACpB,eAAe,CAAC,IAAI,CAAC,WAAW,KAAK,yBAAyB,EAC9D;YACA,OAAO,IAAI,CAAC;SACb;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AArDD,sCAqDC"}
@@ -0,0 +1,25 @@
1
+ import { RestRouterOptions } from './rest-router';
2
+ import { ResolvedRoute, RouteEntry } from './route-entry';
3
+ import { BaseRouter } from './router-base';
4
+ import { Key } from 'path-to-regexp';
5
+ /**
6
+ * Route entry with path-to-regexp
7
+ */
8
+ interface RegExpRouteEntry extends RouteEntry {
9
+ regexp: RegExp;
10
+ keys: Key[];
11
+ }
12
+ /**
13
+ * Router implementation based on regexp matching
14
+ */
15
+ export declare class RegExpRouter extends BaseRouter {
16
+ private routes;
17
+ private _sorted;
18
+ private _sort;
19
+ constructor(options?: RestRouterOptions);
20
+ protected addRouteWithPathVars(route: RouteEntry): void;
21
+ protected findRouteWithPathVars(verb: string, path: string): ResolvedRoute | undefined;
22
+ protected listRoutesWithPathVars(): RegExpRouteEntry[];
23
+ private _buildPathParams;
24
+ }
25
+ export {};
@@ -0,0 +1,84 @@
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.RegExpRouter = void 0;
8
+ const tslib_1 = require("tslib");
9
+ const context_1 = require("@loopback/context");
10
+ const util_1 = require("util");
11
+ const keys_1 = require("../keys");
12
+ const openapi_path_1 = require("./openapi-path");
13
+ const route_entry_1 = require("./route-entry");
14
+ const route_sort_1 = require("./route-sort");
15
+ const router_base_1 = require("./router-base");
16
+ const path_to_regexp_1 = require("path-to-regexp");
17
+ const debug = require('debug')('loopback:rest:router:regexp');
18
+ /**
19
+ * Router implementation based on regexp matching
20
+ */
21
+ let RegExpRouter = /** @class */ (() => {
22
+ let RegExpRouter = class RegExpRouter extends router_base_1.BaseRouter {
23
+ constructor(options) {
24
+ super(options);
25
+ this.routes = [];
26
+ }
27
+ _sort() {
28
+ if (!this._sorted) {
29
+ this.routes.sort(route_sort_1.compareRoute);
30
+ this._sorted = true;
31
+ }
32
+ }
33
+ addRouteWithPathVars(route) {
34
+ const path = openapi_path_1.toExpressPath(route.path);
35
+ const keys = [];
36
+ const regexp = path_to_regexp_1.pathToRegexp(path, keys, {
37
+ strict: this.options.strict,
38
+ end: true,
39
+ });
40
+ const entry = Object.assign(route, { keys, regexp });
41
+ this.routes.push(entry);
42
+ this._sorted = false;
43
+ }
44
+ findRouteWithPathVars(verb, path) {
45
+ this._sort();
46
+ for (const r of this.routes) {
47
+ debug('trying endpoint %s', util_1.inspect(r, { depth: 5 }));
48
+ if (r.verb !== verb.toLowerCase()) {
49
+ debug(' -> verb mismatch');
50
+ continue;
51
+ }
52
+ const match = r.regexp.exec(path);
53
+ if (!match) {
54
+ debug(' -> path mismatch');
55
+ continue;
56
+ }
57
+ const pathParams = this._buildPathParams(r, match);
58
+ debug(' -> found with params: %j', pathParams);
59
+ return route_entry_1.createResolvedRoute(r, pathParams);
60
+ }
61
+ return undefined;
62
+ }
63
+ listRoutesWithPathVars() {
64
+ this._sort();
65
+ return this.routes;
66
+ }
67
+ _buildPathParams(route, pathMatch) {
68
+ const pathParams = {};
69
+ for (const ix in route.keys) {
70
+ const key = route.keys[ix];
71
+ const matchIndex = +ix + 1;
72
+ pathParams[key.name] = pathMatch[matchIndex];
73
+ }
74
+ return pathParams;
75
+ }
76
+ };
77
+ RegExpRouter = tslib_1.__decorate([
78
+ tslib_1.__param(0, context_1.inject(keys_1.RestBindings.ROUTER_OPTIONS, { optional: true })),
79
+ tslib_1.__metadata("design:paramtypes", [Object])
80
+ ], RegExpRouter);
81
+ return RegExpRouter;
82
+ })();
83
+ exports.RegExpRouter = RegExpRouter;
84
+ //# sourceMappingURL=regexp-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regexp-router.js","sourceRoot":"","sources":["../../src/router/regexp-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { Request } from '../types';
2
+ import { ResolvedRoute, RouteEntry } from './route-entry';
3
+ export interface RestRouter {
4
+ /**
5
+ * Add a route to the router
6
+ * @param route - A route entry
7
+ */
8
+ add(route: RouteEntry): void;
9
+ /**
10
+ * Find a matching route for the given http request
11
+ * @param request - Http request
12
+ * @returns The resolved route, if not found, `undefined` is returned
13
+ */
14
+ find(request: Request): ResolvedRoute | undefined;
15
+ /**
16
+ * List all routes
17
+ */
18
+ list(): RouteEntry[];
19
+ }
20
+ export declare type RestRouterOptions = {
21
+ /**
22
+ * When `true` it uses trailing slash to match. (default: `false`)
23
+ *
24
+ * 1. `strict` is true:
25
+ * - request `/orders` matches route `/orders` but not `/orders/`
26
+ * - request `/orders/` matches route `/orders/` but not `/orders`
27
+ *
28
+ * 2. `strict` is false (default)
29
+ * - request `/orders` matches route `/orders` first and falls back to `/orders/`
30
+ * - request `/orders/` matches route `/orders/` first and falls back to `/orders`
31
+ *
32
+ * See `strict routing` at http://expressjs.com/en/4x/api.html#app
33
+ */
34
+ strict?: boolean;
35
+ };
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
- // Copyright IBM Corp. 2017. All Rights Reserved.
2
+ // Copyright IBM Corp. 2018,2019. All Rights Reserved.
3
3
  // Node module: @loopback/rest
4
4
  // This file is licensed under the MIT License.
5
5
  // License text available at https://opensource.org/licenses/MIT
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- //# sourceMappingURL=internal-types.js.map
7
+ //# sourceMappingURL=rest-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-router.js","sourceRoot":"","sources":["../../src/router/rest-router.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,8BAA8B;AAC9B,+CAA+C;AAC/C,gEAAgE"}
@@ -0,0 +1,46 @@
1
+ import { Context } from '@loopback/context';
2
+ import { OperationObject, SchemasObject } from '@loopback/openapi-v3';
3
+ import { OperationArgs, OperationRetval, PathParameterValues } from '../types';
4
+ /**
5
+ * An entry in the routing table
6
+ */
7
+ export interface RouteEntry {
8
+ /**
9
+ * http verb
10
+ */
11
+ readonly verb: string;
12
+ /**
13
+ * http path
14
+ */
15
+ readonly path: string;
16
+ /**
17
+ * OpenAPI operation spec
18
+ */
19
+ readonly spec: OperationObject;
20
+ /**
21
+ * Update bindings for the request context
22
+ * @param requestContext
23
+ */
24
+ updateBindings(requestContext: Context): void;
25
+ /**
26
+ * A handler to invoke the resolved controller method
27
+ * @param requestContext
28
+ * @param args
29
+ */
30
+ invokeHandler(requestContext: Context, args: OperationArgs): Promise<OperationRetval>;
31
+ describe(): string;
32
+ }
33
+ /**
34
+ * A route with path parameters resolved
35
+ */
36
+ export interface ResolvedRoute extends RouteEntry {
37
+ readonly pathParams: PathParameterValues;
38
+ /**
39
+ * Server/application wide schemas shared by multiple routes,
40
+ * e.g. model schemas. This is a temporary workaround for
41
+ * missing support for $ref references, see
42
+ * https://github.com/strongloop/loopback-next/issues/435
43
+ */
44
+ readonly schemas: SchemasObject;
45
+ }
46
+ export declare function createResolvedRoute(route: RouteEntry, pathParams: PathParameterValues): ResolvedRoute;
@@ -0,0 +1,20 @@
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.createResolvedRoute = void 0;
8
+ function createResolvedRoute(route, pathParams) {
9
+ return Object.create(route, {
10
+ pathParams: {
11
+ writable: false,
12
+ value: pathParams,
13
+ },
14
+ schemas: {
15
+ value: {},
16
+ },
17
+ });
18
+ }
19
+ exports.createResolvedRoute = createResolvedRoute;
20
+ //# sourceMappingURL=route-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-entry.js","sourceRoot":"","sources":["../../src/router/route-entry.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,8BAA8B;AAC9B,+CAA+C;AAC/C,gEAAgE;;;AAyDhE,SAAgB,mBAAmB,CACjC,KAAiB,EACjB,UAA+B;IAE/B,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;QAC1B,UAAU,EAAE;YACV,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,UAAU;SAClB;QACD,OAAO,EAAE;YACP,KAAK,EAAE,EAAE;SACV;KACF,CAAC,CAAC;AACL,CAAC;AAbD,kDAaC"}
@@ -0,0 +1,7 @@
1
+ import { RouteEntry } from './route-entry';
2
+ /**
3
+ * Compare two routes by verb/path for sorting
4
+ * @param route1 - First route entry
5
+ * @param route2 - Second route entry
6
+ */
7
+ export declare function compareRoute(route1: Pick<RouteEntry, 'verb' | 'path'>, route2: Pick<RouteEntry, 'verb' | 'path'>): number;
@@ -0,0 +1,75 @@
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.compareRoute = void 0;
8
+ const path_to_regexp_1 = require("path-to-regexp");
9
+ /**
10
+ * Sorting order for http verbs
11
+ */
12
+ const HTTP_VERBS = {
13
+ post: 1,
14
+ put: 2,
15
+ patch: 3,
16
+ get: 4,
17
+ head: 5,
18
+ delete: 6,
19
+ options: 7,
20
+ };
21
+ /**
22
+ * Compare two routes by verb/path for sorting
23
+ * @param route1 - First route entry
24
+ * @param route2 - Second route entry
25
+ */
26
+ function compareRoute(route1, route2) {
27
+ // First check the path tokens
28
+ const path1 = route1.path.replace(/{([^}]*)}(\/|$)/g, ':$1$2');
29
+ const path2 = route2.path.replace(/{([^}]*)}(\/|$)/g, ':$1$2');
30
+ const tokensForPath1 = toTokens(path1);
31
+ const tokensForPath2 = toTokens(path2);
32
+ const length = tokensForPath1.length > tokensForPath2.length
33
+ ? tokensForPath1.length
34
+ : tokensForPath2.length;
35
+ for (let i = 0; i < length; i++) {
36
+ const token1 = tokensForPath1[i];
37
+ const token2 = tokensForPath2[i];
38
+ if (token1 === token2)
39
+ continue;
40
+ if (token1 === undefined)
41
+ return 1;
42
+ if (token2 === undefined)
43
+ return -1;
44
+ if (token1 < token2)
45
+ return -1;
46
+ if (token1 > token2)
47
+ return 1;
48
+ }
49
+ // Then check verb
50
+ const verb1 = HTTP_VERBS[route1.verb.toLowerCase()] || HTTP_VERBS.get;
51
+ const verb2 = HTTP_VERBS[route2.verb.toLowerCase()] || HTTP_VERBS.get;
52
+ if (verb1 !== verb2)
53
+ return verb1 - verb2;
54
+ return 0;
55
+ }
56
+ exports.compareRoute = compareRoute;
57
+ /**
58
+ *
59
+ * @param path - Parse a path template into tokens
60
+ */
61
+ function toTokens(path) {
62
+ const tokens = [];
63
+ path_to_regexp_1.parse(path).forEach(p => {
64
+ if (typeof p === 'string') {
65
+ // The string can be /orders/count
66
+ tokens.push(...p.split('/').filter(Boolean));
67
+ }
68
+ else {
69
+ // Use `{}` for wildcard as they are larger than any other ascii chars
70
+ tokens.push(`{}`);
71
+ }
72
+ });
73
+ return tokens;
74
+ }
75
+ //# sourceMappingURL=route-sort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-sort.js","sourceRoot":"","sources":["../../src/router/route-sort.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,8BAA8B;AAC9B,+CAA+C;AAC/C,gEAAgE;;;AAEhE,mDAA4C;AAG5C;;GAEG;AACH,MAAM,UAAU,GAA6B;IAC3C,IAAI,EAAE,CAAC;IACP,GAAG,EAAE,CAAC;IACN,KAAK,EAAE,CAAC;IACR,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;CACX,CAAC;AAEF;;;;GAIG;AACH,SAAgB,YAAY,CAC1B,MAAyC,EACzC,MAAyC;IAEzC,8BAA8B;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAC/D,MAAM,cAAc,GAAY,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,cAAc,GAAY,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEhD,MAAM,MAAM,GACV,cAAc,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM;QAC3C,CAAC,CAAC,cAAc,CAAC,MAAM;QACvB,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,MAAM;YAAE,SAAS;QAChC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC;QACnC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC,CAAC;QACpC,IAAI,MAAM,GAAG,MAAM;YAAE,OAAO,CAAC,CAAC,CAAC;QAC/B,IAAI,MAAM,GAAG,MAAM;YAAE,OAAO,CAAC,CAAC;KAC/B;IACD,kBAAkB;IAClB,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC;IACtE,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC;IACtE,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,KAAK,GAAG,KAAK,CAAC;IAC1C,OAAO,CAAC,CAAC;AACX,CAAC;AA7BD,oCA6BC;AAED;;;GAGG;AACH,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,sBAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACtB,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;YACzB,kCAAkC;YAClC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;SAC9C;aAAM;YACL,sEAAsE;YACtE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACnB;IACH,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { Request } from '../types';
2
+ import { ResolvedRoute, RouteEntry } from './route-entry';
3
+ import { RestRouter, RestRouterOptions } from './rest-router';
4
+ /**
5
+ * Base router implementation that only handles path without variables
6
+ */
7
+ export declare abstract class BaseRouter implements RestRouter {
8
+ protected options: RestRouterOptions;
9
+ /**
10
+ * A map to optimize matching for routes without variables in the path
11
+ */
12
+ protected routesWithoutPathVars: {
13
+ [key: string]: RouteEntry;
14
+ };
15
+ constructor(options?: RestRouterOptions);
16
+ protected getKeyForRoute(route: RouteEntry): string;
17
+ add(route: RouteEntry): void;
18
+ protected getKeyForRequest(request: Request): string;
19
+ find(request: Request): ResolvedRoute | undefined;
20
+ private findRoute;
21
+ list(): RouteEntry[];
22
+ /**
23
+ * Build a key for verb+path as `/<verb>/<path>`
24
+ * @param verb - HTTP verb/method
25
+ * @param path - URL path
26
+ */
27
+ protected getKey(verb: string, path: string): string;
28
+ /**
29
+ * Add a route with path variables
30
+ * @param route - Route
31
+ */
32
+ protected abstract addRouteWithPathVars(route: RouteEntry): void;
33
+ /**
34
+ * Find a route with path variables for a given request
35
+ * @param request - Http request
36
+ */
37
+ protected abstract findRouteWithPathVars(verb: string, path: string): ResolvedRoute | undefined;
38
+ /**
39
+ * List routes with path variables
40
+ */
41
+ protected abstract listRoutesWithPathVars(): RouteEntry[];
42
+ }
@@ -0,0 +1,101 @@
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.BaseRouter = void 0;
8
+ const openapi_path_1 = require("./openapi-path");
9
+ const route_entry_1 = require("./route-entry");
10
+ const route_sort_1 = require("./route-sort");
11
+ /**
12
+ * Base router implementation that only handles path without variables
13
+ */
14
+ class BaseRouter {
15
+ constructor(options = { strict: false }) {
16
+ this.options = options;
17
+ /**
18
+ * A map to optimize matching for routes without variables in the path
19
+ */
20
+ this.routesWithoutPathVars = {};
21
+ }
22
+ getKeyForRoute(route) {
23
+ return this.getKey(route.verb, route.path);
24
+ }
25
+ add(route) {
26
+ if (!openapi_path_1.getPathVariables(route.path)) {
27
+ const key = this.getKeyForRoute(route);
28
+ this.routesWithoutPathVars[key] = route;
29
+ }
30
+ else {
31
+ this.addRouteWithPathVars(route);
32
+ }
33
+ }
34
+ getKeyForRequest(request) {
35
+ return this.getKey(request.method, request.path);
36
+ }
37
+ find(request) {
38
+ if (this.options.strict) {
39
+ return this.findRoute(request.method, request.path);
40
+ }
41
+ // Non-strict mode
42
+ let path = request.path;
43
+ // First try the exact match
44
+ const route = this.findRoute(request.method, path);
45
+ if (route || path === '/')
46
+ return route;
47
+ if (path.endsWith('/')) {
48
+ // Fall back to the path without trailing slash
49
+ path = path.substring(0, path.length - 1);
50
+ }
51
+ else {
52
+ // Fall back to the path with trailing slash
53
+ path = path + '/';
54
+ }
55
+ return this.findRoute(request.method, path);
56
+ }
57
+ findRoute(verb, path) {
58
+ const key = this.getKey(verb, path);
59
+ const route = this.routesWithoutPathVars[key];
60
+ if (route)
61
+ return route_entry_1.createResolvedRoute(route, {});
62
+ else
63
+ return this.findRouteWithPathVars(verb, path);
64
+ }
65
+ list() {
66
+ let routes = Object.values(this.routesWithoutPathVars);
67
+ routes = routes.concat(this.listRoutesWithPathVars());
68
+ // Sort the routes so that they show up in OpenAPI spec in order
69
+ return routes.sort(route_sort_1.compareRoute);
70
+ }
71
+ /**
72
+ * Build a key for verb+path as `/<verb>/<path>`
73
+ * @param verb - HTTP verb/method
74
+ * @param path - URL path
75
+ */
76
+ getKey(verb, path) {
77
+ verb = normalizeVerb(verb);
78
+ path = normalizePath(path);
79
+ return `/${verb}${path}`;
80
+ }
81
+ }
82
+ exports.BaseRouter = BaseRouter;
83
+ /**
84
+ * Normalize http verb to lowercase
85
+ * @param verb - Http verb
86
+ */
87
+ function normalizeVerb(verb) {
88
+ // Use lower case, default to `get`
89
+ return (verb === null || verb === void 0 ? void 0 : verb.toLowerCase()) || 'get';
90
+ }
91
+ /**
92
+ * Normalize path to make sure it starts with `/`
93
+ * @param path - Path
94
+ */
95
+ function normalizePath(path) {
96
+ // Prepend `/` if needed
97
+ path = path || '/';
98
+ path = path.startsWith('/') ? path : `/${path}`;
99
+ return path;
100
+ }
101
+ //# sourceMappingURL=router-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-base.js","sourceRoot":"","sources":["../../src/router/router-base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { OpenApiSpec } from '@loopback/openapi-v3';
2
+ export declare type RouterSpec = Pick<OpenApiSpec, 'paths' | 'components' | 'tags'>;
3
+ export declare function assignRouterSpec(target: RouterSpec, additions: RouterSpec): void;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ // Copyright IBM Corp. 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.assignRouterSpec = void 0;
8
+ function assignRouterSpec(target, additions) {
9
+ if (additions.components) {
10
+ if (!target.components)
11
+ target.components = {};
12
+ for (const key in additions.components) {
13
+ if (!target.components[key])
14
+ target.components[key] = {};
15
+ Object.assign(target.components[key], additions.components[key]);
16
+ }
17
+ }
18
+ for (const url in additions.paths) {
19
+ if (!(url in target.paths))
20
+ target.paths[url] = {};
21
+ for (const verbOrKey in additions.paths[url]) {
22
+ // routes registered earlier takes precedence
23
+ if (verbOrKey in target.paths[url])
24
+ continue;
25
+ target.paths[url][verbOrKey] = additions.paths[url][verbOrKey];
26
+ }
27
+ }
28
+ if (additions.tags && additions.tags.length > 0) {
29
+ if (!target.tags)
30
+ target.tags = [];
31
+ for (const tag of additions.tags) {
32
+ // tags defined earlier take precedence
33
+ if (target.tags.some(t => t.name === tag.name))
34
+ continue;
35
+ target.tags.push(tag);
36
+ }
37
+ }
38
+ }
39
+ exports.assignRouterSpec = assignRouterSpec;
40
+ //# sourceMappingURL=router-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-spec.js","sourceRoot":"","sources":["../../src/router/router-spec.ts"],"names":[],"mappings":";AAAA,iDAAiD;AACjD,8BAA8B;AAC9B,+CAA+C;AAC/C,gEAAgE;;;AAMhE,SAAgB,gBAAgB,CAAC,MAAkB,EAAE,SAAqB;IACxE,IAAI,SAAS,CAAC,UAAU,EAAE;QACxB,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;QAC/C,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,UAAU,EAAE;YACtC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;SAClE;KACF;IAED,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,KAAK,EAAE;QACjC,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC;YAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACnD,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YAC5C,6CAA6C;YAC7C,IAAI,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC7C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;SAChE;KACF;IAED,IAAI,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI;YAAE,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACnC,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE;YAChC,uCAAuC;YACvC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YACzD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACvB;KACF;AACH,CAAC;AA1BD,4CA0BC"}
@@ -0,0 +1,32 @@
1
+ import { ControllerSpec, PathObject } from '@loopback/openapi-v3';
2
+ import { Request } from '../types';
3
+ import { ControllerClass, ControllerFactory } from './controller-route';
4
+ import { ExternalExpressRoutes } from './external-express-routes';
5
+ import { RestRouter } from './rest-router';
6
+ import { ResolvedRoute, RouteEntry } from './route-entry';
7
+ /**
8
+ * Routing table
9
+ */
10
+ export declare class RoutingTable {
11
+ private readonly _router;
12
+ private _externalRoutes?;
13
+ constructor(_router?: RestRouter, _externalRoutes?: ExternalExpressRoutes | undefined);
14
+ /**
15
+ * Register a controller as the route
16
+ * @param spec
17
+ * @param controllerCtor
18
+ * @param controllerFactory
19
+ */
20
+ registerController<T>(spec: ControllerSpec, controllerCtor: ControllerClass<T>, controllerFactory?: ControllerFactory<T>): void;
21
+ /**
22
+ * Register a route
23
+ * @param route - A route entry
24
+ */
25
+ registerRoute(route: RouteEntry): void;
26
+ describeApiPaths(): PathObject;
27
+ /**
28
+ * Map a request to a route
29
+ * @param request
30
+ */
31
+ find(request: Request): ResolvedRoute;
32
+ }