koa 3.0.0-alpha.1 → 3.0.0-alpha.3

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/Readme.md CHANGED
@@ -17,7 +17,7 @@
17
17
 
18
18
  ## Installation
19
19
 
20
- Koa requires __node v12.17.0__ or higher for ES2015 and async function support.
20
+ Koa requires __node v18.0.0__ or higher for ES2015 and async function support.
21
21
 
22
22
  ```
23
23
  $ npm install koa
@@ -1,4 +1,3 @@
1
-
2
1
  'use strict'
3
2
 
4
3
  /**
@@ -17,7 +16,7 @@ const Emitter = require('events')
17
16
  const util = require('util')
18
17
  const Stream = require('stream')
19
18
  const http = require('http')
20
- const only = require('only')
19
+ const only = require('./only.js')
21
20
  const { HttpError } = require('http-errors')
22
21
 
23
22
  /** @typedef {typeof import ('./context') & {
@@ -55,6 +54,8 @@ module.exports = class Application extends Emitter {
55
54
  * @param {number} [options.subdomainOffset] Subdomain offset
56
55
  * @param {string} [options.proxyIpHeader] Proxy IP header, defaults to X-Forwarded-For
57
56
  * @param {number} [options.maxIpsCount] Max IPs read from proxy IP header, default to 0 (means infinity)
57
+ * @param {function} [options.compose] Function to handle middleware composition
58
+ * @param {boolean} [options.asyncLocalStorage] Max IPs read from proxy IP header, default to 0 (means infinity)
58
59
  *
59
60
  */
60
61
 
@@ -247,15 +248,6 @@ module.exports = class Application extends Emitter {
247
248
  static get default () {
248
249
  return Application
249
250
  }
250
-
251
- createAsyncCtxStorageMiddleware () {
252
- const app = this
253
- return async function asyncCtxStorage (ctx, next) {
254
- await app.ctxStorage.run(ctx, async () => {
255
- return await next()
256
- })
257
- }
258
- }
259
251
  }
260
252
 
261
253
  /**
@@ -288,7 +280,7 @@ function respond (ctx) {
288
280
  }
289
281
 
290
282
  // status body
291
- if (body == null) {
283
+ if (body === null || body === undefined) {
292
284
  if (ctx.response._explicitNullBody) {
293
285
  ctx.response.remove('Content-Type')
294
286
  ctx.response.remove('Transfer-Encoding')
@@ -308,9 +300,13 @@ function respond (ctx) {
308
300
  }
309
301
 
310
302
  // responses
303
+
311
304
  if (Buffer.isBuffer(body)) return res.end(body)
312
305
  if (typeof body === 'string') return res.end(body)
313
306
  if (body instanceof Stream) return body.pipe(res)
307
+ if (body instanceof Blob) return Stream.Readable.from(body.stream()).pipe(res)
308
+ if (body instanceof ReadableStream) return Stream.Readable.from(body).pipe(res)
309
+ if (body instanceof Response) return Stream.Readable.from(body?.body || '').pipe(res)
314
310
 
315
311
  // body: json
316
312
  body = JSON.stringify(body)
package/lib/context.js CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  'use strict'
3
2
 
4
3
  /**
@@ -155,10 +154,10 @@ const proto = module.exports = {
155
154
  if (err.code === 'ENOENT') statusCode = 404
156
155
 
157
156
  // default to 500
158
- if (typeof statusCode !== 'number' || !statuses[statusCode]) statusCode = 500
157
+ if (typeof statusCode !== 'number' || !statuses.message[statusCode]) statusCode = 500
159
158
 
160
159
  // respond
161
- const code = statuses[statusCode]
160
+ const code = statuses.message[statusCode]
162
161
  const msg = err.expose ? err.message : code
163
162
  this.status = err.status = statusCode
164
163
  this.length = Buffer.byteLength(msg)
@@ -205,6 +204,7 @@ delegate(proto, 'response')
205
204
  .method('set')
206
205
  .method('append')
207
206
  .method('flushHeaders')
207
+ .method('back')
208
208
  .access('status')
209
209
  .access('message')
210
210
  .access('body')
package/lib/only.js ADDED
@@ -0,0 +1,9 @@
1
+ module.exports = (obj, keys) => {
2
+ const ret = {}
3
+ for (let i = 0; i < keys.length; i++) {
4
+ const key = keys[i]
5
+ if (obj[key] == null) continue
6
+ ret[key] = obj[key]
7
+ }
8
+ return ret
9
+ }
package/lib/request.js CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  'use strict'
3
2
 
4
3
  /**
@@ -11,10 +10,11 @@ const accepts = require('accepts')
11
10
  const contentType = require('content-type')
12
11
  const stringify = require('url').format
13
12
  const parse = require('parseurl')
14
- const qs = require('querystring')
13
+ const sp = require('./search-params.js')
14
+
15
15
  const typeis = require('type-is')
16
16
  const fresh = require('fresh')
17
- const only = require('only')
17
+ const only = require('./only.js')
18
18
  const util = require('util')
19
19
 
20
20
  const IP = Symbol('context#ip')
@@ -172,7 +172,7 @@ module.exports = {
172
172
  get query () {
173
173
  const str = this.querystring
174
174
  const c = this._querycache = this._querycache || {}
175
- return c[str] || (c[str] = qs.parse(str))
175
+ return c[str] || (c[str] = sp.parse(str))
176
176
  },
177
177
 
178
178
  /**
@@ -183,7 +183,7 @@ module.exports = {
183
183
  */
184
184
 
185
185
  set query (obj) {
186
- this.querystring = qs.stringify(obj)
186
+ this.querystring = sp.stringify(obj)
187
187
  },
188
188
 
189
189
  /**
@@ -211,7 +211,6 @@ module.exports = {
211
211
 
212
212
  url.search = str
213
213
  url.path = null
214
-
215
214
  this.url = stringify(url)
216
215
  },
217
216
 
@@ -257,7 +256,7 @@ module.exports = {
257
256
  if (!host) host = this.get('Host')
258
257
  }
259
258
  if (!host) return ''
260
- return host.split(/\s*,\s*/, 1)[0]
259
+ return splitCommaSeparatedValues(host, 1)[0]
261
260
  },
262
261
 
263
262
  /**
@@ -376,7 +375,7 @@ module.exports = {
376
375
  /**
377
376
  * Return parsed Content-Length when present.
378
377
  *
379
- * @return {Number}
378
+ * @return {Number|void}
380
379
  * @api public
381
380
  */
382
381
 
@@ -402,7 +401,7 @@ module.exports = {
402
401
  if (this.socket.encrypted) return 'https'
403
402
  if (!this.app.proxy) return 'http'
404
403
  const proto = this.get('X-Forwarded-Proto')
405
- return proto ? proto.split(/\s*,\s*/, 1)[0] : 'http'
404
+ return proto ? splitCommaSeparatedValues(proto, 1)[0] : 'http'
406
405
  },
407
406
 
408
407
  /**
@@ -434,7 +433,7 @@ module.exports = {
434
433
  const proxy = this.app.proxy
435
434
  const val = this.get(this.app.proxyIpHeader)
436
435
  let ips = proxy && val
437
- ? val.split(/\s*,\s*/)
436
+ ? splitCommaSeparatedValues(val)
438
437
  : []
439
438
  if (this.app.maxIpsCount > 0) {
440
439
  ips = ips.slice(-this.app.maxIpsCount)
@@ -503,7 +502,7 @@ module.exports = {
503
502
  /**
504
503
  * Set accept object.
505
504
  *
506
- * @param {Object}
505
+ * @param {Object} obj
507
506
  * @api private
508
507
  */
509
508
 
@@ -724,3 +723,15 @@ module.exports = {
724
723
  if (util.inspect.custom) {
725
724
  module.exports[util.inspect.custom] = module.exports.inspect
726
725
  }
726
+
727
+ /**
728
+ * Split a comma-separated value string into an array of values, with an optional limit.
729
+ * All the values are trimmed of whitespace.
730
+ *
731
+ * @param {string} value - The comma-separated value string to split.
732
+ * @param {number} [limit] - The maximum number of values to return.
733
+ * @returns {string[]} An array of values from the comma-separated string.
734
+ */
735
+ function splitCommaSeparatedValues(value, limit) {
736
+ return value.split(',', limit).map(v => v.trim());
737
+ }
package/lib/response.js CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  'use strict'
3
2
 
4
3
  /**
@@ -15,10 +14,11 @@ const destroy = require('destroy')
15
14
  const assert = require('assert')
16
15
  const extname = require('path').extname
17
16
  const vary = require('vary')
18
- const only = require('only')
17
+ const only = require('./only.js')
19
18
  const util = require('util')
20
19
  const encodeUrl = require('encodeurl')
21
20
  const Stream = require('stream')
21
+ const deprecate = require('depd')('koa')
22
22
 
23
23
  /**
24
24
  * Prototype.
@@ -87,7 +87,7 @@ module.exports = {
87
87
  assert(code >= 100 && code <= 999, `invalid status code: ${code}`)
88
88
  this._explicitStatus = true
89
89
  this.res.statusCode = code
90
- if (this.req.httpVersionMajor < 2) this.res.statusMessage = statuses[code]
90
+ if (this.req.httpVersionMajor < 2) this.res.statusMessage = statuses.message[code]
91
91
  if (this.body && statuses.empty[code]) this.body = null
92
92
  },
93
93
 
@@ -99,7 +99,7 @@ module.exports = {
99
99
  */
100
100
 
101
101
  get message () {
102
- return this.res.statusMessage || statuses[this.status]
102
+ return this.res.statusMessage || statuses.message[this.status]
103
103
  },
104
104
 
105
105
  /**
@@ -127,15 +127,15 @@ module.exports = {
127
127
  /**
128
128
  * Set response body.
129
129
  *
130
- * @param {String|Buffer|Object|Stream} val
130
+ * @param {String|Buffer|Object|Stream|ReadableStream|Blob|Response} val
131
131
  * @api public
132
132
  */
133
133
 
134
134
  set body (val) {
135
135
  const original = this._body
136
136
  this._body = val
137
-
138
137
  // no content
138
+
139
139
  if (val == null) {
140
140
  if (!statuses.empty[this.status]) {
141
141
  if (this.type === 'application/json') {
@@ -184,6 +184,31 @@ module.exports = {
184
184
  return
185
185
  }
186
186
 
187
+ // ReadableStream
188
+ if (val instanceof ReadableStream) {
189
+ if (setType) this.type = 'bin'
190
+ return
191
+ }
192
+
193
+ // blob
194
+ if (val instanceof Blob) {
195
+ if (setType) this.type = 'bin'
196
+ this.length = val.size
197
+ return
198
+ }
199
+
200
+ // Response
201
+ if (val instanceof Response) {
202
+ this.status = val.status
203
+ if (setType) this.type = 'bin'
204
+ const headers = val.headers
205
+ for (const key of headers.keys()) {
206
+ this.set(key, headers.get(key))
207
+ }
208
+
209
+ return
210
+ }
211
+
187
212
  // json
188
213
  this.remove('Content-Length')
189
214
  this.type = 'json'
@@ -235,7 +260,7 @@ module.exports = {
235
260
  /**
236
261
  * Vary on `field`.
237
262
  *
238
- * @param {String} field
263
+ * @param {String|String[]} field
239
264
  * @api public
240
265
  */
241
266
 
@@ -266,7 +291,15 @@ module.exports = {
266
291
 
267
292
  redirect (url, alt) {
268
293
  // location
269
- if (url === 'back') url = this.ctx.get('Referrer') || alt || '/'
294
+ if (url === 'back') {
295
+ deprecate('Special-cased string "back" through redirect will be removed in v3, ' +
296
+ 'consider migrating usage to ctx.back() instead.')
297
+ url = this.ctx.get('Referrer') || alt || '/'
298
+ }
299
+ if (/^https?:\/\//i.test(url)) {
300
+ // formatting url again avoid security escapes
301
+ url = new URL(url).toString()
302
+ }
270
303
  this.set('Location', encodeUrl(url))
271
304
 
272
305
  // status
@@ -285,10 +318,31 @@ module.exports = {
285
318
  this.body = `Redirecting to ${url}.`
286
319
  },
287
320
 
321
+ /**
322
+ * Perform a special-cased "back" to provide Referrer support.
323
+ * When Referrer is not present, `alt` or "/" is used.
324
+ *
325
+ * Examples:
326
+ *
327
+ * ctx.back()
328
+ * ctx.back('/index.html')
329
+ *
330
+ * @param {String} [alt]
331
+ * @api public
332
+ */
333
+
334
+ back (alt) {
335
+ const url = this.ctx.get('Referrer') || alt || '/'
336
+ this.redirect(url)
337
+ },
338
+
288
339
  /**
289
340
  * Set Content-Disposition header to "attachment" with optional `filename`.
290
341
  *
291
- * @param {String} filename
342
+ * @param {String} [filename]
343
+ * @param {object} [options]
344
+ * @param {string} [options.type=attachment]
345
+ * @param {string|boolean} [options.fallback=true]
292
346
  * @api public
293
347
  */
294
348
 
@@ -328,7 +382,7 @@ module.exports = {
328
382
  * this.response.lastModified = new Date();
329
383
  * this.response.lastModified = '2013-09-13';
330
384
  *
331
- * @param {String|Date} type
385
+ * @param {String|Date} val
332
386
  * @api public
333
387
  */
334
388
 
@@ -357,7 +411,7 @@ module.exports = {
357
411
  * this.response.etag = '"md5hashsum"';
358
412
  * this.response.etag = 'W/"123456789"';
359
413
  *
360
- * @param {String} etag
414
+ * @param {String} val
361
415
  * @api public
362
416
  */
363
417
 
@@ -460,7 +514,7 @@ module.exports = {
460
514
  * this.set({ Accept: 'text/plain', 'X-API-Key': 'tobi' });
461
515
  *
462
516
  * @param {String|Object|Array} field
463
- * @param {String} val
517
+ * @param {*} val
464
518
  * @api public
465
519
  */
466
520
 
@@ -490,7 +544,7 @@ module.exports = {
490
544
  * ```
