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