From 0e9f00099e45bcfc41da8f06abf074122c3da0c8 Mon Sep 17 00:00:00 2001 From: Rifa Achrinza <25147899+achrinza@users.noreply.github.com> Date: Fri, 21 Aug 2020 14:32:40 +0800 Subject: [PATCH] feat: moves msgpack bodyparser to standalone package Signed-off-by: Rifa Achrinza <25147899+achrinza@users.noreply.github.com> --- extensions/bodyparser-msgpack/.npmrc | 2 + extensions/bodyparser-msgpack/README.md | 3 + .../bodyparser-msgpack/package-lock.json | 101 ++++++++++++++++++ extensions/bodyparser-msgpack/package.json | 53 +++++++++ .../src/__tests__/acceptance/README.md | 1 + .../src/__tests__/integration/README.md | 1 + .../src/__tests__/unit/README.md | 1 + .../src/__tests__/unit/bodyparser.unit.ts | 91 ++++++++++++++++ .../bodyparser-msgpack/src/bodyparser.ts | 39 +++++++ .../bodyparser-msgpack/src/component.ts | 19 ++++ extensions/bodyparser-msgpack/src/index.ts | 8 ++ extensions/bodyparser-msgpack/src/keys.ts | 8 ++ extensions/bodyparser-msgpack/tsconfig.json | 23 ++++ packages/rest/package-lock.json | 54 ++++------ packages/rest/package.json | 2 - .../src/__tests__/unit/body-parser.unit.ts | 2 - .../rest/src/__tests__/unit/parser.unit.ts | 44 +------- .../src/body-parsers/body-parser.helpers.ts | 3 - .../rest/src/body-parsers/body-parser.json.ts | 4 +- .../src/body-parsers/body-parser.msgpack.ts | 30 ------ packages/rest/src/keys.ts | 7 -- packages/rest/src/rest.component.ts | 5 - tsconfig.json | 3 + 23 files changed, 374 insertions(+), 130 deletions(-) create mode 100644 extensions/bodyparser-msgpack/.npmrc create mode 100644 extensions/bodyparser-msgpack/README.md create mode 100644 extensions/bodyparser-msgpack/package-lock.json create mode 100644 extensions/bodyparser-msgpack/package.json create mode 100644 extensions/bodyparser-msgpack/src/__tests__/acceptance/README.md create mode 100644 extensions/bodyparser-msgpack/src/__tests__/integration/README.md create mode 100644 extensions/bodyparser-msgpack/src/__tests__/unit/README.md create mode 100644 extensions/bodyparser-msgpack/src/__tests__/unit/bodyparser.unit.ts create mode 100644 extensions/bodyparser-msgpack/src/bodyparser.ts create mode 100644 extensions/bodyparser-msgpack/src/component.ts create mode 100644 extensions/bodyparser-msgpack/src/index.ts create mode 100644 extensions/bodyparser-msgpack/src/keys.ts create mode 100644 extensions/bodyparser-msgpack/tsconfig.json delete mode 100644 packages/rest/src/body-parsers/body-parser.msgpack.ts diff --git a/extensions/bodyparser-msgpack/.npmrc b/extensions/bodyparser-msgpack/.npmrc new file mode 100644 index 000000000000..34fbbbb3f3e4 --- /dev/null +++ b/extensions/bodyparser-msgpack/.npmrc @@ -0,0 +1,2 @@ +package-lock=true +scripts-prepend-node-path=true diff --git a/extensions/bodyparser-msgpack/README.md b/extensions/bodyparser-msgpack/README.md new file mode 100644 index 000000000000..26122d66930b --- /dev/null +++ b/extensions/bodyparser-msgpack/README.md @@ -0,0 +1,3 @@ +# @loopback/bodyparser-msgpack + +[![LoopBack](https://github.com/strongloop/loopback-next/raw/master/docs/site/imgs/branding/Powered-by-LoopBack-Badge-(blue)-@2x.png)](http://loopback.io/) diff --git a/extensions/bodyparser-msgpack/package-lock.json b/extensions/bodyparser-msgpack/package-lock.json new file mode 100644 index 000000000000..bfa0caac1a13 --- /dev/null +++ b/extensions/bodyparser-msgpack/package-lock.json @@ -0,0 +1,101 @@ +{ + "name": "@loopback/bodyparser-msgpack", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/msgpack-lite": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@types/msgpack-lite/-/msgpack-lite-0.1.7.tgz", + "integrity": "sha512-OYPf2ExHl0TKuDn7M/356RDyCiqOQEs8f+SfePpbfHJJ7C8mqgp4ShgeUTuE8W7Tui2txbyVPiRiDPeK3D9PPA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "10.17.28", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.28.tgz", + "integrity": "sha512-dzjES1Egb4c1a89C7lKwQh8pwjYmlOAG9dW1pBgxEk57tMrLnssOfEthz8kdkNaBd7lIqQx7APm5+mZ619IiCQ==", + "dev": true + }, + "@types/type-is": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@types/type-is/-/type-is-1.6.3.tgz", + "integrity": "sha512-PNs5wHaNcBgCQG5nAeeZ7OvosrEsI9O4W2jAOO9BCCg4ux9ZZvH2+0iSCOIDBiKuQsiNS8CBlmfX9f5YBQ22cA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "event-lite": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/event-lite/-/event-lite-0.1.2.tgz", + "integrity": "sha512-HnSYx1BsJ87/p6swwzv+2v6B4X+uxUteoDfRxsAb1S1BePzQqOLevVmkdA15GHJVd9A9Ok6wygUR18Hu0YeV9g==" + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "int64-buffer": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-0.1.10.tgz", + "integrity": "sha1-J3siiofZWtd30HwTgyAiQGpHNCM=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "msgpack-lite": { + "version": "0.1.26", + "resolved": "https://registry.npmjs.org/msgpack-lite/-/msgpack-lite-0.1.26.tgz", + "integrity": "sha1-3TxQsm8FnyXn7e42REGDWOKprYk=", + "requires": { + "event-lite": "^0.1.1", + "ieee754": "^1.1.8", + "int64-buffer": "^0.1.9", + "isarray": "^1.0.0" + } + }, + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typescript": { + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", + "dev": true + } + } +} diff --git a/extensions/bodyparser-msgpack/package.json b/extensions/bodyparser-msgpack/package.json new file mode 100644 index 000000000000..2993c51c8f12 --- /dev/null +++ b/extensions/bodyparser-msgpack/package.json @@ -0,0 +1,53 @@ +{ + "name": "@loopback/bodyparser-msgpack", + "version": "0.0.1", + "description": "@loopback/bodyparser-msgpack", + "keywords": [ + "loopback-extension", + "loopback" + ], + "main": "dist/index.js", + "types": "dist/index.d.ts", + "engines": { + "node": ">=10.16" + }, + "scripts": { + "build": "lb-tsc", + "build:watch": "lb-tsc --watch", + "pretest": "npm run clean && npm run build", + "test": "lb-mocha \"dist/__tests__/**/*.js\"", + "clean": "lb-clean dist *.tsbuildinfo .eslintcache" + }, + "repository": { + "type": "git", + "url": "https://github.com/strongloop/loopback-next.git", + "directory": "extensions/bodyparser-msgpack" + }, + "author": "IBM Corp.", + "license": "MIT", + "files": [ + "README.md", + "dist", + "src", + "!*/__tests__" + ], + "dependencies": { + "@loopback/core": "^2.9.4", + "@loopback/rest": "^6.1.0", + "msgpack-lite": "^0.1.26", + "tslib": "^2.0.0", + "type-is": "^1.6.18" + }, + "devDependencies": { + "@loopback/build": "^6.2.1", + "@loopback/testlab": "^3.2.3", + "@types/msgpack-lite": "^0.1.7", + "@types/node": "^10.17.28", + "@types/type-is": "^1.6.3", + "typescript": "~3.9.7" + }, + "copyright.owner": "IBM Corp.", + "publishConfig": { + "access": "public" + } +} diff --git a/extensions/bodyparser-msgpack/src/__tests__/acceptance/README.md b/extensions/bodyparser-msgpack/src/__tests__/acceptance/README.md new file mode 100644 index 000000000000..5bb177829768 --- /dev/null +++ b/extensions/bodyparser-msgpack/src/__tests__/acceptance/README.md @@ -0,0 +1 @@ +# Acceptance tests diff --git a/extensions/bodyparser-msgpack/src/__tests__/integration/README.md b/extensions/bodyparser-msgpack/src/__tests__/integration/README.md new file mode 100644 index 000000000000..0ca287e97688 --- /dev/null +++ b/extensions/bodyparser-msgpack/src/__tests__/integration/README.md @@ -0,0 +1 @@ +# Integration tests diff --git a/extensions/bodyparser-msgpack/src/__tests__/unit/README.md b/extensions/bodyparser-msgpack/src/__tests__/unit/README.md new file mode 100644 index 000000000000..a0291f0699f9 --- /dev/null +++ b/extensions/bodyparser-msgpack/src/__tests__/unit/README.md @@ -0,0 +1 @@ +# Unit tests diff --git a/extensions/bodyparser-msgpack/src/__tests__/unit/bodyparser.unit.ts b/extensions/bodyparser-msgpack/src/__tests__/unit/bodyparser.unit.ts new file mode 100644 index 000000000000..b49ac6f6f0b3 --- /dev/null +++ b/extensions/bodyparser-msgpack/src/__tests__/unit/bodyparser.unit.ts @@ -0,0 +1,91 @@ +import {Context} from '@loopback/core'; +import { + createResolvedRoute, + OperationObject, + parseOperationArgs, + PathParameterValues, + Request, + RequestBodyObject, + RequestBodyParser, + Route, +} from '@loopback/rest'; +import { + expect, + ShotRequestOptions, + stubExpressContext, +} from '@loopback/testlab'; +import {encode} from 'msgpack-lite'; +import {MsgPackBodyParser} from '../..'; + +describe('MessagePack body parser', () => { + let requestBodyParser: RequestBodyParser; + beforeEach(givenRequestBodyParser); + + it('parses body parameter for MessagePack data', async () => { + const contentTypes = [ + 'application/msgpack', + 'application/x-msgpack', + 'application/subtype+msgpack', + ]; + + for (const contentType of contentTypes) { + const spec = givenOperationWithRequestBody({ + description: 'data', + content: { + [contentType]: { + schema: { + type: 'object', + properties: { + data: { + type: 'string', + }, + }, + }, + }, + }, + }); + + const req = givenRequest({ + url: '/', + headers: { + 'Content-Type': contentType, + }, + payload: encode({ + data: 'hello world', + }), + }); + + const route = givenResolvedRoute(spec); + + const args = await parseOperationArgs(req, route, requestBodyParser); + + expect(args).to.eql([{data: 'hello world'}]); + } + }); + + function givenOperationWithRequestBody(requestBody?: RequestBodyObject) { + return { + 'x-operation-name': 'testOp', + requestBody: requestBody, + responses: {}, + }; + } + + function givenRequest(options?: ShotRequestOptions): Request { + return stubExpressContext(options).request; + } + + function givenResolvedRoute( + spec: OperationObject, + pathParams: PathParameterValues = {}, + ) { + const route = new Route('get', '/', spec, () => {}); + return createResolvedRoute(route, pathParams); + } + + function givenRequestBodyParser() { + const options = {}; + const parsers = [new MsgPackBodyParser(options)]; + requestBodyParser = new RequestBodyParser(parsers, new Context()); + } +}); diff --git a/extensions/bodyparser-msgpack/src/bodyparser.ts b/extensions/bodyparser-msgpack/src/bodyparser.ts new file mode 100644 index 000000000000..12a53ca4cfbc --- /dev/null +++ b/extensions/bodyparser-msgpack/src/bodyparser.ts @@ -0,0 +1,39 @@ +import {inject} from '@loopback/core'; +import { + RawBodyParser, + Request, + RequestBody, + RequestBodyParserOptions, + RestBindings, +} from '@loopback/rest'; +import {decode} from 'msgpack-lite'; +import {is} from 'type-is'; + +export class MsgPackBodyParser extends RawBodyParser { + name = Symbol('msgpack'); + + constructor( + @inject(RestBindings.REQUEST_BODY_PARSER_OPTIONS, {optional: true}) + options: RequestBodyParserOptions = {}, + ) { + super(options); + } + + supports(mediaType: string) { + return !!is( + mediaType, + 'application/msgpack', + 'application/x-msgpack', + 'application/*+msgpack', + ); + } + + async parse(request: Request): Promise { + const result = await super.parse(request); + const body = decode(result.value); + + return { + value: body, + }; + } +} diff --git a/extensions/bodyparser-msgpack/src/component.ts b/extensions/bodyparser-msgpack/src/component.ts new file mode 100644 index 000000000000..e10b93a6fdad --- /dev/null +++ b/extensions/bodyparser-msgpack/src/component.ts @@ -0,0 +1,19 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/bodyparser-msgpack +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import {Component} from '@loopback/core'; +import {createBodyParserBinding} from '@loopback/rest'; +import {BODY_PARSER_MSGPACK_BINDINGS, MsgPackBodyParser} from '.'; + +export class LoopbackBodyparserMsgpackComponent implements Component { + constructor() {} + + bindings = [ + createBodyParserBinding( + MsgPackBodyParser, + BODY_PARSER_MSGPACK_BINDINGS.BODY_PARSER, + ), + ]; +} diff --git a/extensions/bodyparser-msgpack/src/index.ts b/extensions/bodyparser-msgpack/src/index.ts new file mode 100644 index 000000000000..6c64539f9efd --- /dev/null +++ b/extensions/bodyparser-msgpack/src/index.ts @@ -0,0 +1,8 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/bodyparser-msgpack +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +export * from './bodyparser'; +export * from './component'; +export * from './keys'; diff --git a/extensions/bodyparser-msgpack/src/keys.ts b/extensions/bodyparser-msgpack/src/keys.ts new file mode 100644 index 000000000000..0c5f336f90c2 --- /dev/null +++ b/extensions/bodyparser-msgpack/src/keys.ts @@ -0,0 +1,8 @@ +import {BindingKey} from '@loopback/core'; +import {BodyParser, RestBindings} from '@loopback/rest'; + +export namespace BODY_PARSER_MSGPACK_BINDINGS { + export const BODY_PARSER = BindingKey.create( + `${RestBindings.REQUEST_BODY_PARSER}.msgpack`, + ); +} diff --git a/extensions/bodyparser-msgpack/tsconfig.json b/extensions/bodyparser-msgpack/tsconfig.json new file mode 100644 index 000000000000..bdd4f3eb6b2a --- /dev/null +++ b/extensions/bodyparser-msgpack/tsconfig.json @@ -0,0 +1,23 @@ +{ + "$schema": "http://json.schemastore.org/tsconfig", + "extends": "@loopback/build/config/tsconfig.common.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "composite": true + }, + "include": [ + "src" + ], + "references": [ + { + "path": "../../packages/core/tsconfig.json" + }, + { + "path": "../../packages/rest/tsconfig.json" + }, + { + "path": "../../packages/testlab/tsconfig.json" + } + ] +} diff --git a/packages/rest/package-lock.json b/packages/rest/package-lock.json index b300c492d0c1..d6b35a92e130 100644 --- a/packages/rest/package-lock.json +++ b/packages/rest/package-lock.json @@ -22,9 +22,9 @@ }, "dependencies": { "@types/node": { - "version": "14.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.0.tgz", - "integrity": "sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA==" + "version": "14.0.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", + "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==" } } }, @@ -37,9 +37,9 @@ }, "dependencies": { "@types/node": { - "version": "14.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.0.tgz", - "integrity": "sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA==" + "version": "14.0.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", + "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==" } } }, @@ -79,9 +79,9 @@ }, "dependencies": { "@types/node": { - "version": "14.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.0.tgz", - "integrity": "sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA==" + "version": "14.0.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", + "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==" } } }, @@ -122,11 +122,6 @@ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==" }, - "@types/msgpack": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/msgpack/-/msgpack-0.0.30.tgz", - "integrity": "sha512-ehT/a2KQeQhMwMxvzvoZ/MFjwmOa9km5mL6G8XQPwF+z6DG1mJYhOvZACys9+Rd0zh0TxIHs1K3lKSImJGl0dg==" - }, "@types/multer": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.4.tgz", @@ -151,9 +146,9 @@ }, "dependencies": { "@types/node": { - "version": "14.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.0.tgz", - "integrity": "sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA==" + "version": "14.0.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", + "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==" } } }, @@ -185,9 +180,9 @@ }, "dependencies": { "@types/node": { - "version": "14.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.0.tgz", - "integrity": "sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA==" + "version": "14.0.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", + "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==" } } }, @@ -522,9 +517,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "ejs": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.5.tgz", - "integrity": "sha512-dldq3ZfFtgVTJMLjOe+/3sROTzALlL9E34V4/sDtUd/KlBSS0s6U1/+WPE1B4sj9CXHJpL1M6rhNJnc9Wbal9w==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.3.tgz", + "integrity": "sha512-wmtrUGyfSC23GC/B1SMv2ogAUgbQEtDmTIhfqielrG5ExIM9TP4UoYdi90jLF1aTcsWCJNEO0UrgKzP0y3nTSg==", "requires": { "jake": "^10.6.1" } @@ -967,14 +962,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "msgpack": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/msgpack/-/msgpack-1.0.3.tgz", - "integrity": "sha512-FX88+Pexuh+UItdqg68WhNPGPhqs57RlXAYyXNZ8eTQC/Tx5lzeIoxTxA2qAd7qU5a/crON5F0ADf4l6k2b7Jw==", - "requires": { - "nan": "^2.14.0" - } - }, "multer": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz", @@ -1002,11 +989,6 @@ } } }, - "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" - }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", diff --git a/packages/rest/package.json b/packages/rest/package.json index f589d65ae62a..24af6fa59d89 100644 --- a/packages/rest/package.json +++ b/packages/rest/package.json @@ -48,7 +48,6 @@ "js-yaml": "^3.14.0", "json-schema-compare": "^0.2.2", "lodash": "^4.17.20", - "msgpack": "^1.0.3", "on-finished": "^2.3.0", "path-to-regexp": "^6.1.0", "qs": "^6.9.4", @@ -67,7 +66,6 @@ "@types/js-yaml": "^3.12.5", "@types/json-schema-compare": "^0.2.0", "@types/lodash": "^4.14.159", - "@types/msgpack": "0.0.30", "@types/multer": "^1.4.4", "@types/node": "^10.17.28", "@types/on-finished": "^2.3.1", diff --git a/packages/rest/src/__tests__/unit/body-parser.unit.ts b/packages/rest/src/__tests__/unit/body-parser.unit.ts index 26831ddb2f19..7088d1993292 100644 --- a/packages/rest/src/__tests__/unit/body-parser.unit.ts +++ b/packages/rest/src/__tests__/unit/body-parser.unit.ts @@ -22,7 +22,6 @@ import { UrlEncodedBodyParser, } from '../..'; import {builtinParsers} from '../../body-parsers/body-parser.helpers'; -import {MsgPackBodyParser} from '../../body-parsers/body-parser.msgpack'; describe('body parser', () => { const defaultSchema = { @@ -213,7 +212,6 @@ describe('body parser', () => { new JsonBodyParser(options), new UrlEncodedBodyParser(options), new RawBodyParser(options), - new MsgPackBodyParser(), { name: 'xml', supports: mediaType => true, diff --git a/packages/rest/src/__tests__/unit/parser.unit.ts b/packages/rest/src/__tests__/unit/parser.unit.ts index 7a0b6940bee5..7ce0bad615f7 100644 --- a/packages/rest/src/__tests__/unit/parser.unit.ts +++ b/packages/rest/src/__tests__/unit/parser.unit.ts @@ -1,4 +1,4 @@ -// Copyright IBM Corp. 2019,2020. All Rights Reserved. +// Copyright IBM Corp. 2019. All Rights Reserved. // Node module: @loopback/rest // This file is licensed under the MIT License. // License text available at https://opensource.org/licenses/MIT @@ -15,7 +15,6 @@ import { ShotRequestOptions, stubExpressContext, } from '@loopback/testlab'; -import msgpack from 'msgpack'; import { createResolvedRoute, JsonBodyParser, @@ -257,47 +256,6 @@ describe('operationArgsParser', () => { expect(args).to.eql([{key1: ['value1', 'value2']}]); }); - it('parses body parameter for MessagePack data', async () => { - const contentTypes = [ - 'application/msgpack', - 'application/x-msgpack', - 'application/subtype+msgpack', - ]; - - for (const contentType of contentTypes) { - const req = givenRequest({ - url: '/', - headers: { - 'Content-Type': contentType, - }, - payload: msgpack.pack({ - data: 'hello world', - }), - }); - - const spec = givenOperationWithRequestBody({ - description: 'data', - content: { - [contentType]: { - schema: { - type: 'object', - properties: { - data: { - type: 'string', - }, - }, - }, - }, - }, - }); - const route = givenResolvedRoute(spec); - - const args = await parseOperationArgs(req, route, requestBodyParser); - - expect(args).to.eql({data: 'hello world'}); - } - }); - it('parses body parameter for text data', async () => { const req = givenRequest({ url: '/', diff --git a/packages/rest/src/body-parsers/body-parser.helpers.ts b/packages/rest/src/body-parsers/body-parser.helpers.ts index 0157bcde0adf..3d39b33954ce 100644 --- a/packages/rest/src/body-parsers/body-parser.helpers.ts +++ b/packages/rest/src/body-parsers/body-parser.helpers.ts @@ -125,7 +125,6 @@ export function getParserOptions( export namespace builtinParsers { export const json = Symbol('json'); - export const msgpack = Symbol('msgpack'); export const urlencoded = Symbol('urlencoded'); export const text = Symbol('text'); export const raw = Symbol('raw'); @@ -133,7 +132,6 @@ export namespace builtinParsers { export const names: (string | symbol)[] = [ json, - msgpack, urlencoded, text, raw, @@ -142,7 +140,6 @@ export namespace builtinParsers { export const mapping: {[name: string]: symbol} = { json, - msgpack, urlencoded, text, raw, diff --git a/packages/rest/src/body-parsers/body-parser.json.ts b/packages/rest/src/body-parsers/body-parser.json.ts index 8bb9a86d5089..0b81860c3c3d 100644 --- a/packages/rest/src/body-parsers/body-parser.json.ts +++ b/packages/rest/src/body-parsers/body-parser.json.ts @@ -7,15 +7,15 @@ import {inject} from '@loopback/core'; import {json} from 'body-parser'; import {is} from 'type-is'; import {RestBindings} from '../keys'; -import {sanitizeJsonParse} from '../parse-json'; import {Request, RequestBodyParserOptions} from '../types'; import { BodyParserMiddleware, - builtinParsers, getParserOptions, invokeBodyParserMiddleware, + builtinParsers, } from './body-parser.helpers'; import {BodyParser, RequestBody} from './types'; +import {sanitizeJsonParse} from '../parse-json'; export class JsonBodyParser implements BodyParser { name = builtinParsers.json; diff --git a/packages/rest/src/body-parsers/body-parser.msgpack.ts b/packages/rest/src/body-parsers/body-parser.msgpack.ts deleted file mode 100644 index 142d7296c23a..000000000000 --- a/packages/rest/src/body-parsers/body-parser.msgpack.ts +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright IBM Corp. 2020. All Rights Reserved. -// Node module: @loopback/rest -// This file is licensed under the MIT License. -// License text available at https://opensource.org/licenses/MIT - -import msgpack from 'msgpack'; -import {is} from 'type-is'; -import {Request} from '../types'; -import {builtinParsers} from './body-parser.helpers'; -import {BodyParser, RequestBody} from './types'; - -export class MsgPackBodyParser implements BodyParser { - name = builtinParsers.msgpack; - - constructor() {} - - supports(mediaType: string) { - return !!is( - mediaType, - 'application/msgpack', - 'application/x-msgpack', - 'application/*+msgpack', - ); - } - - async parse(request: Request): Promise { - const body = msgpack.unpack(request.body); - return {value: body}; - } -} diff --git a/packages/rest/src/keys.ts b/packages/rest/src/keys.ts index 9719b6c87bbe..3970f130363c 100644 --- a/packages/rest/src/keys.ts +++ b/packages/rest/src/keys.ts @@ -127,13 +127,6 @@ export namespace RestBindings { bodyParserBindingKey('JsonBodyParser'), ); - /** - * Binding key for request msgpack body parser - */ - export const REQUEST_BODY_PARSER_MSGPACK = BindingKey.create( - bodyParserBindingKey('MsgPackBodyParser'), - ); - /** * Binding key for request urlencoded body parser */ diff --git a/packages/rest/src/rest.component.ts b/packages/rest/src/rest.component.ts index ebada2e902e3..9bf46648300e 100644 --- a/packages/rest/src/rest.component.ts +++ b/packages/rest/src/rest.component.ts @@ -24,7 +24,6 @@ import { TextBodyParser, UrlEncodedBodyParser, } from './body-parsers'; -import {MsgPackBodyParser} from './body-parsers/body-parser.msgpack'; import {RawBodyParser} from './body-parsers/body-parser.raw'; import {RestBindings, RestTags} from './keys'; import { @@ -69,10 +68,6 @@ export class RestComponent implements Component { JsonBodyParser, RestBindings.REQUEST_BODY_PARSER_JSON, ), - createBodyParserBinding( - MsgPackBodyParser, - RestBindings.REQUEST_BODY_PARSER_MSGPACK, - ), createBodyParserBinding( TextBodyParser, RestBindings.REQUEST_BODY_PARSER_TEXT, diff --git a/tsconfig.json b/tsconfig.json index 9335eaa67e3b..e9e001368bc0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -88,6 +88,9 @@ { "path": "extensions/authentication-passport/tsconfig.json" }, + { + "path": "extensions/bodyparser-msgpack/tsconfig.json" + }, { "path": "extensions/context-explorer/tsconfig.json" },