491
545
  *
492
546
  * @param {String} field
493
- * @param {String|Array} val
547
+ * @param {*} val
494
548
  * @api public
495
549
  */
496
550
 
@@ -509,7 +563,7 @@ module.exports = {
509
563
  /**
510
564
  * Remove header `field`.
511
565
  *
512
- * @param {String} name
566
+ * @param {String} field
513
567
  * @api public
514
568
  */
515
569
 
@@ -0,0 +1,33 @@
1
+ const URLSearchParams = require('url').URLSearchParams
2
+
3
+ module.exports = {
4
+ stringify: (obj) => {
5
+ const searchParams = new URLSearchParams()
6
+ const addKey = (k, v, params) => {
7
+ const val = typeof v === 'string' || typeof v === 'number' ? v : ''
8
+ params.append(k, val)
9
+ }
10
+
11
+ for (const [key, value] of Object.entries(obj)) {
12
+ if (Array.isArray(value)) {
13
+ const lgth = value.length
14
+ for (let i = 0; i < lgth; i++) {
15
+ addKey(key, value[i], searchParams)
16
+ }
17
+ } else {
18
+ addKey(key, value, searchParams)
19
+ }
20
+ }
21
+ return searchParams.toString()
22
+ },
23
+
24
+ parse: (str) => {
25
+ const searchParams = new URLSearchParams(str)
26
+ const obj = {}
27
+ for (const key of searchParams.keys()) {
28
+ const values = searchParams.getAll(key)
29
+ obj[key] = values.length <= 1 ? values[0] : values
30
+ }
31
+ return obj
32
+ }
33
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "koa",
3
- "version": "3.0.0-alpha.1",
3
+ "version": "3.0.0-alpha.3",
4
4
  "publishConfig": {
5
5
  "tag": "experimental"
6
6
  },
@@ -9,7 +9,8 @@
9
9
  "exports": {
10
10
  ".": {
11
11
  "require": "./lib/application.js",
12
- "import": "./dist/koa.mjs"
12
+ "import": "./dist/koa.mjs",
13
+ "default": "./dist/koa.mjs"
13
14
  },
14
15
  "./*": "./*.js",
15
16
  "./*.js": "./*.js",
@@ -17,8 +18,10 @@
17
18
  "./package.json": "./package.json"
18
19
  },
19
20
  "scripts": {
20
- "test": "jest --forceExit",
21
- "lint": "eslint --ignore-path .gitignore .",
21
+ "test": "node --test",
22
+ "test:coverage": "node --test --experimental-test-coverage",
23
+ "lint": "standard",
24
+ "lint:pretty": "standard | snazzy",
22
25
  "authors": "git log --format='%aN <%aE>' | sort -u > AUTHORS",
23
26
  "build": "gen-esm-wrapper . ./dist/koa.mjs",
24
27
  "prepare": "npm run build"
@@ -39,42 +42,33 @@
39
42
  "cache-content-type": "^1.0.0",
40
43
  "content-disposition": "~0.5.2",
41
44
  "content-type": "^1.0.4",
42
- "cookies": "~0.8.0",
45
+ "cookies": "~0.9.1",
43
46
  "debug": "^4.3.2",
44
47
  "delegates": "^1.0.0",
45
48
  "destroy": "^1.0.4",
46
- "encodeurl": "^1.0.2",
49
+ "encodeurl": "^2.0.0",
47
50
  "escape-html": "^1.0.3",
48
51
  "fresh": "~0.5.2",
49
52
  "http-assert": "^1.3.0",
50
- "http-errors": "^1.6.3",
53
+ "http-errors": "^2.0.0",
51
54
  "koa-compose": "^4.1.0",
52
55
  "on-finished": "^2.3.0",
53
- "only": "~0.0.2",
54
56
  "parseurl": "^1.3.2",
55
- "statuses": "^1.5.0",
57
+ "statuses": "^2.0.1",
56
58
  "type-is": "^1.6.16",
57
59
  "vary": "^1.1.2"
58
60
  },
59
61
  "devDependencies": {
60
- "eslint": "^7.32.0",
61
- "eslint-config-standard": "^16.0.3",
62
- "eslint-plugin-import": "^2.18.2",
63
- "eslint-plugin-node": "^11.1.0",
64
- "eslint-plugin-promise": "^5.1.0",
65
- "eslint-plugin-standard": "^5.0.0",
66
62
  "gen-esm-wrapper": "^1.0.6",
67
- "jest": "^28.1.2",
68
- "supertest": "^6.2.4"
63
+ "snazzy": "^9.0.0",
64
+ "standard": "^17.1.0",
65
+ "supertest": "^7.0.0"
69
66
  },
70
67
  "engines": {
71
- "node": ">= 12.17.0"
68
+ "node": ">= 18"
72
69
  },
73
70
  "files": [
74
71
  "dist",
75
72
  "lib"
76
- ],
77
- "jest": {
78
- "testEnvironment": "node"
79
- }
73
+ ]
80
74
  }
