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