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