From 8da961a7f02b98eb2ede176fa062ac5011d3c433 Mon Sep 17 00:00:00 2001 From: Evheniy Bystrov Date: Mon, 30 Oct 2017 15:46:17 +0200 Subject: [PATCH] updates --- .editorconfig | 10 ++ .eslintrc | 16 +--- .gitignore | 3 +- .travis.yml | 7 +- README.md | 58 +++++------- appveyor.yml | 6 +- index.js | 73 +++++++-------- package.json | 53 +++++------ tests/index.js | 248 ++++++++++++++++++++++++++++--------------------- 9 files changed, 252 insertions(+), 222 deletions(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..6fe4091 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true + +charset = utf-8 + +indent_style = space +indent_size = 2 diff --git a/.eslintrc b/.eslintrc index 5f78415..a3b9138 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,22 +1,12 @@ { - "extends": "eslint", + "extends": "airbnb-base", "env": { - "es6": true, "node": true, "mocha": true }, - "parserOptions": { - "ecmaVersion": 8, - "sourceType": "module" - }, "rules": { - "indent": ["error", 4, {"SwitchCase": 1}], - "quotes": ["error", "single"], "no-unused-expressions": 0, "no-underscore-dangle": 0, - "func-style": [ - "error", - "declaration", { "allowArrowFunctions": true } - ] + "no-param-reassign": 0 } -} \ No newline at end of file +} diff --git a/.gitignore b/.gitignore index 6420e3e..9f95eb0 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ coverage npm-debug.log node_modules .DS_Store -logs/app.error.log \ No newline at end of file +logs/app.error.log +package-lock.json diff --git a/.travis.yml b/.travis.yml index 0a7a3c2..d7b77ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,7 @@ language: node_js node_js: - - "7.6" - - "7.7" + - "7" + - "8" script: - - npm run lint - npm run test - - npm run report \ No newline at end of file + - npm run report diff --git a/README.md b/README.md index d5181d4..85240a7 100644 --- a/README.md +++ b/README.md @@ -22,53 +22,45 @@ ## How to install - npm i -S yeps-method-override + npm i -S yeps-method-override ## How to use ### Header x-http-method-override or in body request const App = require('yeps'); - const app = new App(); + const Router = require('yeps-router'); + + const error = require('yeps-error'); + const logger = require('yeps-logger'); + const server = require('yeps-server'); const bodyParser = require('yeps-bodyparser'); const methodOverride = require('yeps-method-override'); - app.then(bodyParser()); - app.then(methodOverride()); + const app = new App(); + const router = new Router(); - app.then(async ctx => { - + app.all([ + error(), + logger(), + bodyParser(), + methodOverride(), + ]); + + app.then(async (ctx) => { ctx.res.statusCode = 200; ctx.res.end(JSON.stringify(ctx.req.method)); - }); -### Express body parser - - const wrapper = require('yeps-express-wrapper'); - const expressBodyParser = require('body-parser'); - - app.then(wrapper(expressBodyParser.json())); - app.then(methodOverride()); - - app.then(async ctx => { - - ctx.res.statusCode = 200; - ctx.res.end(JSON.stringify(ctx.req.method)); - + router.get('/').then(async (ctx) => { + ctx.res.statusCode = 200; + ctx.res.end('homepage'); }); - -## Links + + app.then(router.resolve()); + + server.createHttpServer(app); + -* [yeps](https://github.com/evheniy/yeps) - YEPS -* [yeps-promisify](https://github.com/evheniy/yeps-promisify) - YEPS kernel -* [yeps-benchmark](https://github.com/evheniy/yeps-benchmark) - performance comparison koa2, express and node http -* [yeps-router](https://github.com/evheniy/yeps-router) - YEPS promise based router -* [yeps-error](https://github.com/evheniy/yeps-error) - YEPS 404/500 error handler -* [yeps-redis](https://github.com/evheniy/yeps-redis) - YEPS promise based redis client -* [yeps-mysql](https://github.com/evheniy/yeps-mysql) - YEPS promise based mysql client -* [yeps-boilerplate](https://github.com/evheniy/yeps-boilerplate) - YEPS app boilerplate -* [yeps-express-wrapper](https://github.com/evheniy/yeps-express-wrapper) - YEPS express wrapper -* [yeps-cors](https://github.com/evheniy/yeps-cors) - YEPS CORS -* [yeps-bodyparser](https://github.com/evheniy/yeps-bodyparser) - YEPS body parser \ No newline at end of file +#### [YEPS documentation](http://yeps.info/) diff --git a/appveyor.yml b/appveyor.yml index 1a89ce0..9101e3f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,13 +1,13 @@ environment: matrix: - - nodejs_version: "7.7" + - nodejs_version: "8" install: - ps: Install-Product node $env:nodejs_version - npm install test_script: - node --version - npm --version - - npm run lint + - npm run test:lint - npm run test:security - npm run test:code -build: off \ No newline at end of file +build: off diff --git a/index.js b/index.js index 54c81e8..aaad3e5 100644 --- a/index.js +++ b/index.js @@ -4,41 +4,40 @@ const methods = require('methods'); const methodExists = method => methods.includes(method.toLowerCase()); -module.exports = () => async context => { - - debug('Method override'); - - let method = context.req.method; - - debug('Original method: %s', method); - - // wrapper - if ( - context.req.body - && context.req.body._method - && methodExists(context.req.body._method) - ) { - method = context.req.body._method.toUpperCase(); - } - - // body parser - if ( - context.request - && context.request.body - && context.request.body._method - && methodExists(context.request.body._method) - ) { - method = context.request.body._method.toUpperCase(); - } - - // header support - const header = context.req.headers['x-http-method-override']; - - if (header && methodExists(header)) { - method = header.toUpperCase(); - } - - context.req.method = method; - - debug('New method: %s', method); +module.exports = () => async (context) => { + debug('Method override'); + + let { method } = context.req; + + debug('Original method: %s', method); + + // wrapper + if ( + context.req.body + && context.req.body._method + && methodExists(context.req.body._method) + ) { + method = context.req.body._method.toUpperCase(); + } + + // body parser + if ( + context.request + && context.request.body + && context.request.body._method + && methodExists(context.request.body._method) + ) { + method = context.request.body._method.toUpperCase(); + } + + // header support + const header = context.req.headers['x-http-method-override']; + + if (header && methodExists(header)) { + method = header.toUpperCase(); + } + + context.req.method = method; + + debug('New method: %s', method); }; diff --git a/package.json b/package.json index 93af3e4..5c1b06a 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,16 @@ { "name": "yeps-method-override", - "version": "1.0.1", + "version": "1.0.2", "description": "YEPS Method Override", "main": "index.js", "scripts": { - "lint": "./node_modules/.bin/npm-run-all --parallel lint:**", - "lint:js": "./node_modules/.bin/eslint index.js tests", - "test": "./node_modules/.bin/npm-run-all --parallel test:**", - "test:security": "./node_modules/.bin/nsp check", - "test:code": "node ./node_modules/mocha/bin/_mocha tests --recursive", - "test:coverage": "./node_modules/.bin/istanbul cover ./node_modules/mocha/bin/_mocha -- tests --recursive", - "report": "cat ./coverage/lcov.info | ./node_modules/.bin/coveralls", - "clear": "./node_modules/.bin/rimraf coverage", + "test": "npm-run-all test:**", + "test:lint": "eslint index.js tests", + "test:security": "nsp check", + "test:code": "mocha tests --recursive", + "test:coverage": "istanbul cover _mocha -- tests --recursive", + "report": "cat ./coverage/lcov.info | coveralls", + "clear": "rimraf coverage", "precommit": "npm run lint && npm test", "prepush": "npm run lint && npm test" }, @@ -50,26 +49,28 @@ "node": ">=7.6.0" }, "devDependencies": { - "body-parser": "^1.17.1", - "chai": "^3.5.0", + "body-parser": "^1.18.2", + "chai": "^4.1.2", "chai-http": "^3.0.0", - "coveralls": "^2.11.16", - "debug": "^2.6.1", - "eslint": "^3.15.0", - "eslint-config-eslint": "^3.0.0", - "husky": "^0.13.1", + "coveralls": "^3.0.0", + "eslint": "^4.10.0", + "eslint-config-airbnb-base": "^12.1.0", + "eslint-plugin-import": "^2.8.0", + "husky": "^0.14.3", "istanbul": "^1.1.0-alpha.1", - "mocha": "^3.2.0", - "mocha-lcov-reporter": "^1.2.0", - "npm-run-all": "^4.0.1", - "nsp": "^2.6.2", - "promise-pause-timeout": "^1.0.0", - "rimraf": "^2.5.4", - "sinon": "^1.17.7" + "mocha": "^4.0.1", + "mocha-lcov-reporter": "^1.3.0", + "npm-run-all": "^4.1.1", + "nsp": "^3.0.0", + "rimraf": "^2.6.2", + "yeps": "^1.0.1", + "yeps-bodyparser": "^1.1.1", + "yeps-express-wrapper": "^1.0.1", + "yeps-router": "^1.1.2", + "yeps-server": "^1.1.0" }, "dependencies": { - "yeps": "^1.0.0", - "yeps-bodyparser": "^1.0.0", - "yeps-express-wrapper": "^1.0.0" + "debug": "^3.1.0", + "methods": "^1.1.2" } } diff --git a/tests/index.js b/tests/index.js index de96579..038dae6 100644 --- a/tests/index.js +++ b/tests/index.js @@ -1,155 +1,193 @@ const App = require('yeps'); const chai = require('chai'); const chaiHttp = require('chai-http'); -const http = require('http'); +const srv = require('yeps-server'); +const Router = require('yeps-router'); const bodyParser = require('yeps-bodyparser'); const methodOverride = require('..'); -const expect = chai.expect; + const wrapper = require('yeps-express-wrapper'); const expressBodyParser = require('body-parser'); +const { expect } = chai; + chai.use(chaiHttp); let app; +let server; describe('YEPS method override test', async () => { + beforeEach(() => { + app = new App(); + server = srv.createHttpServer(app); + }); + + afterEach(() => { + server.close(); + }); + + it('should test origin method', async () => { + let isTestFinished1 = false; + let isTestFinished2 = false; - beforeEach(() => { - app = new App(); + app.then(async (ctx) => { + isTestFinished1 = true; + + ctx.res.statusCode = 200; + ctx.res.end(ctx.req.method); }); - it('should test origin method', async () => { - let isTestFinished1 = false; - let isTestFinished2 = false; + await chai.request(server) + .get('/') + .send() + .then((res) => { + expect(res).to.have.status(200); + expect(res.text).to.be.equal('GET'); + isTestFinished2 = true; + }); + + expect(isTestFinished1).is.true; + expect(isTestFinished2).is.true; + }); - app.then(async ctx => { - isTestFinished1 = true; + it('should test yeps body parser json', async () => { + let isTestFinished1 = false; + let isTestFinished2 = false; - ctx.res.statusCode = 200; - ctx.res.end(ctx.req.method); - }); + app.then(bodyParser()); + app.then(methodOverride()); - await chai.request(http.createServer(app.resolve())) - .get('/') - .send() - .then(res => { - expect(res).to.have.status(200); - expect(res.text).to.be.equal('GET'); - isTestFinished2 = true; - }); + app.then(async (ctx) => { + isTestFinished1 = true; - expect(isTestFinished1).is.true; - expect(isTestFinished2).is.true; + ctx.res.statusCode = 200; + ctx.res.end(ctx.req.method); }); - it('should test yeps body parser json', async () => { - let isTestFinished1 = false; - let isTestFinished2 = false; + await chai.request(server) + .get('/') + .type('json') + .send({ _method: 'post' }) + .then((res) => { + expect(res).to.have.status(200); + expect(res.text).to.be.equal('POST'); + isTestFinished2 = true; + }); - app.then(bodyParser()); - app.then(methodOverride()); + expect(isTestFinished1).is.true; + expect(isTestFinished2).is.true; + }); - app.then(async ctx => { - isTestFinished1 = true; + it('should test yeps body parser', async () => { + let isTestFinished1 = false; + let isTestFinished2 = false; - ctx.res.statusCode = 200; - ctx.res.end(ctx.req.method); - }); + app.then(bodyParser()); + app.then(methodOverride()); - await chai.request(http.createServer(app.resolve())) - .get('/') - .type('json') - .send({ _method: 'post'}) - .then(res => { - expect(res).to.have.status(200); - expect(res.text).to.be.equal('POST'); - isTestFinished2 = true; - }); + app.then(async (ctx) => { + isTestFinished1 = true; - expect(isTestFinished1).is.true; - expect(isTestFinished2).is.true; + ctx.res.statusCode = 200; + ctx.res.end(ctx.req.method); }); - it('should test yeps body parser', async () => { - let isTestFinished1 = false; - let isTestFinished2 = false; + await chai.request(server) + .get('/') + .type('form') + .send({ _method: 'post' }) + .then((res) => { + expect(res).to.have.status(200); + expect(res.text).to.be.equal('POST'); + isTestFinished2 = true; + }); - app.then(bodyParser()); - app.then(methodOverride()); + expect(isTestFinished1).is.true; + expect(isTestFinished2).is.true; + }); - app.then(async ctx => { - isTestFinished1 = true; + it('should test express body parser json', async () => { + let isTestFinished1 = false; + let isTestFinished2 = false; - ctx.res.statusCode = 200; - ctx.res.end(ctx.req.method); - }); + app.then(wrapper(expressBodyParser.json())); + app.then(methodOverride()); - await chai.request(http.createServer(app.resolve())) - .get('/') - .type('form') - .send({ _method: 'post'}) - .then(res => { - expect(res).to.have.status(200); - expect(res.text).to.be.equal('POST'); - isTestFinished2 = true; - }); + app.then(async (ctx) => { + isTestFinished1 = true; - expect(isTestFinished1).is.true; - expect(isTestFinished2).is.true; + ctx.res.statusCode = 200; + ctx.res.end(ctx.req.method); }); - it('should test express body parser json', async () => { - let isTestFinished1 = false; - let isTestFinished2 = false; + await chai.request(server) + .get('/') + .type('json') + .send({ _method: 'post' }) + .then((res) => { + expect(res).to.have.status(200); + expect(res.text).to.be.equal('POST'); + isTestFinished2 = true; + }); - app.then(wrapper(expressBodyParser.json())); - app.then(methodOverride()); + expect(isTestFinished1).is.true; + expect(isTestFinished2).is.true; + }); - app.then(async ctx => { - isTestFinished1 = true; + it('should test header', async () => { + let isTestFinished1 = false; + let isTestFinished2 = false; - ctx.res.statusCode = 200; - ctx.res.end(ctx.req.method); - }); + app.then(methodOverride()); - await chai.request(http.createServer(app.resolve())) - .get('/') - .type('json') - .send({ _method: 'post'}) - .then(res => { - expect(res).to.have.status(200); - expect(res.text).to.be.equal('POST'); - isTestFinished2 = true; - }); + app.then(async (ctx) => { + isTestFinished1 = true; - expect(isTestFinished1).is.true; - expect(isTestFinished2).is.true; + ctx.res.statusCode = 200; + ctx.res.end(ctx.req.method); }); - it('should test header', async () => { - let isTestFinished1 = false; - let isTestFinished2 = false; + await chai.request(server) + .get('/') + .set('x-http-method-override', 'post') + .send({ _method: 'post' }) + .then((res) => { + expect(res).to.have.status(200); + expect(res.text).to.be.equal('POST'); + isTestFinished2 = true; + }); + + expect(isTestFinished1).is.true; + expect(isTestFinished2).is.true; + }); - app.then(methodOverride()); + it('should test yeps router', async () => { + let isTestFinished1 = false; + let isTestFinished2 = false; - app.then(async ctx => { - isTestFinished1 = true; + app.then(methodOverride()); - ctx.res.statusCode = 200; - ctx.res.end(ctx.req.method); - }); + const router = new Router(); - await chai.request(http.createServer(app.resolve())) - .get('/') - .set('x-http-method-override', 'post') - .send({ _method: 'post'}) - .then(res => { - expect(res).to.have.status(200); - expect(res.text).to.be.equal('POST'); - isTestFinished2 = true; - }); + router.post('/').then(async (ctx) => { + isTestFinished1 = true; - expect(isTestFinished1).is.true; - expect(isTestFinished2).is.true; + ctx.res.statusCode = 200; + ctx.res.end(ctx.req.method); }); + app.then(router.resolve()); + + await chai.request(server) + .get('/') + .set('x-http-method-override', 'post') + .send({ _method: 'post' }) + .then((res) => { + expect(res).to.have.status(200); + expect(res.text).to.be.equal('POST'); + isTestFinished2 = true; + }); + + expect(isTestFinished1).is.true; + expect(isTestFinished2).is.true; + }); });