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