Remove delegates, dead, is-generator-function, kia-convert and only
This commit is contained in:
parent
c9459b19ba
commit
28fee01c3f
7 changed files with 181 additions and 91 deletions
|
@ -5,7 +5,6 @@
|
||||||
* Module dependencies.
|
* Module dependencies.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const isGeneratorFunction = require('is-generator-function');
|
|
||||||
const debug = require('debug-ms')('koa:application');
|
const debug = require('debug-ms')('koa:application');
|
||||||
const onFinished = require('on-finished');
|
const onFinished = require('on-finished');
|
||||||
const response = require('./response');
|
const response = require('./response');
|
||||||
|
@ -18,9 +17,6 @@ const Emitter = require('events');
|
||||||
const util = require('util');
|
const util = require('util');
|
||||||
const Stream = require('stream');
|
const Stream = require('stream');
|
||||||
const http = require('http');
|
const http = require('http');
|
||||||
const only = require('only');
|
|
||||||
const convert = require('koa-convert');
|
|
||||||
const deprecate = require('depd')('koa');
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Expose `Application` class.
|
* Expose `Application` class.
|
||||||
|
@ -83,11 +79,11 @@ module.exports = class Application extends Emitter {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
toJSON() {
|
toJSON() {
|
||||||
return only(this, [
|
return {
|
||||||
'subdomainOffset',
|
subdomainOffset: this.subdomainOffset,
|
||||||
'proxy',
|
proxy: this.proxy,
|
||||||
'env'
|
env: this.env,
|
||||||
]);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -113,12 +109,6 @@ module.exports = class Application extends Emitter {
|
||||||
|
|
||||||
use(fn) {
|
use(fn) {
|
||||||
if (typeof fn !== 'function') throw new TypeError('middleware must be a function!');
|
if (typeof fn !== 'function') throw new TypeError('middleware must be a function!');
|
||||||
if (isGeneratorFunction(fn)) {
|
|
||||||
deprecate('Support for generators will be removed in v3. ' +
|
|
||||||
'See the documentation for examples of how to convert old middleware ' +
|
|
||||||
'https://github.com/koajs/koa/blob/master/docs/migration.md');
|
|
||||||
fn = convert(fn);
|
|
||||||
}
|
|
||||||
debug('use %s', fn._name || fn.name || '-');
|
debug('use %s', fn._name || fn.name || '-');
|
||||||
this.middleware.push(fn);
|
this.middleware.push(fn);
|
||||||
return this;
|
return this;
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
const util = require('util');
|
const util = require('util');
|
||||||
const createError = require('http-errors');
|
const createError = require('http-errors');
|
||||||
const httpAssert = require('http-assert');
|
const httpAssert = require('http-assert');
|
||||||
const delegate = require('delegates');
|
const delegate = require('./delegates');
|
||||||
const statuses = require('statuses');
|
const statuses = require('statuses');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
157
lib/delegates.js
Normal file
157
lib/delegates.js
Normal file
|
@ -0,0 +1,157 @@
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expose `Delegator`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = Delegator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize a delegator.
|
||||||
|
*
|
||||||
|
* @param {Object} proto
|
||||||
|
* @param {String} target
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function Delegator(proto, target) {
|
||||||
|
if (!(this instanceof Delegator)) return new Delegator(proto, target);
|
||||||
|
this.proto = proto;
|
||||||
|
this.target = target;
|
||||||
|
this.methods = [];
|
||||||
|
this.getters = [];
|
||||||
|
this.setters = [];
|
||||||
|
this.fluents = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Automatically delegate properties
|
||||||
|
* from a target prototype
|
||||||
|
*
|
||||||
|
* @param {Object} proto
|
||||||
|
* @param {object} targetProto
|
||||||
|
* @param {String} targetProp
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
Delegator.auto = function(proto, targetProto, targetProp){
|
||||||
|
var delegator = Delegator(proto, targetProp);
|
||||||
|
var properties = Object.getOwnPropertyNames(targetProto);
|
||||||
|
for (var i = 0; i < properties.length; i++) {
|
||||||
|
var property = properties[i];
|
||||||
|
var descriptor = Object.getOwnPropertyDescriptor(targetProto, property);
|
||||||
|
if (descriptor.get) {
|
||||||
|
delegator.getter(property);
|
||||||
|
}
|
||||||
|
if (descriptor.set) {
|
||||||
|
delegator.setter(property);
|
||||||
|
}
|
||||||
|
if (descriptor.hasOwnProperty('value')) { // could be undefined but writable
|
||||||
|
var value = descriptor.value;
|
||||||
|
if (value instanceof Function) {
|
||||||
|
delegator.method(property);
|
||||||
|
} else {
|
||||||
|
delegator.getter(property);
|
||||||
|
}
|
||||||
|
if (descriptor.writable) {
|
||||||
|
delegator.setter(property);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delegate method `name`.
|
||||||
|
*
|
||||||
|
* @param {String} name
|
||||||
|
* @return {Delegator} self
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
Delegator.prototype.method = function(name){
|
||||||
|
var proto = this.proto;
|
||||||
|
var target = this.target;
|
||||||
|
this.methods.push(name);
|
||||||
|
|
||||||
|
proto[name] = function(){
|
||||||
|
return this[target][name].apply(this[target], arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delegator accessor `name`.
|
||||||
|
*
|
||||||
|
* @param {String} name
|
||||||
|
* @return {Delegator} self
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
Delegator.prototype.access = function(name){
|
||||||
|
return this.getter(name).setter(name);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delegator getter `name`.
|
||||||
|
*
|
||||||
|
* @param {String} name
|
||||||
|
* @return {Delegator} self
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
Delegator.prototype.getter = function(name){
|
||||||
|
var proto = this.proto;
|
||||||
|
var target = this.target;
|
||||||
|
this.getters.push(name);
|
||||||
|
|
||||||
|
proto.__defineGetter__(name, function(){
|
||||||
|
return this[target][name];
|
||||||
|
});
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delegator setter `name`.
|
||||||
|
*
|
||||||
|
* @param {String} name
|
||||||
|
* @return {Delegator} self
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
Delegator.prototype.setter = function(name){
|
||||||
|
var proto = this.proto;
|
||||||
|
var target = this.target;
|
||||||
|
this.setters.push(name);
|
||||||
|
|
||||||
|
proto.__defineSetter__(name, function(val){
|
||||||
|
return this[target][name] = val;
|
||||||
|
});
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delegator fluent accessor
|
||||||
|
*
|
||||||
|
* @param {String} name
|
||||||
|
* @return {Delegator} self
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
Delegator.prototype.fluent = function (name) {
|
||||||
|
var proto = this.proto;
|
||||||
|
var target = this.target;
|
||||||
|
this.fluents.push(name);
|
||||||
|
|
||||||
|
proto[name] = function(val){
|
||||||
|
if ('undefined' != typeof val) {
|
||||||
|
this[target][name] = val;
|
||||||
|
return this;
|
||||||
|
} else {
|
||||||
|
return this[target][name];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
|
@ -12,7 +12,6 @@ const parse = require('parseurl');
|
||||||
const qs = require('querystring');
|
const qs = require('querystring');
|
||||||
const typeis = require('type-is');
|
const typeis = require('type-is');
|
||||||
const fresh = require('fresh');
|
const fresh = require('fresh');
|
||||||
const only = require('only');
|
|
||||||
const util = require('util');
|
const util = require('util');
|
||||||
|
|
||||||
const IP = Symbol('context#ip');
|
const IP = Symbol('context#ip');
|
||||||
|
@ -565,11 +564,11 @@ module.exports = {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
toJSON() {
|
toJSON() {
|
||||||
return only(this, [
|
return {
|
||||||
'method',
|
method: this.method,
|
||||||
'url',
|
url: this.url,
|
||||||
'header'
|
header: this.header,
|
||||||
]);
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,6 @@ const destroy = require('destroy');
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const extname = require('path').extname;
|
const extname = require('path').extname;
|
||||||
const vary = require('vary');
|
const vary = require('vary');
|
||||||
const only = require('only');
|
|
||||||
const util = require('util');
|
const util = require('util');
|
||||||
const encodeUrl = require('encodeurl');
|
const encodeUrl = require('encodeurl');
|
||||||
|
|
||||||
|
@ -308,6 +307,11 @@ module.exports = {
|
||||||
|
|
||||||
set type(orgType) {
|
set type(orgType) {
|
||||||
let type = orgType
|
let type = orgType
|
||||||
|
if (!type) {
|
||||||
|
this.remove('Content-Type');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// If full type is specified, pass it straight on.
|
// If full type is specified, pass it straight on.
|
||||||
// Otherwise we do some basic checking for most common
|
// Otherwise we do some basic checking for most common
|
||||||
// supported mime types.
|
// supported mime types.
|
||||||
|
@ -332,8 +336,10 @@ module.exports = {
|
||||||
this.set('Content-Type', 'image/jpeg');
|
this.set('Content-Type', 'image/jpeg');
|
||||||
} else if (type.indexOf('gif') >= 0) {
|
} else if (type.indexOf('gif') >= 0) {
|
||||||
this.set('Content-Type', 'image/gif');
|
this.set('Content-Type', 'image/gif');
|
||||||
} else if (type.indexOf('text')) {
|
} else if (type.indexOf('text') >= 0) {
|
||||||
this.set('Content-Type', 'text/plain; charset=utf-8');
|
this.set('Content-Type', 'text/plain; charset=utf-8');
|
||||||
|
} else if (type.indexOf('bin') >= 0) {
|
||||||
|
this.set('Content-Type', 'application/octet-stream');
|
||||||
} else {
|
} else {
|
||||||
this.remove('Content-Type');
|
this.remove('Content-Type');
|
||||||
}
|
}
|
||||||
|
@ -556,11 +562,11 @@ module.exports = {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
toJSON() {
|
toJSON() {
|
||||||
return only(this, [
|
return {
|
||||||
'status',
|
status: this.status,
|
||||||
'message',
|
message: this.message,
|
||||||
'header'
|
header: this.header,
|
||||||
]);
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -24,8 +24,6 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"content-disposition": "jharrilim/content-disposition#572383f",
|
"content-disposition": "jharrilim/content-disposition#572383f",
|
||||||
"debug-ms": "~4.1.2",
|
"debug-ms": "~4.1.2",
|
||||||
"delegates": "^1.0.0",
|
|
||||||
"depd": "^1.1.2",
|
|
||||||
"destroy": "^1.0.4",
|
"destroy": "^1.0.4",
|
||||||
"encodeurl": "^1.0.2",
|
"encodeurl": "^1.0.2",
|
||||||
"error-inject": "^1.0.0",
|
"error-inject": "^1.0.0",
|
||||||
|
@ -33,12 +31,9 @@
|
||||||
"fresh": "~0.5.2",
|
"fresh": "~0.5.2",
|
||||||
"http-assert": "^1.3.0",
|
"http-assert": "^1.3.0",
|
||||||
"http-errors": "^1.6.3",
|
"http-errors": "^1.6.3",
|
||||||
"is-generator-function": "^1.0.7",
|
|
||||||
"koa-compose": "^4.1.0",
|
"koa-compose": "^4.1.0",
|
||||||
"koa-convert": "^1.2.0",
|
|
||||||
"koa-is-json": "^1.0.0",
|
"koa-is-json": "^1.0.0",
|
||||||
"on-finished": "^2.3.0",
|
"on-finished": "^2.3.0",
|
||||||
"only": "~0.0.2",
|
|
||||||
"parseurl": "^1.3.2",
|
"parseurl": "^1.3.2",
|
||||||
"statuses": "^1.5.0",
|
"statuses": "^1.5.0",
|
||||||
"type-is": "^1.6.16",
|
"type-is": "^1.6.16",
|
||||||
|
|
|
@ -40,40 +40,6 @@ describe('app.use(fn)', () => {
|
||||||
assert.deepEqual(calls, [1, 2, 3, 4, 5, 6]);
|
assert.deepEqual(calls, [1, 2, 3, 4, 5, 6]);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should compose mixed middleware', async() => {
|
|
||||||
process.once('deprecation', () => {}); // silence deprecation message
|
|
||||||
const app = new Koa();
|
|
||||||
const calls = [];
|
|
||||||
|
|
||||||
app.use((ctx, next) => {
|
|
||||||
calls.push(1);
|
|
||||||
return next().then(() => {
|
|
||||||
calls.push(6);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
app.use(function * (next){
|
|
||||||
calls.push(2);
|
|
||||||
yield next;
|
|
||||||
calls.push(5);
|
|
||||||
});
|
|
||||||
|
|
||||||
app.use((ctx, next) => {
|
|
||||||
calls.push(3);
|
|
||||||
return next().then(() => {
|
|
||||||
calls.push(4);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const server = app.listen();
|
|
||||||
|
|
||||||
await request(server)
|
|
||||||
.get('/')
|
|
||||||
.expect(404);
|
|
||||||
|
|
||||||
assert.deepEqual(calls, [1, 2, 3, 4, 5, 6]);
|
|
||||||
});
|
|
||||||
|
|
||||||
// https://github.com/koajs/koa/pull/530#issuecomment-148138051
|
// https://github.com/koajs/koa/pull/530#issuecomment-148138051
|
||||||
it('should catch thrown errors in non-async functions', () => {
|
it('should catch thrown errors in non-async functions', () => {
|
||||||
const app = new Koa();
|
const app = new Koa();
|
||||||
|
@ -85,19 +51,6 @@ describe('app.use(fn)', () => {
|
||||||
.expect(404);
|
.expect(404);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should accept both generator and function middleware', () => {
|
|
||||||
process.once('deprecation', () => {}); // silence deprecation message
|
|
||||||
const app = new Koa();
|
|
||||||
|
|
||||||
app.use((ctx, next) => next());
|
|
||||||
app.use(function * (next){ this.body = 'generator'; });
|
|
||||||
|
|
||||||
return request(app.callback())
|
|
||||||
.get('/')
|
|
||||||
.expect(200)
|
|
||||||
.expect('generator');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should throw error for non function', () => {
|
it('should throw error for non function', () => {
|
||||||
const app = new Koa();
|
const app = new Koa();
|
||||||
|
|
||||||
|
@ -105,14 +58,4 @@ describe('app.use(fn)', () => {
|
||||||
assert.throws(() => app.use(v), /middleware must be a function!/);
|
assert.throws(() => app.use(v), /middleware must be a function!/);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should output deprecation message for generator functions', done => {
|
|
||||||
process.once('deprecation', message => {
|
|
||||||
assert(/Support for generators will be removed/.test(message));
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
|
|
||||||
const app = new Koa();
|
|
||||||
app.use(function * (){});
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue