...**/!(*.map|*.min.js)Size
Gzip
Dependencies
Publish
Install
Publish
Install
@@ -14,18 +14,16 @@ | ||
| 14 | 14 | */ |
| 15 | 15 | |
| 16 | 16 | var finalhandler = require('finalhandler'); |
| 17 | var methods = require('methods'); | |
| 18 | 17 | var debug = require('debug')('express:application'); |
| 19 | 18 | var View = require('./view'); |
| 20 | var http = require('http'); | |
| 19 | var http = require('node:http'); | |
| 20 | var methods = require('./utils').methods; | |
| 21 | 21 | var compileETag = require('./utils').compileETag; |
| 22 | 22 | var compileQueryParser = require('./utils').compileQueryParser; |
| 23 | 23 | var compileTrust = require('./utils').compileTrust; |
| 24 | var merge = require('utils-merge'); | |
| 25 | var resolve = require('path').resolve; | |
| 24 | var resolve = require('node:path').resolve; | |
| 26 | 25 | var once = require('once') |
| 27 | 26 | var Router = require('router'); |
| 28 | var setPrototypeOf = require('setprototypeof') | |
| 29 | 27 | |
| 30 | 28 | /** |
| 31 | 29 | * Module variables. |
@@ -117,10 +115,10 @@ | ||
| 117 | 115 | } |
| 118 | 116 | |
| 119 | 117 | // inherit protos |
| 120 | setPrototypeOf(this.request, parent.request) | |
| 121 | setPrototypeOf(this.response, parent.response) | |
| 122 | setPrototypeOf(this.engines, parent.engines) | |
| 123 | setPrototypeOf(this.settings, parent.settings) | |
| 118 | Object.setPrototypeOf(this.request, parent.request) | |
| 119 | Object.setPrototypeOf(this.response, parent.response) | |
| 120 | Object.setPrototypeOf(this.engines, parent.engines) | |
| 121 | Object.setPrototypeOf(this.settings, parent.settings) | |
| 124 | 122 | }); |
| 125 | 123 | |
| 126 | 124 | // setup locals |
@@ -168,8 +166,8 @@ | ||
| 168 | 166 | res.req = req; |
| 169 | 167 | |
| 170 | 168 | // alter the prototypes |
| 171 | setPrototypeOf(req, this.request) | |
| 172 | setPrototypeOf(res, this.response) | |
| 169 | Object.setPrototypeOf(req, this.request) | |
| 170 | Object.setPrototypeOf(res, this.response) | |
| 173 | 171 | |
| 174 | 172 | // setup locals |
| 175 | 173 | if (!res.locals) { |
@@ -232,8 +230,8 @@ | ||
| 232 | 230 | router.use(path, function mounted_app(req, res, next) { |
| 233 | 231 | var orig = req.app; |
| 234 | 232 | fn.handle(req, res, function (err) { |
| 235 | setPrototypeOf(req, orig.request) | |
| 236 | setPrototypeOf(res, orig.response) | |
| 233 | Object.setPrototypeOf(req, orig.request) | |
| 234 | Object.setPrototypeOf(res, orig.response) | |
| 237 | 235 | next(err); |
| 238 | 236 | }); |
| 239 | 237 | }); |
@@ -470,8 +468,8 @@ | ||
| 470 | 468 | * Delegate `.VERB(...)` calls to `router.VERB(...)`. |
| 471 | 469 | */ |
| 472 | 470 | |
| 473 | methods.forEach(function(method){ | |
| 474 | app[method] = function(path){ | |
| 471 | methods.forEach(function (method) { | |
| 472 | app[method] = function (path) { | |
| 475 | 473 | if (method === 'get' && arguments.length === 1) { |
| 476 | 474 | // app.get(setting) |
| 477 | 475 | return this.set(path); |
@@ -526,7 +524,6 @@ | ||
| 526 | 524 | var done = callback; |
| 527 | 525 | var engines = this.engines; |
| 528 | 526 | var opts = options; |
| 529 | var renderOptions = {}; | |
| 530 | 527 | var view; |
| 531 | 528 | |
| 532 | 529 | // support callback function as second arg |
@@ -535,16 +532,8 @@ | ||
| 535 | 532 | opts = {}; |
| 536 | 533 | } |
| 537 | 534 | |
| 538 | // merge app.locals | |
| 539 | merge(renderOptions, this.locals); | |
| 540 | ||
| 541 | // merge options._locals | |
| 542 | if (opts._locals) { | |
| 543 | merge(renderOptions, opts._locals); | |
| 544 | } | |
| 545 | ||
| 546 | 535 | // merge options |
| 547 | merge(renderOptions, opts); | |
| 536 | var renderOptions = { ...this.locals, ...opts._locals, ...opts }; | |
| 548 | 537 | |
| 549 | 538 | // set .cache unless explicitly provided |
| 550 | 539 | if (renderOptions.cache == null) { |
@@ -594,8 +583,8 @@ | ||
| 594 | 583 | * and HTTPS server you may do so with the "http" |
| 595 | 584 | * and "https" modules as shown here: |
| 596 | 585 | * |
| 597 | * var http = require('http') | |
| 598 | * , https = require('https') | |
| 586 | * var http = require('node:http') | |
| 587 | * , https = require('node:https') | |
| 599 | 588 | * , express = require('express') |
| 600 | 589 | * , app = express(); |
| 601 | 590 | * |
@@ -606,7 +595,7 @@ | ||
| 606 | 595 | * @public |
| 607 | 596 | */ |
| 608 | 597 | |
| 609 | app.listen = function listen () { | |
| 598 | app.listen = function listen() { | |
| 610 | 599 | var server = http.createServer(this) |
| 611 | 600 | var args = Array.prototype.slice.call(arguments) |
| 612 | 601 | if (typeof args[args.length - 1] === 'function') { |
@@ -13,7 +13,7 @@ | ||
| 13 | 13 | */ |
| 14 | 14 | |
| 15 | 15 | var bodyParser = require('body-parser') |
| 16 | var EventEmitter = require('events').EventEmitter; | |
| 16 | var EventEmitter = require('node:events').EventEmitter; | |
| 17 | 17 | var mixin = require('merge-descriptors'); |
| 18 | 18 | var proto = require('./application'); |
| 19 | 19 | var Router = require('router'); |
@@ -14,9 +14,9 @@ | ||
| 14 | 14 | */ |
| 15 | 15 | |
| 16 | 16 | var accepts = require('accepts'); |
| 17 | var isIP = require('net').isIP; | |
| 17 | var isIP = require('node:net').isIP; | |
| 18 | 18 | var typeis = require('type-is'); |
| 19 | var http = require('http'); | |
| 19 | var http = require('node:http'); | |
| 20 | 20 | var fresh = require('fresh'); |
| 21 | 21 | var parseRange = require('range-parser'); |
| 22 | 22 | var parse = require('parseurl'); |
@@ -12,18 +12,16 @@ | ||
| 12 | 12 | * @private |
| 13 | 13 | */ |
| 14 | 14 | |
| 15 | var Buffer = require('safe-buffer').Buffer | |
| 16 | 15 | var contentDisposition = require('content-disposition'); |
| 17 | 16 | var createError = require('http-errors') |
| 18 | 17 | var encodeUrl = require('encodeurl'); |
| 19 | 18 | var escapeHtml = require('escape-html'); |
| 20 | var http = require('http'); | |
| 19 | var http = require('node:http'); | |
| 21 | 20 | var onFinished = require('on-finished'); |
| 22 | 21 | var mime = require('mime-types') |
| 23 | var path = require('path'); | |
| 24 | var pathIsAbsolute = require('path').isAbsolute; | |
| 22 | var path = require('node:path'); | |
| 23 | var pathIsAbsolute = require('node:path').isAbsolute; | |
| 25 | 24 | var statuses = require('statuses') |
| 26 | var merge = require('utils-merge'); | |
| 27 | 25 | var sign = require('cookie-signature').sign; |
| 28 | 26 | var normalizeType = require('./utils').normalizeType; |
| 29 | 27 | var normalizeTypes = require('./utils').normalizeTypes; |
@@ -82,7 +80,11 @@ | ||
| 82 | 80 | * |
| 83 | 81 | * res.links({ |
| 84 | 82 | * next: 'http://api.example.com/users?page=2', |
| 85 | * last: 'http://api.example.com/users?page=5' | |
| 83 | * last: 'http://api.example.com/users?page=5', | |
| 84 | * pages: [ | |
| 85 | * 'http://api.example.com/users?page=1', | |
| 86 | * 'http://api.example.com/users?page=2' | |
| 87 | * ] | |
| 86 | 88 | * }); |
| 87 | 89 | * |
| 88 | 90 | * @param {Object} links |
@@ -90,11 +92,18 @@ | ||
| 90 | 92 | * @public |
| 91 | 93 | */ |
| 92 | 94 | |
| 93 | res.links = function(links){ | |
| 95 | res.links = function(links) { | |
| 94 | 96 | var link = this.get('Link') || ''; |
| 95 | 97 | if (link) link += ', '; |
| 96 | return this.set('Link', link + Object.keys(links).map(function(rel){ | |
| 97 | return '<' + links[rel] + '>; rel="' + rel + '"'; | |
| 98 | return this.set('Link', link + Object.keys(links).map(function(rel) { | |
| 99 | // Allow multiple links if links[rel] is an array | |
| 100 | if (Array.isArray(links[rel])) { | |
| 101 | return links[rel].map(function (singleLink) { | |
| 102 | return `<${singleLink}>; rel="${rel}"`; | |
| 103 | }).join(', '); | |
| 104 | } else { | |
| 105 | return `<${links[rel]}>; rel="${rel}"`; | |
| 106 | } | |
| 98 | 107 | }).join(', ')); |
| 99 | 108 | }; |
| 100 | 109 | |
@@ -132,7 +141,7 @@ | ||
| 132 | 141 | case 'object': |
| 133 | 142 | if (chunk === null) { |
| 134 | 143 | chunk = ''; |
| 135 | } else if (Buffer.isBuffer(chunk)) { | |
| 144 | } else if (ArrayBuffer.isView(chunk)) { | |
| 136 | 145 | if (!this.get('Content-Type')) { |
| 137 | 146 | this.type('bin'); |
| 138 | 147 | } |
@@ -391,6 +400,9 @@ | ||
| 391 | 400 | |
| 392 | 401 | // create file stream |
| 393 | 402 | var pathname = encodeURI(path); |
| 403 | ||
| 404 | // wire application etag option to send | |
| 405 | opts.etag = this.app.enabled('etag'); | |
| 394 | 406 | var file = send(req, pathname, opts); |
| 395 | 407 | |
| 396 | 408 | // transfer |
@@ -733,7 +745,7 @@ | ||
| 733 | 745 | */ |
| 734 | 746 | |
| 735 | 747 | res.cookie = function (name, value, options) { |
| 736 | var opts = merge({}, options); | |
| 748 | var opts = { ...options }; | |
| 737 | 749 | var secret = this.req.secret; |
| 738 | 750 | var signed = opts.signed; |
| 739 | 751 | |
@@ -12,7 +12,7 @@ | ||
| 12 | 12 | * @api private |
| 13 | 13 | */ |
| 14 | 14 | |
| 15 | var Buffer = require('safe-buffer').Buffer | |
| 15 | var { METHODS } = require('node:http'); | |
| 16 | 16 | var contentType = require('content-type'); |
| 17 | 17 | var etag = require('etag'); |
| 18 | 18 | var mime = require('mime-types') |
@@ -21,6 +21,12 @@ | ||
| 21 | 21 | var querystring = require('querystring'); |
| 22 | 22 | |
| 23 | 23 | /** |
| 24 | * A list of lowercased HTTP methods that are supported by Node.js. | |
| 25 | * @api private | |
| 26 | */ | |
| 27 | exports.methods = METHODS.map((method) => method.toLowerCase()); | |
| 28 | ||
| 29 | /** | |
| 24 | 30 | * Return strong ETag for `body`. |
| 25 | 31 | * |
| 26 | 32 | * @param {String|Buffer} body |
@@ -64,16 +70,11 @@ | ||
| 64 | 70 | * @api private |
| 65 | 71 | */ |
| 66 | 72 | |
| 67 | exports.normalizeTypes = function(types){ | |
| 68 | var ret = []; | |
| 73 | exports.normalizeTypes = function(types) { | |
| 74 | return types.map(exports.normalizeType); | |
| 75 | }; | |
| 69 | 76 | |
| 70 | for (var i = 0; i < types.length; ++i) { | |
| 71 | ret.push(exports.normalizeType(types[i])); | |
| 72 | } | |
| 73 | 77 | |
| 74 | return ret; | |
| 75 | }; | |
| 76 | ||
| 77 | 78 | /** |
| 78 | 79 | * Parse accept params `str` returning an |
| 79 | 80 | * object with `.value`, `.quality` and `.params`. |
@@ -84,16 +85,33 @@ | ||
| 84 | 85 | */ |
| 85 | 86 | |
| 86 | 87 | function acceptParams (str) { |
| 87 | var parts = str.split(/ *; */); | |
| 88 | var ret = { value: parts[0], quality: 1, params: {} } | |
| 88 | var length = str.length; | |
| 89 | var colonIndex = str.indexOf(';'); | |
| 90 | var index = colonIndex === -1 ? length : colonIndex; | |
| 91 | var ret = { value: str.slice(0, index).trim(), quality: 1, params: {} }; | |
| 89 | 92 | |
| 90 | for (var i = 1; i < parts.length; ++i) { | |
| 91 | var pms = parts[i].split(/ *= */); | |
| 92 | if ('q' === pms[0]) { | |
| 93 | ret.quality = parseFloat(pms[1]); | |
| 93 | while (index < length) { | |
| 94 | var splitIndex = str.indexOf('=', index); | |
| 95 | if (splitIndex === -1) break; | |
| 96 | ||
| 97 | var colonIndex = str.indexOf(';', index); | |
| 98 | var endIndex = colonIndex === -1 ? length : colonIndex; | |
| 99 | ||
| 100 | if (splitIndex > endIndex) { | |
| 101 | index = str.lastIndexOf(';', splitIndex - 1) + 1; | |
| 102 | continue; | |
| 103 | } | |
| 104 | ||
| 105 | var key = str.slice(index, splitIndex).trim(); | |
| 106 | var value = str.slice(splitIndex + 1, endIndex).trim(); | |
| 107 | ||
| 108 | if (key === 'q') { | |
| 109 | ret.quality = parseFloat(value); | |
| 94 | 110 | } else { |
| 95 | ret.params[pms[0]] = pms[1]; | |
| 111 | ret.params[key] = value; | |
| 96 | 112 | } |
| 113 | ||
| 114 | index = endIndex + 1; | |
| 97 | 115 | } |
| 98 | 116 | |
| 99 | 117 | return ret; |
@@ -1,7 +1,7 @@ | ||
| 1 | 1 | { |
| 2 | 2 | "name": "express", |
| 3 | 3 | "description": "Fast, unopinionated, minimalist web framework", |
| 4 | "version": "5.0.1", | |
| 4 | "version": "5.1.0", | |
| 5 | 5 | "author": "TJ Holowaychuk <tj@vision-media.ca>", |
| 6 | 6 | "contributors": [ |
| 7 | 7 | "Aaron Heckmann <aaron.heckmann+github@gmail.com>", |
@@ -14,7 +14,11 @@ | ||
| 14 | 14 | ], |
| 15 | 15 | "license": "MIT", |
| 16 | 16 | "repository": "expressjs/express", |
| 17 | "homepage": "http://expressjs.com/", | |
| 17 | "homepage": "https://expressjs.com/", | |
| 18 | "funding": { | |
| 19 | "type": "opencollective", | |
| 20 | "url": "https://opencollective.com/express" | |
| 21 | }, | |
| 18 | 22 | "keywords": [ |
| 19 | 23 | "express", |
| 20 | 24 | "framework", |
@@ -29,54 +33,49 @@ | ||
| 29 | 33 | ], |
| 30 | 34 | "dependencies": { |
| 31 | 35 | "accepts": "^2.0.0", |
| 32 | "body-parser": "^2.0.1", | |
| 36 | "body-parser": "^2.2.0", | |
| 33 | 37 | "content-disposition": "^1.0.0", |
| 34 | "content-type": "~1.0.4", | |
| 35 | "cookie": "0.7.1", | |
| 38 | "content-type": "^1.0.5", | |
| 39 | "cookie": "^0.7.1", | |
| 36 | 40 | "cookie-signature": "^1.2.1", |
| 37 | "debug": "4.3.6", | |
| 38 | "depd": "2.0.0", | |
| 39 | "encodeurl": "~2.0.0", | |
| 40 | "escape-html": "~1.0.3", | |
| 41 | "etag": "~1.8.1", | |
| 42 | "finalhandler": "^2.0.0", | |
| 43 | "fresh": "2.0.0", | |
| 44 | "http-errors": "2.0.0", | |
| 41 | "debug": "^4.4.0", | |
| 42 | "encodeurl": "^2.0.0", | |
| 43 | "escape-html": "^1.0.3", | |
| 44 | "etag": "^1.8.1", | |
| 45 | "finalhandler": "^2.1.0", | |
| 46 | "fresh": "^2.0.0", | |
| 47 | "http-errors": "^2.0.0", | |
| 45 | 48 | "merge-descriptors": "^2.0.0", |
| 46 | "methods": "~1.1.2", | |
| 47 | 49 | "mime-types": "^3.0.0", |
| 48 | "on-finished": "2.4.1", | |
| 49 | "once": "1.4.0", | |
| 50 | "parseurl": "~1.3.3", | |
| 51 | "proxy-addr": "~2.0.7", | |
| 52 | "qs": "6.13.0", | |
| 53 | "range-parser": "~1.2.1", | |
| 54 | "router": "^2.0.0", | |
| 55 | "safe-buffer": "5.2.1", | |
| 50 | "on-finished": "^2.4.1", | |
| 51 | "once": "^1.4.0", | |
| 52 | "parseurl": "^1.3.3", | |
| 53 | "proxy-addr": "^2.0.7", | |
| 54 | "qs": "^6.14.0", | |
| 55 | "range-parser": "^1.2.1", | |
| 56 | "router": "^2.2.0", | |
| 56 | 57 | "send": "^1.1.0", |
| 57 | "serve-static": "^2.1.0", | |
| 58 | "setprototypeof": "1.2.0", | |
| 59 | "statuses": "2.0.1", | |
| 60 | "type-is": "^2.0.0", | |
| 61 | "utils-merge": "1.0.1", | |
| 62 | "vary": "~1.1.2" | |
| 58 | "serve-static": "^2.2.0", | |
| 59 | "statuses": "^2.0.1", | |
| 60 | "type-is": "^2.0.1", | |
| 61 | "vary": "^1.1.2" | |
| 63 | 62 | }, |
| 64 | 63 | "devDependencies": { |
| 65 | 64 | "after": "0.8.2", |
| 66 | "connect-redis": "3.4.2", | |
| 67 | "cookie-parser": "1.4.6", | |
| 68 | "cookie-session": "2.0.0", | |
| 69 | "ejs": "3.1.9", | |
| 65 | "connect-redis": "^8.0.1", | |
| 66 | "cookie-parser": "1.4.7", | |
| 67 | "cookie-session": "2.1.0", | |
| 68 | "ejs": "^3.1.10", | |
| 70 | 69 | "eslint": "8.47.0", |
| 71 | "express-session": "1.17.2", | |
| 70 | "express-session": "^1.18.1", | |
| 72 | 71 | "hbs": "4.2.0", |
| 73 | "marked": "0.7.0", | |
| 72 | "marked": "^15.0.3", | |
| 74 | 73 | "method-override": "3.0.0", |
| 75 | "mocha": "10.2.0", | |
| 74 | "mocha": "^10.7.3", | |
| 76 | 75 | "morgan": "1.10.0", |
| 77 | "nyc": "15.1.0", | |
| 76 | "nyc": "^17.1.0", | |
| 78 | 77 | "pbkdf2-password": "1.2.1", |
| 79 | "supertest": "6.3.0", | |
| 78 | "supertest": "^6.3.0", | |
| 80 | 79 | "vhost": "~3.0.2" |
| 81 | 80 | }, |
| 82 | 81 | "engines": { |
@@ -1,3 +1,26 @@ | ||
| 1 | 5.1.0 / 2025-03-31 | |
| 2 | ======================== | |
| 3 | ||
| 4 | * Add support for `Uint8Array` in `res.send()` | |
| 5 | * Add support for ETag option in `res.sendFile()` | |
| 6 | * Add support for multiple links with the same rel in `res.links()` | |
| 7 | * Add funding field to package.json | |
| 8 | * perf: use loop for acceptParams | |
| 9 | * refactor: prefix built-in node module imports | |
| 10 | * deps: remove `setprototypeof` | |
| 11 | * deps: remove `safe-buffer` | |
| 12 | * deps: remove `utils-merge` | |
| 13 | * deps: remove `methods` | |
| 14 | * deps: remove `depd` | |
| 15 | * deps: `debug@^4.4.0` | |
| 16 | * deps: `body-parser@^2.2.0` | |
| 17 | * deps: `router@^2.2.0` | |
| 18 | * deps: `content-type@^1.0.5` | |
| 19 | * deps: `finalhandler@^2.1.0` | |
| 20 | * deps: `qs@^6.14.0` | |
| 21 | * deps: `server-static@2.2.0` | |
| 22 | * deps: `type-is@2.0.1` | |
| 23 | ||
| 1 | 24 | 5.0.1 / 2024-10-08 |
| 2 | 25 | ========== |
| 3 | 26 | |
@@ -76,6 +99,7 @@ | ||
| 76 | 99 | - Change `dotfiles` option default to `'ignore'` |
| 77 | 100 | - Remove `hidden` option; use `dotfiles` option instead |
| 78 | 101 | - Use `mime-types` for file to content type mapping |
| 102 | - Remove `express.static.mime` export; use `mime-types` package instead | |
| 79 | 103 | - deps: send@1.0.0-beta.1 |
| 80 | 104 | |
| 81 | 105 | 5.0.0-alpha.8 / 2020-03-25 |