package/History.md DELETED
@@ -1,674 +0,0 @@
1
-
2
- 3.0.0-alpha.1 / 2023-04-12
3
- ==================
4
-
5
- **fixes**
6
- * [[`e98b8d1`](http://github.com/koajs/koa/commit/e98b8d1918376dc2957aa62906bf5893bef66c4c)] - fix: can not get currentContext in error handler (#1758) (Gxkl <<gxkl203@gmail.com>>)
7
-
8
- 3.0.0-alpha.0 / 2023-01-02
9
- ==================
10
-
11
- ## Breaking Changes
12
-
13
- - Supports node@12+ only.
14
- - Removes generator deprecation messages.
15
- Generators are no longer supported.
16
- Koa no longer asserts if generators are used.
17
- - Set `content-length: 0` if body is explicitly set to `null` @ognjenjevremovic #1528
18
-
19
- ## Features
20
-
21
- - Use asyncLocalStorage to get current context from app, e.g.: `const ctx = app.currentContext`.
22
-
23
- ## Fixes
24
-
25
- - fix: Do not response Content-Length if Transfer-Encoding is defined #1562 @charlyzeng
26
- - fix: Set body to `null` if `ctx.type = json` and `ctx.body = null` #1059 @likegun
27
-
28
- 2.13.1 / 2021-01-04
29
- ==================
30
-
31
- **fixes**
32
- * [[`b5472f4`](http://github.com/koajs/koa/commit/b5472f4cbb87349becae36b4a9ad5f76a825abb8)] - fix: make ESM transpiled CommonJS play nice for TS folks, fix #1513 (#1518) (miwnwski <<m@iwnw.ski>>)
33
- * [[`68d97d6`](http://github.com/koajs/koa/commit/68d97d69e4536065504bf9ef1e348a66b3f35709)] - fix: fixed order of vulnerability disclosure addresses (niftylettuce <<niftylettuce@gmail.com>>)
34
-
35
- **others**
36
- * [[`b4398f5`](http://github.com/koajs/koa/commit/b4398f5d68f9546167419f394a686afdcb5e10e2)] - correct verb tense in doc (#1512) (Matan Shavit <<71092861+matanshavit@users.noreply.github.com>>)
37
- * [[`39e1a5a`](http://github.com/koajs/koa/commit/39e1a5a380aa2bbc4e2d164e8e4bf37cfd512516)] - fixed multiple grammatical errors in docs. (#1497) (Hridayesh Sharma <<vyasriday7@gmail.com>>)
38
- * [[`aeb5d19`](http://github.com/koajs/koa/commit/aeb5d1984dcc5f8e3386f8f9724807ae6f3aa1c4)] - docs: added niftylettuce@gmail.com to vulnerability disclosure (niftylettuce <<niftylettuce@gmail.com>>)
39
- * [[`6e1093b`](http://github.com/koajs/koa/commit/6e1093be27b41135c8e67fce108743d54e9cab67)] - docs: remove babel from readme (#1494) (miwnwski <<m@iwnw.ski>>)
40
- * [[`38cb591`](http://github.com/koajs/koa/commit/38cb591254ff5f65a04e8fb57be293afe697c46e)] - docs: update specific for auto response status (AlbertAZ1992 <<ziyuximing@163.com>>)
41
- * [[`2224cd9`](http://github.com/koajs/koa/commit/2224cd9b6a648e7ac2eb27eac332e7d6de7db26c)] - docs: remove babel ref. (#1488) (Imed Jaberi <<imed_jebari@hotmail.fr>>)
42
- * [[`d51f983`](http://github.com/koajs/koa/commit/d51f98328c3b84493cc6bda0732aabb69e20e3a1)] - docs: fix assert example for response (#1489) (Imed Jaberi <<imed_jebari@hotmail.fr>>)
43
- * [[`f8b49b8`](http://github.com/koajs/koa/commit/f8b49b859363ad6c3d9ea5c11ee62341407ceafd)] - chore: fix grammatical and spelling errors in comments and tests (#1490) (Matt Kubej <<mkubej@gmail.com>>)
44
- * [[`d1c9263`](http://github.com/koajs/koa/commit/d1c92638c95d799df2fdff5576b96fc43a62813f)] - deps: update depd >> v2.0.0 (#1482) (imed jaberi <<imed_jebari@hotmail.fr>>)
45
-
46
- 2.13.0 / 2020-06-21
47
- ==================
48
-
49
- **features**
50
- * [[`bbcde76`](http://github.com/koajs/koa/commit/bbcde76f5cb5b67bbcd3201791cf0ef648fd3a8b)] - feat: support esm (#1474) (ZYSzys <<zhangyongsheng@youzan.com>>)
51
-
52
- **others**
53
- * [[`20e58cf`](http://github.com/koajs/koa/commit/20e58cf3e4f20fc5d5886df1d0ac6dd8c33bd202)] - test: imporve coverage to 100% (dead-horse <<dead_horse@qq.com>>)
54
- * [[`4a40d63`](http://github.com/koajs/koa/commit/4a40d633c4b4a203c6656078f9952ccef65c5875)] - build: use prepare instead of prepublish (dead-horse <<dead_horse@qq.com>>)
55
- * [[`226ba8c`](http://github.com/koajs/koa/commit/226ba8c8e81e83da48e7bf137be3f146d03f40b8)] - build: use prepublish instead of prepack (dead-horse <<dead_horse@qq.com>>)
56
-
57
- 2.12.1 / 2020-06-13
58
- ==================
59
-
60
- **fixes**
61
- * [[`e2030c7`](http://github.com/koajs/koa/commit/e2030c7249c7ae24e28158d8eae405a02fefc9f8)] - fix: Improve checks for Error in onerror handlers (#1468) (Julien Wajsberg <<felash@gmail.com>>)
62
-
63
- **others**
64
- * [[`5208c5e`](http://github.com/koajs/koa/commit/5208c5e15d35b3653fce6b8ed68d09865abea843)] - chore: Use single console.error() statement in error handler (#1471) (Mike Vosseller <<michael.vosseller@gmail.com>>)
65
-
66
- 2.12.0 / 2020-05-18
67
- ==================
68
-
69
- **features**
70
- * [[`0d2f421`](http://github.com/koajs/koa/commit/0d2f421c265350d3d84e1bc261572954479f27d3)] - feat: error handler treat err.statusCode as the same as err.status (#1460) (Vijay Krishnavanshi <<vijaykrishnavanshi@gmail.com>>)
71
- * [[`8d52105`](http://github.com/koajs/koa/commit/8d52105a34234be9e771ff3b76b43e4e30328943)] - feat: allow bodyless responses for non empty status codes (#1447) (ejose19 <<8742215+ejose19@users.noreply.github.com>>)
72
-
73
- **others**
74
- * [[`faeaff5`](http://github.com/koajs/koa/commit/faeaff5c149a81a188ab8e5af0b994029e45acbb)] - fox: remove `error-inject` and fix error handling (#1409) (Konstantin Vyatkin <<tino@vtkn.io>>)
75
- * [[`f7c732f`](http://github.com/koajs/koa/commit/f7c732fd06f724505e9090add4d977e667da55a8)] - docs: fixed incorrect onerror example (#1459) (Paul Annekov <<paul.annekov@gmail.com>>)
76
- * [[`143d8f7`](http://github.com/koajs/koa/commit/143d8f72f2a232b4c97eac00e7811015911e4f7c)] - Always use strict equality. (#1225) (Yazan Medanat <<medanat@gmail.com>>)
77
- * [[`6b6b0dd`](http://github.com/koajs/koa/commit/6b6b0ddf7aff073e65493c6efaffab8331c0331c)] - docs(api): add app.use chainability note (#1449) (Zac Anger <<zac@zacanger.com>>)
78
- * [[`8ddab48`](http://github.com/koajs/koa/commit/8ddab48cbdbca1e6d1cc8c3ddae45491db524d51)] - docs: Document response status with empty body (#1445) (Marc-Aurèle DARCHE <<152407+madarche@users.noreply.github.com>>)
79
- * [[`7deedb2`](http://github.com/koajs/koa/commit/7deedb235274223f1b9da46dee296545b23598de)] - docs: Updating context.md with the latest cookies opts (#1433) (Brad Ito <<phlogisticfugu@users.noreply.github.com>>)
80
- * [[`3e97a10`](http://github.com/koajs/koa/commit/3e97a106bb846d9337737011bb85149ddd797229)] - docs(links): remove Google+ link (#1439) (laffachan <<45162759+laffachan@users.noreply.github.com>>)
81
- * [[`eda2760`](http://github.com/koajs/koa/commit/eda27608f7d39ede86d7b402aae64b1867ce31c6)] - build: Drop unused Travis sudo: false directive (#1416) (Olle Jonsson <<olle.jonsson@gmail.com>>)
82
-
83
- 2.11.0 / 2019-10-28
84
- ==================
85
-
86
- **features**
87
- * [[`422e539`](http://github.com/koajs/koa/commit/422e539e8989e65ba43ecc39ddbaa3c4f755d465)] - feat: support app.proxyIPHeader and app.maxIpsCount to make ctx.ips more security (Yiyu He <<dead_horse@qq.com>>)
88
- * [[`d48d88e`](http://github.com/koajs/koa/commit/d48d88ee17b780c02123e6d657274cab456e943e)] - feat: implement response.has (#1397) (Konstantin Vyatkin <<tino@vtkn.io>>)
89
-
90
- **others**
91
- * [[`4dc56f6`](http://github.com/koajs/koa/commit/4dc56f6d04e8f5fe12ba53a8a776653b3d7b60ed)] - chore: update ESLint and plugins/configs (#1407) (Konstantin Vyatkin <<tino@vtkn.io>>)
92
- * [[`be7d334`](http://github.com/koajs/koa/commit/be7d334778481639294cdf87f5c359a230aeb65b)] - chore: removes code duplication at handling HEAD method (#1400) (Konstantin Vyatkin <<tino@vtkn.io>>)
93
- * [[`f155785`](http://github.com/koajs/koa/commit/f155785e2bb42b5ddf0a8156401c6dafdf57ba8b)] - chore: support `writableEnded` (#1402) (Konstantin Vyatkin <<tino@vtkn.io>>)
94
- * [[`b968688`](http://github.com/koajs/koa/commit/b968688afe2c727ae141f50aa983d481dbc1dbbf)] - chore: add FUNDING.yml (#1403) (Konstantin Vyatkin <<tino@vtkn.io>>)
95
- * [[`4f96829`](http://github.com/koajs/koa/commit/4f968298f97394e488297ec32c8e927a3a322076)] - chore: remove isJSON in res.length (#1399) (Konstantin Vyatkin <<tino@vtkn.io>>)
96
- * [[`8be5626`](http://github.com/koajs/koa/commit/8be5626bbb54e6c899a1b71d22411709126d9fea)] - build: enable codecov partial coverage and use bash uploader (#1396) (Konstantin Vyatkin <<tino@vtkn.io>>)
97
- * [[`ef5c43b`](http://github.com/koajs/koa/commit/ef5c43bcbcf31819e032c3b7ae7654b7f8e9358b)] - chore: use rest params (#1393) (Konstantin Vyatkin <<tino@vtkn.io>>)
98
-
99
- 2.10.0 / 2019-10-12
100
- ==================
101
-
102
- **features**
103
- * [[`d7f7f77`](http://github.com/koajs/koa/commit/d7f7f77689e2eaef050686be2bdf3e72881a79ac)] - feat: support sameSite=none cookies (bump cookies dependency) (#1390) (Filip Skokan <<panva.ip@gmail.com>>)
104
-
105
- 2.9.0 / 2019-10-12
106
- ==================
107
-
108
- **features**
109
- * [[`2d1c598`](http://github.com/koajs/koa/commit/2d1c5981869e0fe6f5bc71b5c5582accfd125cc6)] - feat: export HttpError from http-errors library (Micheal Hill <<micheal.hill@trunkplatform.com>>)
110
-
111
- **others**
112
- * [[`cf70dbc`](http://github.com/koajs/koa/commit/cf70dbc6d2ba62bf1eb12b563dd5ecd27af6e2be)] - Chore: Use https in readme (#1389) (谭九鼎 <<109224573@qq.com>>)
113
-
114
- 2.8.2 / 2019-09-28
115
- ==================
116
-
117
- **fixes**
118
- * [[`54e8fab`](http://github.com/koajs/koa/commit/54e8fab3e3d907bbb264caf3e28a24773d0d6fdb)] - fix: encode redirect url if not already encoded (#1384) (fengmk2 <<fengmk2@gmail.com>>)
119
-
120
- **others**
121
- * [[`817b498`](http://github.com/koajs/koa/commit/817b49830571b45a8aec6b1fc1525434f5798c58)] - test: fix body test (#1375) (Robert Nagy <<ronagy@icloud.com>>)
122
- * [[`f75d445`](http://github.com/koajs/koa/commit/f75d4455359ecdf30eeb676e2c7f31d4cf7b42ed)] - test: fix end after end (#1374) (Robert Nagy <<ronagy@icloud.com>>)
123
-
124
- 2.8.1 / 2019-08-19
125
- ==================
126
-
127
- **fixes**
128
- * [[`287e589`](http://github.com/koajs/koa/commit/287e589ac773d3738b2aa7d40e0b6d43dde5261b)] - fix: make options more compatibility (dead-horse <<dead_horse@qq.com>>)
129
-
130
- 2.8.0 / 2019-08-19
131
- ==================
132
-
133
- **features**
134
- * [[`5afff89`](http://github.com/koajs/koa/commit/5afff89eca0efe7081309dc2d123309e825df221)] - feat: accept options in the Application constructor (#1372) (Jake <<djakelambert@gmail.com>>)
135
-
136
- **fixes**
137
- * [[`ff70bdc`](http://github.com/koajs/koa/commit/ff70bdc75a30a37f63fc1f7d8cbae3204df3d982)] - fix: typo on document (#1355) (Jeff <<jeff.tian@outlook.com>>)
138
-
139
- **others**
140
- * [[`3b23865`](http://github.com/koajs/koa/commit/3b23865340cfba075f61f7dba0ea31fcc27260ec)] - docs: parameter of request.get is case-insensitive (#1373) (Gunnlaugur Thor Briem <<gunnlaugur@gmail.com>>)
141
- * [[`a245d18`](http://github.com/koajs/koa/commit/a245d18a131341feec4f87659746954e78cae780)] - docs: Update response.socket (#1357) (Jeff <<jeff.tian@outlook.com>>)
142
- * [[`d1d65dd`](http://github.com/koajs/koa/commit/d1d65dd29d7bbaf9ea42eaa5fcb0da3fb4df98e9)] - chore(deps): install egg-bin, mm as devDeps not deps (#1366) (Edvard Chen <<pigeon73101@gmail.com>>)
143
- * [[`2c86b10`](http://github.com/koajs/koa/commit/2c86b10feafd868ebd071dda3a222e6f51972b5d)] - test: remove jest and use egg-bin(mocha) (#1363) (Yiyu He <<dead_horse@qq.com>>)
144
- * [[`219bf22`](http://github.com/koajs/koa/commit/219bf22237b11bc375e2e110b93db512f1acfdd4)] - docs(context): update link (#1354) (Peng Jie <<bivinity.pengzjie@gmail.com>>)
145
- * [[`52a6737`](http://github.com/koajs/koa/commit/52a673703a87a93c0f6a8552e6bd73caba66d2eb)] - chore: ignore Intellij IDEA project files (#1361) (Imon-Haque <<38266345+Imon-Haque@users.noreply.github.com>>)
146
- * [[`b9e3546`](http://github.com/koajs/koa/commit/b9e35469d3bbd0a1ee92e0a815ce2512904d4a18)] - docs(api): fix keygrip link (#1350) (Peng Jie <<bivinity.pengzjie@gmail.com>>)
147
- * [[`d4bdb5e`](http://github.com/koajs/koa/commit/d4bdb5ed9e2fe06ec44698b66c029f624135a0ab)] - chore: update eslint and fix lint errors (dead-horse <<dead_horse@qq.com>>)
148
- * [[`12960c4`](http://github.com/koajs/koa/commit/12960c437cc25c53e682cfe5bff06d74a5bb1eb9)] - build: test on 8/10/12 (dead-horse <<dead_horse@qq.com>>)
149
- * [[`00e8f7a`](http://github.com/koajs/koa/commit/00e8f7a1b7603aabdb7fb3567f485cb1c2076702)] - docs: ctx.type aliases ctx.response, not ctx.request (#1343) (Alex Berk <<berkalexanderc@gmail.com>>)
150
- * [[`62f29eb`](http://github.com/koajs/koa/commit/62f29eb0c4dee01170a5511615e5bcc9faca26ca)] - docs(context): update cookies link (#1348) (Peng Jie <<dean.leehom@gmail.com>>)
151
- * [[`b7fc526`](http://github.com/koajs/koa/commit/b7fc526ea49894f366153bd32997e02568c0b8a6)] - docs: fix typo in cookie path default value docs (#1340) (Igor Adamenko <<igoradamenko@users.noreply.github.com>>)
152
- * [[`23f7f54`](http://github.com/koajs/koa/commit/23f7f545abfe1fb6499cd61cc8ff41fd86cef4a0)] - chore: simplify variable (#1332) (kzhang <<godky@users.noreply.github.com>>)
153
- * [[`132c9ee`](http://github.com/koajs/koa/commit/132c9ee63f92a586a120ed3bd6b7ef023badb8bb)] - docs: Clarify the format of request.headers (#1325) (Dobes Vandermeer <<dobesv@gmail.com>>)
154
- * [[`5810f27`](http://github.com/koajs/koa/commit/5810f279a4caeda115f39e429c9671795613abf8)] - docs: Removed Document in Progress note in Koa vs Express (#1336) (Andrew Peterson <<andrew@andpeterson.com>>)
155
- * [[`75233d9`](http://github.com/koajs/koa/commit/75233d974a30af6e3b8ab38a73e5ede67172fc1c)] - chore: Consider removing this return statement; it will be ignored. (#1322) (Vern Brandl <<tkvern@users.noreply.github.com>>)
156
- * [[`04e07fd`](http://github.com/koajs/koa/commit/04e07fdc620841068f12b8edf36f27e6592a0a18)] - test: Buffer() is deprecated due to security and usability issues. so use the Buffer.alloc() instead (#1321) (Vern Brandl <<tkvern@users.noreply.github.com>>)
157
- * [[`130e363`](http://github.com/koajs/koa/commit/130e363856747b487652f04b5550056d7778e43a)] - docs: use 'fs-extra' instead of 'fs-promise' (#1309) (rosald <<35028438+rosald@users.noreply.github.com>>)
158
- * [[`2f2078b`](http://github.com/koajs/koa/commit/2f2078bf998bd3f44289ebd17eeccf5e12e4c134)] - chore: Update PR-welcome badge url (#1299) (James George <<jamesgeorge998001@gmail.com>>)
159
-
160
- 2.7.0 / 2019-01-28
161
- ==================
162
-
163
- **features**
164
- * [[`b7bfa71`](http://github.com/koajs/koa/commit/b7bfa7113b8d1af49a57ab767f24a599ed92044f)] - feat: change set status assert, allowing valid custom statuses (#1308) (Martin Iwanowski <<martin@iwanowski.se>>)
165
-
166
- **others**
167
- * [[`72f325b`](http://github.com/koajs/koa/commit/72f325b78edd0dc2aac940a76ce5f644005ce4c3)] - chore: add pr welcoming badge (#1291) (James George <<jamesgeorge998001@gmail.com>>)
168
- * [[`b15115b`](http://github.com/koajs/koa/commit/b15115b2cbfffe15827cd5e4368267d417b72f08)] - chore: Reduce unnecessary variable declarations (#1298) (call me saisai <<1457358080@qq.com>>)
169
- * [[`ad91ce2`](http://github.com/koajs/koa/commit/ad91ce2346cb34e5d5a49d07dd952d15f6c832a3)] - chore: license 2019 (dead-horse <<dead_horse@qq.com>>)
170
- * [[`b25e79d`](http://github.com/koajs/koa/commit/b25e79dfb599777a38157bd419395bd28369ee86)] - Mark two examples as live for the corresponding documentation change in https://github.com/koajs/koajs.com/pull/38. (#1031) (Francisco Ryan Tolmasky I <<tolmasky@gmail.com>>)
171
- * [[`d9ef603`](http://github.com/koajs/koa/commit/d9ef60398e88f2c2f958ab2b159d38052ffe7f8a)] - chore: Optimize array split (#1295) (Mikhail Bodrov <<connormiha1@gmail.com>>)
172
- * [[`9be8583`](http://github.com/koajs/koa/commit/9be858312553002841725b617050aaff3c48951d)] - chore: replace ~~ with Math.trunc in res.length (option) (#1288) (jeremiG <<gendronjeremi@gmail.com>>)
173
- * [[`7e46c20`](http://github.com/koajs/koa/commit/7e46c2058cb5994809eab5f4dbb12f21e937c72b)] - docs: add link to the license file (#1290) (James George <<jamesgeorge998001@gmail.com>>)
174
- * [[`48993ad`](http://github.com/koajs/koa/commit/48993ade9b0831fbce28d94b3b0963a4b0dccbdd)] - docs: Document other body types (#1285) (Douglas Wade <<douglas.b.wade@gmail.com>>)
175
- * [[`acb388b`](http://github.com/koajs/koa/commit/acb388bc0546b48fca11dce8aa7a595af2cda5e2)] - docs: Add security vulnerability disclosure instructions to the Readme (#1283) (Douglas Wade <<douglas.b.wade@gmail.com>>)
176
- * [[`a007198`](http://github.com/koajs/koa/commit/a007198fa23c19902b1f3ffb81498629e0e9c875)] - docs: Document ctx.app.emit (#1284) (Douglas Wade <<douglas.b.wade@gmail.com>>)
177
- * [[`f90e825`](http://github.com/koajs/koa/commit/f90e825da9d505c11b4262c50cd54553f979c300)] - docs: response.set(fields) won't overwrites previous header fields(#1282) (Douglas Wade <<douglas.b.wade@gmail.com>>)
178
- * [[`fc93c05`](http://github.com/koajs/koa/commit/fc93c05f68398f30abc46fd16ae6c673a1eee099)] - docs: update readme to add babel 7 instructions (#1274) (Vikram Rangaraj <<vik120@icloud.com>>)
179
- * [[`5560f72`](http://github.com/koajs/koa/commit/5560f729124f022ffed00085aafea43dded7fb03)] - chore: use the ability of `content-type` lib directly (#1276) (Jordan <<mingmingwon@gmail.com>>)
180
-
181
- 2.6.2 / 2018-11-10
182
- ==================
183
-
184
- **fixes**
185
- * [[`9905199`](http://github.com/koajs/koa/commit/99051992a9f45eb0dd79e062681d6f5d366deb41)] - fix: Status message is not supported on HTTP/2 (#1264) (André Cruz <<andre@cabine.org>>)
186
-
187
- **others**
188
- * [[`325792a`](http://github.com/koajs/koa/commit/325792aee92de0ba6fea306657933fc63dc00474)] - docs: add table of contents for guide.md (#1267) (ZYSzys <<zyszys98@gmail.com>>)
189
- * [[`71aaa29`](http://github.com/koajs/koa/commit/71aaa29591d6681f8579486f18d32ba1ee651a5b)] - docs: fix spelling in throw docs (#1269) (Martin Iwanowski <<martin@iwanowski.se>>)
190
- * [[`bc81ca9`](http://github.com/koajs/koa/commit/bc81ca9414296234c764b7306a19ba72b2e59b52)] - chore: use res instead of this.res (#1271) (Jordan <<mingmingwon@gmail.com>>)
191
- * [[`0251b38`](http://github.com/koajs/koa/commit/0251b38a8405471892c5eeaba7c8d54bd7028214)] - test: node v11 on travis (#1265) (Martin Iwanowski <<martin@iwanowski.se>>)
192
- * [[`88b92b4`](http://github.com/koajs/koa/commit/88b92b43153f21609aee71d47abcd4dc27a6586d)] - doc: updated docs for throw() to pass status as first param. (#1268) (Waleed Ashraf <<waleedashraf@outlook.com>>)
193
-
194
- 2.6.1 / 2018-10-23
195
- ==================
196
-
197
- **fixes**
198
- * [[`4964242`](http://github.com/koajs/koa/commit/49642428342e5f291eb9d690802e83ed830623b5)] - fix: use X-Forwarded-Host first on app.proxy present (#1263) (fengmk2 <<fengmk2@gmail.com>>)
199
-
200
- 2.6.0 / 2018-10-23
201
- ==================
202
-
203
- **features**
204
- * [[`9c5c58b`](http://github.com/koajs/koa/commit/9c5c58b18363494976185e7ddc790ac63de840ed)] - feat: use :authority header of http2 requests as host (#1262) (Martin Michaelis <<code@mgjm.de>>)
205
- * [[`9146024`](http://github.com/koajs/koa/commit/9146024e1094e8bb871ab15d1b7fc556a710732f)] - feat: response.attachment append a parameter: options from contentDisposition (#1240) (小雷 <<863837949@qq.com>>)
206
-
207
- **others**
208
- * [[`d32623b`](http://github.com/koajs/koa/commit/d32623baa7a6273d47be67d587ad4ea0ecffc5de)] - docs: Update error-handling.md (#1239) (urugator <<j.placek@centrum.cz>>)
209
-
210
- 2.5.3 / 2018-09-11
211
- ==================
212
-
213
- **fixes**
214
- * [[`2ee32f5`](http://github.com/koajs/koa/commit/2ee32f50b88b383317e33cc0a4bfaa5f2eadead7)] - fix: pin debug@~3.1.0 avoid deprecated warnning (#1245) (fengmk2 <<fengmk2@gmail.com>>)
215
-
216
- **others**
217
- * [[`2180839`](http://github.com/koajs/koa/commit/2180839eda2cb16edcfda46ccfe24711680af850)] - docs: Update koa-vs-express.md (#1230) (Clayton Ray <<iamclaytonray@gmail.com>>)
218
-
219
- 2.5.2 / 2018-07-12
220
- ==================
221
-
222
- * deps: upgrade all dependencies
223
- * perf: avoid stringify when set header (#1220)
224
- * perf: cache content type's result (#1218)
225
- * perf: lazy init cookies and ip when first time use it (#1216)
226
- * chore: fix comment & approve cov (#1214)
227
- * docs: fix grammar
228
- * test&cov: add test case (#1211)
229
- * Lazily initialize `request.accept` and delegate `context.accept` (#1209)
230
- * fix: use non deprecated custom inspect (#1198)
231
- * Simplify processes in the getter `request.protocol` (#1203)
232
- * docs: better demonstrate middleware flow (#1195)
233
- * fix: Throw a TypeError instead of a AssertionError (#1199)
234
- * chore: mistake in a comment (#1201)
235
- * chore: use this.res.socket insteadof this.ctx.req.socket (#1177)
236
- * chore: Using "listenerCount" instead of "listeners" (#1184)
237
-
238
- 2.5.1 / 2018-04-27
239
- ==================
240
-
241
- * test: node v10 on travis (#1182)
242
- * fix tests: remove unnecessary assert doesNotThrow and api calls (#1170)
243
- * use this.response insteadof this.ctx.response (#1163)
244
- * deps: remove istanbul (#1151)
245
- * Update guide.md (#1150)
246
-
247
- 2.5.0 / 2018-02-11
248
- ==================
249
-
250
- * feat: ignore set header/status when header sent (#1137)
251
- * run coverage using --runInBand (#1141)
252
- * [Update] license year to 2018 (#1130)
253
- * docs: small grammatical fix in api docs index (#1111)
254
- * docs: fixed typo (#1112)
255
- * docs: capitalize K in word koa (#1126)
256
- * Error handling: on non-error throw try to stringify if error is an object (#1113)
257
- * Use eslint-config-koa (#1105)
258
- * Update mgol's name in AUTHORS, add .mailmap (#1100)
259
- * Avoid generating package locks instead of ignoring them (#1108)
260
- * chore: update copyright year to 2017 (#1095)
261
-
262
-
263
- 2.4.1 / 2017-11-06
264
- ==================
265
-
266
- * fix bad merge w/ 2.4.0
267
-
268
- 2.4.0 / 2017-11-06
269
- ==================
270
-
271
- UNPUBLISHED
272
-
273
- * update `package.engines.node` to be more strict
274
- * update `fresh@^0.5.2`
275
- * fix: `inspect()` no longer crashes `context`
276
- * fix: gated `res.statusMessage` for HTTP/2
277
- * added: `app.handleRequest()` is exposed
278
-
279
- 2.3.0 / 2017-06-20
280
- ==================
281
-
282
- * fix: use `Buffer.from()`
283
- * test on node 7 & 8
284
- * add `package-lock.json` to `.gitignore`
285
- * run `lint --fix`
286
- * add `request.header` in addition to `request.headers`
287
- * add IPv6 hostname support
288
-
289
- 2.2.0 / 2017-03-14
290
- ==================
291
-
292
- * fix: drop `package.engines.node` requirement to >= 6.0.0
293
- * this fixes `yarn`, which errors when this semver range is not satisfied
294
- * bump `cookies@~0.7.0`
295
- * bump `fresh@^0.5.0`
296
-
297
- 2.1.0 / 2017-03-07
298
- ==================
299
-
300
- * added: return middleware chain promise from `callback()` #848
301
- * added: node v7.7+ `res.getHeaderNames()` support #930
302
- * added: `err.headerSent` in error handling #919
303
- * added: lots of docs!
304
-
305
- 2.0.1 / 2017-02-25
306
- ==================
307
-
308
- NOTE: we hit a versioning snafu. `v2.0.0` was previously released,
309
- so `v2.0.1` is released as the first `v2.x` with a `latest` tag.
310
-
311
- * upgrade mocha #900
312
- * add names to `application`'s request and response handlers #805
313
- * breaking: remove unused `app.name` #899
314
- * breaking: drop official support for node < 7.6
315
-
316
- 2.0.0 / ??????????
317
- ==================
318
-
319
- * Fix malformed content-type header causing exception on charset get (#898)
320
- * fix: subdomains should be [] if the host is an ip (#808)
321
- * don't pre-bound onerror [breaking change] (#800)
322
- * fix `ctx.flushHeaders()` to use `res.flushHeaders()` instead of `res.writeHead()` (#795)
323
- * fix(response): correct response.writable logic (#782)
324
- * merge v1.1.2 and v1.2.0 changes
325
- * include `koa-convert` so that generator functions still work
326
- * NOTE: generator functions are deprecated in v2 and will be removed in v3
327
- * improve linting
328
- * improve docs
329
-
330
- 2.0.0-alpha.8 / 2017-02-13
331
- ==================
332
-
333
- * Fix malformed content-type header causing exception on charset get (#898)
334
-
335
- 2.0.0-alpha.7 / 2016-09-07
336
- ==================
337
-
338
- * fix: subdomains should be [] if the host is an ip (#808)
339
-
340
- 2.0.0-alpha.6 / 2016-08-29
341
- ==================
342
-
343
- * don't pre-bound onerror [breaking change]
344
-
345
- 2.0.0-alpha.5 / 2016-08-10
346
- ==================
347
-
348
- * fix `ctx.flushHeaders()` to use `res.flushHeaders()` instead of `res.writeHead()`
349
-
350
- 2.0.0-alpha.4 / 2016-07-23
351
- ==================
352
-
353
- * fix `response.writeable` during pipelined requests
354
-
355
- 1.2.0 / 2016-03-03
356
- ==================
357
-
358
- * add support for `err.headers` in `ctx.onerror()`
359
- - see: https://github.com/koajs/koa/pull/668
360
- - note: you should set these headers in your custom error handlers as well
361
- - docs: https://github.com/koajs/koa/blob/master/docs/error-handling.md
362
- * fix `cookies`' detection of http/https
363
- - see: https://github.com/koajs/koa/pull/614
364
- * deprecate `app.experimental = true`. Koa v2 does not use this signature.
365
- * add a code of conduct
366
- * test against the latest version of node
367
- * add a lot of docs
368
-
369
- 1.1.2 / 2015-11-05
370
- ==================
371
-
372
- * ensure parseurl always working as expected
373
- * fix Application.inspect() – missing .proxy value.
374
-
375
- 2.0.0-alpha.3 / 2015-11-05
376
- ==================
377
-
378
- * ensure parseurl always working as expected. #586
379
- * fix Application.inspect() – missing .proxy value. Closes #563
380
-
381
- 2.0.0-alpha.2 / 2015-10-27
382
- ==================
383
-
384
- * remove `co` and generator support completely
385
- * improved documentation
386
- * more refactoring into ES6
387
-
388
- 2.0.0-alpha.1 / 2015-10-22
389
- ==================
390
-
391
- * change the middleware signature to `async (ctx, next) => await next()`
392
- * drop node < 4 support and rewrite the codebase in ES6
393
-
394
- 1.1.1 / 2015-10-22
395
- ==================
396
-
397
- * do not send a content-type when the type is unknown #536
398
-
399
- 1.1.0 / 2015-10-11
400
- ==================
401
-
402
- * add `app.silent=<Boolean>` to toggle error logging @tejasmanohar #486
403
- * add `ctx.origin` @chentsulin #480
404
- * various refactoring
405
- - add `use strict` everywhere
406
-
407
- 1.0.0 / 2015-08-22
408
- ==================
409
-
410
- * add `this.req` check for `querystring()`
411
- * don't log errors with `err.expose`
412
- * `koa` now follows semver!
413
-
414
- 0.21.0 / 2015-05-23
415
- ==================
416
-
417
- * empty `request.query` objects are now always the same instance
418
- * bump `fresh@0.3.0`
419
-
420
- 0.20.0 / 2015-04-30
421
- ==================
422
-
423
- Breaking change if you're using `this.get('ua') === undefined` etc.
424
- For more details please checkout [#438](https://github.com/koajs/koa/pull/438).
425
-
426
- * make sure helpers return strict string
427
- * feat: alias response.headers to response.header
428
-
429
- 0.19.1 / 2015-04-14
430
- ==================
431
-
432
- * non-error thrown, fixed #432
433
-
434
- 0.19.0 / 2015-04-05
435
- ==================
436
-
437
- * `req.host` and `req.hostname` now always return a string (semi-breaking change)
438
- * improved test coverage
439
-
440
- 0.18.1 / 2015-03-01
441
- ==================
442
-
443
- * move babel to `devDependencies`
444
-
445
- 0.18.0 / 2015-02-14
446
- ==================
447
-
448
- * experimental es7 async function support via `app.experimental = true`
449
- * use `content-type` instead of `media-typer`
450
-
451
- 0.17.0 / 2015-02-05
452
- ==================
453
-
454
- Breaking change if you're using an old version of node v0.11!
455
- Otherwise, you should have no trouble upgrading.
456
-
457
- * official iojs support
458
- * drop support for node.js `>= 0.11.0 < 0.11.16`
459
- * use `Object.setPrototypeOf()` instead of `__proto__`
460
- * update dependencies
461
-
462
- 0.16.0 / 2015-01-27
463
- ==================
464
-
465
- * add `res.append()`
466
- * fix path usage for node@0.11.15
467
-
468
- 0.15.0 / 2015-01-18
469
- ==================
470
-
471
- * add `this.href`
472
-
473
- 0.14.0 / 2014-12-15
474
- ==================
475
-
476
- * remove `x-powered-by` response header
477
- * fix the content type on plain-text redirects
478
- * add ctx.state
479
- * bump `co@4`
480
- * bump dependencies
481
-
482
- 0.13.0 / 2014-10-17
483
- ==================
484
-
485
- * add this.message
486
- * custom status support via `statuses`
487
-
488
- 0.12.2 / 2014-09-28
489
- ==================
490
-
491
- * use wider semver ranges for dependencies koa maintainers also maintain
492
-
493
- 0.12.1 / 2014-09-21
494
- ==================
495
-
496
- * bump content-disposition
497
- * bump statuses
498
-
499
- 0.12.0 / 2014-09-20
500
- ==================
501
-
502
- * add this.assert()
503
- * use content-disposition
504
-
505
- 0.11.0 / 2014-09-08
506
- ==================
507
-
508
- * fix app.use() assertion #337
509
- * bump a lot of dependencies
510
-
511
- 0.10.0 / 2014-08-12
512
- ==================
513
-
514
- * add `ctx.throw(err, object)` support
515
- * add `ctx.throw(err, status, object)` support
516
-
517
- 0.9.0 / 2014-08-07
518
- ==================
519
-
520
- * add: do not set `err.expose` to true when err.status not a valid http status code
521
- * add: alias `request.headers` as `request.header`
522
- * add context.inspect(), cleanup app.inspect()
523
- * update cookies
524
- * fix `err.status` invalid lead to uncaughtException
525
- * fix middleware gif, close #322
526
-
527
- 0.8.2 / 2014-07-27
528
- ==================
529
-
530
- * bump co
531
- * bump parseurl
532
-
533
- 0.8.1 / 2014-06-24
534
- ==================
535
-
536
- * bump type-is
537
-
538
- 0.8.0 / 2014-06-13
539
- ==================
540
-
541
- * add `this.response.is()``
542
- * remove `.status=string` and `res.statusString` #298
543
-
544
- 0.7.0 / 2014-06-07
545
- ==================
546
-
547
- * add `this.lastModified` and `this.etag` as both getters and setters for ubiquity #292.
548
- See koajs/koa@4065bf7 for an explanation.
549
- * refactor `this.response.vary()` to use [vary](https://github.com/expressjs/vary) #291
550
- * remove `this.response.append()` #291
551
-
552
- 0.6.3 / 2014-06-06
553
- ==================
554
-
555
- * fix res.type= when the extension is unknown
556
- * assert when non-error is passed to app.onerror #287
557
- * bump finished
558
-
559
- 0.6.2 / 2014-06-03
560
- ==================
561
-
562
- * switch from set-type to mime-types
563
-
564
- 0.6.1 / 2014-05-11
565
- ==================
566
-
567
- * bump type-is
568
- * bump koa-compose
569
-
570
- 0.6.0 / 2014-05-01
571
- ==================
572
-
573
- * add nicer error formatting
574
- * add: assert object type in ctx.onerror
575
- * change .status default to 404. Closes #263
576
- * remove .outputErrors, suppress output when handled by the dev. Closes #272
577
- * fix content-length when body is re-assigned. Closes #267
578
-
579
- 0.5.5 / 2014-04-14
580
- ==================
581
-
582
- * fix length when .body is missing
583
- * fix: make sure all intermediate stream bodies will be destroyed
584
-
585
- 0.5.4 / 2014-04-12
586
- ==================
587
-
588
- * fix header stripping in a few cases
589
-
590
- 0.5.3 / 2014-04-09
591
- ==================
592
-
593
- * change res.type= to always default charset. Closes #252
594
- * remove ctx.inspect() implementation. Closes #164
595
-
596
- 0.5.2 / 2014-03-23
597
- ==================
598
-
599
- * fix: inspection of `app` and `app.toJSON()`
600
- * fix: let `this.throw`n errors provide their own status
601
- * fix: overwriting of `content-type` w/ `HEAD` requests
602
- * refactor: use statuses
603
- * refactor: use escape-html
604
- * bump dev deps
605
-
606
- 0.5.1 / 2014-03-06
607
- ==================
608
-
609
- * add request.hostname(getter). Closes #224
610
- * remove response.charset and ctx.charset (too confusing in relation to ctx.type) [breaking change]
611
- * fix a debug() name
612
-
613
- 0.5.0 / 2014-02-19
614
- ==================
615
-
616
- * add context.charset
617
- * add context.charset=
618
- * add request.charset
619
- * add response.charset
620
- * add response.charset=
621
- * fix response.body= html content sniffing
622
- * change ctx.length and ctx.type to always delegate to response object [breaking change]
623
-
624
- 0.4.0 / 2014-02-11
625
- ==================
626
-
627
- * remove app.jsonSpaces settings - moved to [koa-json](https://github.com/koajs/json)
628
- * add this.response=false to bypass koa's response handling
629
- * fix response handling after body has been sent
630
- * changed ctx.throw() to no longer .expose 5xx errors
631
- * remove app.keys getter/setter, update cookies, and remove keygrip deps
632
- * update fresh
633
- * update koa-compose
634
-
635
- 0.3.0 / 2014-01-17
636
- ==================
637
-
638
- * add ctx.host= delegate
639
- * add req.host=
640
- * add: context.throw supports Error instances
641
- * update co
642
- * update cookies
643
-
644
- 0.2.1 / 2013-12-30
645
- ==================
646
-
647
- * add better 404 handling
648
- * add check for fn._name in debug() output
649
- * add explicit .toJSON() calls to ctx.toJSON()
650
-
651
- 0.2.0 / 2013-12-28
652
- ==================
653
-
654
- * add support for .throw(status, msg). Closes #130
655
- * add GeneratorFunction assertion for app.use(). Closes #120
656
- * refactor: move `.is()` to `type-is`
657
- * refactor: move content negotiation to "accepts"
658
- * refactor: allow any streams with .pipe method
659
- * remove `next` in callback for now
660
-
661
- 0.1.2 / 2013-12-21
662
- ==================
663
-
664
- * update co, koa-compose, keygrip
665
- * use on-socket-error
666
- * add throw(status, msg) support
667
- * assert middleware is GeneratorFunction
668
- * ducktype stream checks
669
- * remove `next` is `app.callback()`
670
-
671
- 0.1.1 / 2013-12-19
672
- ==================
673
-
674
- * fix: cleanup socker error handler on response