Compare commits

..

642 Commits

Author SHA1 Message Date
dependabot[bot]
4453d83cca
build(deps): bump actions/upload-artifact from 4.6.2 to 5.0.0 (#6868)
Some checks failed
ci / Lint (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (18, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (18, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (19, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (19, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (20, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (20, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (21, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (21, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (22, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (22, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (23, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (23, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (24, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (24, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (25, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (25, windows-latest) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
legacy / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (16, ubuntu-latest) (push) Has been cancelled
legacy / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (16, windows-latest) (push) Has been cancelled
legacy / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (17, ubuntu-latest) (push) Has been cancelled
legacy / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (17, windows-latest) (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
ci / coverage (push) Has been cancelled
legacy / coverage (push) Has been cancelled
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-01 10:46:37 +01:00
dependabot[bot]
db507669ca
build(deps): bump github/codeql-action from 3.30.5 to 4.31.2 (#6869)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-01 10:45:51 +01:00
dependabot[bot]
374fc1a0f9
build(deps): bump actions/setup-node from 5.0.0 to 6.0.0 (#6870)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-01 10:45:07 +01:00
dependabot[bot]
1b196c8b82
build(deps): bump actions/download-artifact from 5.0.0 to 6.0.0 (#6871)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-01 10:44:12 +01:00
Phillip Barta
64e7373d69
ci: add node.js 25 to test matrix (#6843) 2025-10-16 13:51:39 +02:00
dependabot[bot]
e4fb370ad8
build(deps): bump actions/download-artifact from 4.3.0 to 5.0.0 (#6793)
Some checks failed
ci / Lint (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (18, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (18, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (19, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (19, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (20, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (20, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (21, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (21, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (22, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (22, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (23, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (23, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (24, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (24, windows-latest) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
legacy / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (16, ubuntu-latest) (push) Has been cancelled
legacy / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (16, windows-latest) (push) Has been cancelled
legacy / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (17, ubuntu-latest) (push) Has been cancelled
legacy / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (17, windows-latest) (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
ci / coverage (push) Has been cancelled
legacy / coverage (push) Has been cancelled
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4.3.0 to 5.0.0.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](d3f86a106a...634f93cb29)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-03 14:44:02 +02:00
dependabot[bot]
60d4c16cc9
build(deps): bump actions/setup-node from 4.4.0 to 5.0.0 (#6794)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4.4.0 to 5.0.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](49933ea528...a0853c2454)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-03 14:43:54 +02:00
dependabot[bot]
9e6760e186
build(deps): bump ossf/scorecard-action from 2.4.2 to 2.4.3 (#6795)
Bumps [ossf/scorecard-action](https://github.com/ossf/scorecard-action) from 2.4.2 to 2.4.3.
- [Release notes](https://github.com/ossf/scorecard-action/releases)
- [Changelog](https://github.com/ossf/scorecard-action/blob/main/RELEASE.md)
- [Commits](05b42c6244...4eaacf0543)

---
updated-dependencies:
- dependency-name: ossf/scorecard-action
  dependency-version: 2.4.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-03 14:43:45 +02:00
dependabot[bot]
ffa89f2ccf
build(deps): bump github/codeql-action from 3.29.7 to 3.30.5 (#6796)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.29.7 to 3.30.5.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](51f77329af...3599b3baa1)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 3.30.5
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-03 14:40:08 +02:00
dependabot[bot]
b9b9f52b2f
build(deps): bump actions/checkout from 4.2.2 to 5.0.0 (#6797)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4.2.2 to 5.0.0.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](11bd71901b...08c6903cd8)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-03 14:34:25 +02:00
Jean Burellier
9a7afb2886
chore: remove history.md from being packaged on publish (#6780) 2025-09-25 07:20:45 +02:00
dependabot[bot]
2eb42059f3
build(deps): bump github/codeql-action from 3.29.2 to 3.29.5 (#6675)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.29.2 to 3.29.5.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](181d5eefc2...51f77329af)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 3.29.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

Co-authored-by: bjohansebas <103585995+bjohansebas@users.noreply.github.com>
2025-09-14 09:39:32 -05:00
Shivam Sharma
aa907945cd
doc: update express app example (#6718) 2025-08-22 09:12:09 +02:00
Sebastian Beltran
89f198c6a5
lib: use req.socket over deprecated req.connection (#6705)
Signed-off-by: Sebastian Beltran <bjohansebas@gmail.com>
2025-08-21 10:05:29 -05:00
Shivam Sharma
d9a62f9833
chore: update git rules to ignore yarn.lock file (#6588)
Co-authored-by: Ulises Gascón <ulisesgascongonzalez@gmail.com>
2025-08-20 15:18:36 +02:00
Shivam Sharma
8f21493cc5
lint: add --fix flag to automatic fix linting issue (#6644)
* lint: add --fix flag to automatic fix linting issue

* add dedicated lint script
2025-08-12 17:58:13 -05:00
dependabot[bot]
6616e39d4d
build(deps-dev): bump cookie-session from 2.1.0 to 2.1.1 (#6678)
Bumps [cookie-session](https://github.com/expressjs/cookie-session) from 2.1.0 to 2.1.1.
- [Release notes](https://github.com/expressjs/cookie-session/releases)
- [Changelog](https://github.com/expressjs/cookie-session/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/cookie-session/compare/v2.1.0...v2.1.1)

---
updated-dependencies:
- dependency-name: cookie-session
  dependency-version: 2.1.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-05 20:24:48 -05:00
dependabot[bot]
ed64290e4a
build(deps-dev): bump morgan from 1.10.0 to 1.10.1 (#6679)
Bumps [morgan](https://github.com/expressjs/morgan) from 1.10.0 to 1.10.1.
- [Release notes](https://github.com/expressjs/morgan/releases)
- [Changelog](https://github.com/expressjs/morgan/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/morgan/compare/1.10.0...1.10.1)

---
updated-dependencies:
- dependency-name: morgan
  dependency-version: 1.10.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-05 20:24:22 -05:00
shubham oulkar
b52ff7ca60
update contributing and COC links (#6601) 2025-07-30 08:41:53 -05:00
Jon Church
9420cd3f9b
doc: fix the Contributing.md link (#6653) 2025-07-21 19:14:33 -04:00
Sebastian Beltran
ef5f2e13ef
ci: run CI when the markdown changes (#6632) 2025-07-15 21:27:50 -05:00
Sebastian Beltran
c5b8d55a6a
feat: add deprecation warnings for redirect arguments undefined (#6405) 2025-07-14 22:18:10 -05:00
dependabot[bot]
7a9311216a
build(deps): bump github/codeql-action from 3.28.18 to 3.29.2 (#6618)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.28.18 to 3.29.2.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](ff0a06e83c...181d5eefc2)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 3.29.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-09 10:27:41 +02:00
mountdisk
b0ed15b452
chore: fix typo (#6609)
Signed-off-by: mountdisk <mountdisk@icloud.com.>
2025-07-04 09:47:31 -05:00
Shivam Sharma
3910323d09
chore: use node protocol for node builtin module (#6520)
Co-authored-by: Sebastian Beltran <bjohansebas@gmail.com>
2025-07-02 21:33:10 -05:00
Shivam Sharma
98c85eb0dd
chore: enforce explicit Buffer import and add lint rule (#6525)
Signed-off-by: Shivam Sharma <meshivam81@gmail.com>
2025-06-27 20:10:36 -05:00
dependabot[bot]
a039e49175
build(deps): bump ossf/scorecard-action from 2.4.1 to 2.4.2 (#6548)
Bumps [ossf/scorecard-action](https://github.com/ossf/scorecard-action) from 2.4.1 to 2.4.2.
- [Release notes](https://github.com/ossf/scorecard-action/releases)
- [Changelog](https://github.com/ossf/scorecard-action/blob/main/RELEASE.md)
- [Commits](f49aabe0b5...05b42c6244)

---
updated-dependencies:
- dependency-name: ossf/scorecard-action
  dependency-version: 2.4.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-18 23:36:52 +02:00
dependabot[bot]
ffc562c7d1
build(deps): bump github/codeql-action from 3.28.16 to 3.28.18 (#6549)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.28.16 to 3.28.18.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](28deaeda66...ff0a06e83c)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 3.28.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-18 23:36:20 +02:00
Sebastian Beltran
52872b84ca
fix(docs): move documentation and charters to the discussions and .github … (#6427)
* docs: move documentation and charters to the discussions and .github repository

* Update Readme.md
2025-06-09 15:34:53 -05:00
kgarg1
b8ab46594d
test: add coverage for app.listen() variants (#6476)
Some checks failed
ci / Lint (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (18, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (18, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (19, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (19, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (20, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (20, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (21, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (21, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (22, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (22, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (23, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (23, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (24, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (24, windows-latest) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
legacy / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (16, ubuntu-latest) (push) Has been cancelled
legacy / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (16, windows-latest) (push) Has been cancelled
legacy / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (17, ubuntu-latest) (push) Has been cancelled
legacy / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (17, windows-latest) (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
ci / coverage (push) Has been cancelled
legacy / coverage (push) Has been cancelled
* test: add coverage for app.listen() variants

- verify alternate signatures (port+host+backlog)
- verify server.address() shape

* fix linter issue

---------

Co-authored-by: kuldeep <kuldeep@wanclouds.net>
2025-05-28 19:26:16 -05:00
Shivam Sharma
fedd60e642
ci: allow manual triggering of workflow (#6515) 2025-05-28 19:16:44 -05:00
Mert Şişmanoğlu
99a0bd3354
ci: disable credential persistence for checkout actions (#6522)
Signed-off-by: Mert Şişmanoğlu <mertssmnoglu@gmail.com>
2025-05-28 18:55:05 -05:00
Noritaka Kobayashi
dfd1851245
test: fix typos in test descriptions (#6535) 2025-05-27 10:36:50 +02:00
Jon Church
9f4dbe3a13
chore: wider range for query test skip (#6512) 2025-05-15 11:40:26 -05:00
Phillip Barta
9784321e89
ci: update codeql config (#6488) 2025-05-09 15:29:27 +02:00
Phillip Barta
ee1ef41bd3
ci: add node.js 24 to test matrix (#6504) 2025-05-07 21:08:25 -05:00
dependabot[bot]
1ca803dd55
build(deps): bump actions/download-artifact from 4.2.1 to 4.3.0 (#6496)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4.2.1 to 4.3.0.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](95815c38cf...d3f86a106a)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: 4.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-05 23:02:23 +02:00
dependabot[bot]
73555815b9
build(deps): bump actions/setup-node from 4.3.0 to 4.4.0 (#6497)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4.3.0 to 4.4.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](cdca7365b2...49933ea528)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: 4.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-05 23:02:09 +02:00
dependabot[bot]
a1161b4686
build(deps): bump github/codeql-action from 3.28.13 to 3.28.16 (#6498)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.28.13 to 3.28.16.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](1b549b9259...28deaeda66)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 3.28.16
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-05 23:01:58 +02:00
dufucun
f9954dd317
fix(test): remove duplicate word (#6456)
Signed-off-by: dufucun <dufuchun@sohu.com>
2025-04-16 11:18:38 -05:00
Ashish Sharma
5da5a11a49
increased code coverage of utils.js file (#6386)
Co-authored-by: Sebastian Beltran <bjohansebas@gmail.com>
2025-04-10 20:57:43 -05:00
Ayoub Mabrouk
3dc96995df
Refactor: simplify acceptsLanguages implementation using spread operator (#6137)
Refactored `req.acceptsLanguages` to use the spread operator for passing arguments directly to `accept.languages`, eliminating the need for `.apply`. This approach improves readability and streamlines the function call.
2025-04-10 20:49:23 -05:00
dependabot[bot]
fa40ecfe76
build(deps): bump github/codeql-action from 3.28.11 to 3.28.13 (#6429) 2025-04-04 21:53:14 -05:00
Wes Todd
cd7d4397c3 5.1.0 2025-03-28 13:29:16 -05:00
Ulises Gascón
4c4f3ea105
fix(deps): serve-static@^2.2.0 (#6418)
* Update package.json

* Update History.md

---------

Co-authored-by: Wes Todd <wes@wesleytodd.com>
2025-03-27 19:46:06 -05:00
Mert Can Altin
cb4c56e9a7
fix(docs): remove @mertcanaltin from Triagers (#6408)
* doc: remove @mertcanaltin from Triagers

* move emeritus

---------

Co-authored-by: Mert Can Altin <mert.altin@trendyol.com>
Co-authored-by: Wes Todd <wes@wesleytodd.com>
2025-03-27 18:43:18 -05:00
Phillip9587
7b44e1d850 ci: use full SHAs for github action versions
Ref: https://github.com/expressjs/security-wg/issues/2
2025-03-27 15:46:29 +01:00
Ulises Gascón
eb6d12587a
deps: router@^2.2.0 (#6417) 2025-03-27 02:47:40 +01:00
Ulises Gascón
f1a2dc884d
deps: type-is@^2.0.1 (#6420) 2025-03-27 02:32:28 +01:00
Ulises Gascón
6b51e8ef97
deps: body-parser@^2.2.0 (#6419) 2025-03-27 02:31:57 +01:00
dependabot[bot]
1f311c59d4
build(deps-dev): bump cookie-session from 2.0.0 to 2.1.0 (#6399)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-23 20:08:24 -05:00
Wes Todd
9e97144222
feat(deps): finalhandler@2.1.0 (#6373)
* feat(deps): finalhandler@2.1.0

* Update History.md

Co-authored-by: Phillip Barta <barta.phillip@gmail.com>

---------

Co-authored-by: Phillip Barta <barta.phillip@gmail.com>
Co-authored-by: Ulises Gascón <ulisesgascongonzalez@gmail.com>
2025-03-18 19:12:45 -05:00
dependabot[bot]
29d09803c1
build(deps): bump ossf/scorecard-action from 2.4.0 to 2.4.1 (#6397)
Bumps [ossf/scorecard-action](https://github.com/ossf/scorecard-action) from 2.4.0 to 2.4.1.
- [Release notes](https://github.com/ossf/scorecard-action/releases)
- [Changelog](https://github.com/ossf/scorecard-action/blob/main/RELEASE.md)
- [Commits](62b2cac7ed...f49aabe0b5)

---
updated-dependencies:
- dependency-name: ossf/scorecard-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-18 17:12:20 +01:00
dependabot[bot]
1d63162dbf
build(deps): bump github/codeql-action from 3.24.7 to 3.28.11 (#6398)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.24.7 to 3.28.11.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v3.24.7...6bb031afdd8eb862ea3fc1848194185e076637e5)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-18 17:11:59 +01:00
Sebastian Beltran
4a2175dfc9
fix dependabot config (#6392) 2025-03-16 17:44:57 -05:00
Ulises Gascón
0bb00e1906
ci: add dependabot (#5435)
Co-authored-by: Shivam Sharma <meshivam81@gmail.com>
Co-authored-by: Sebastian Beltran <bjohansebas@gmail.com>
2025-03-11 22:50:59 +01:00
Wes Todd
1e359f57fc
fix(deps): qs@^6.14.0 (#6374) 2025-03-11 22:49:58 +01:00
Ulises Gascón
9cbe2c2cbb
docs: add @dpopp07 to the triage team (#6352) 2025-03-11 22:49:08 +01:00
Sebastian Beltran
35e15362ab
fix(docs): clarify guidelines for becoming a committer (#6364)
* docs: clarify guidelines for becoming a committer

* Update Contributing.md

Co-authored-by: Chris de Almeida <ctcpip@users.noreply.github.com>

---------

Co-authored-by: Chris de Almeida <ctcpip@users.noreply.github.com>
2025-03-05 09:11:29 -06:00
Sebastian Beltran
90e522ac90
fix(docs): update guidance for triager nominations (#6349)
* docs: update guidance for triager nominations

* Update Contributing.md

Co-authored-by: Wes Todd <wes@wesleytodd.com>

* Update Contributing.md

---------

Co-authored-by: Wes Todd <wes@wesleytodd.com>
2025-03-04 08:09:18 -06:00
Ulises Gascón
59703c2321
docs: update emeritus triagers (#6345) 2025-02-27 22:47:13 +01:00
Andrea Polverino
caa4f68ee8
feat: Extend res.links() to allow adding multiple links with the same rel (closes #2729) (#4885)
Some checks failed
ci / Lint (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (18, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (18, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (19, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (19, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (20, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (20, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (21, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (21, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (22, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (22, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (23, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (23, windows-latest) (push) Has been cancelled
CodeQL / Analyze (push) Has been cancelled
legacy / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (16, ubuntu-latest) (push) Has been cancelled
legacy / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (16, windows-latest) (push) Has been cancelled
legacy / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (17, ubuntu-latest) (push) Has been cancelled
legacy / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (17, windows-latest) (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
ci / coverage (push) Has been cancelled
legacy / coverage (push) Has been cancelled
2025-02-14 10:20:53 -06:00
Phillip Barta
6ed3439584
fix(docs): Update multiple links to use https instead of http (#6338) 2025-02-14 09:51:27 -06:00
Juan José
327af123a1
feat: add support for ETag option in res.sendFile (#6073)
This patch introduces the ability to control the ETag generation
through the `res.sendFile` function. Specifically, the ETag option
is wired to the application's configuration, allowing it to be
enabled or disabled based on the app's settings.

Fixes: https://github.com/expressjs/express/issues/2294

Signed-off-by: Juan José Arboleda <soyjuanarbol@gmail.com>
2025-02-13 13:39:31 -06:00
Wes Todd
d2de128a32
fix (deps): update deps (#6337)
fix(deps): mocha@^10.7.3 (closes #6121)

fix(deps): marked@^15.0.3 (closes #6120)

fix(deps): express-session@^1.18.1 (closes #6119)

fix(deps): ejs@^3.1.10 (closes #6117)

fix(deps): content-type@^1.0.5 (closes #6115)

fix(deps): connect-redis@^8.0.1 (closes #6114)

fix(deps): supertest@^6.3.4 (closes #6112)

Co-authored-by: agungjati <agungjati94@gmail.com>
2025-02-13 10:44:50 -06:00
Agung Jati
2a53336e5d
fix(deps): nyc@^17.1.0 (#6122) 2025-02-12 10:47:19 -06:00
Ulises Gascón
a42413d4e3
fix(docs): Update repo captains (#6234)
* docs: update repo captains

* docs: update repo captain nomination policies

Ref: https://github.com/expressjs/express/pull/6234#issuecomment-2578555232
2025-02-12 10:22:11 -06:00
Wes Todd
c2f576cbe9
feat(deps): router@^2.1.0 (#6331) 2025-02-12 10:09:50 -06:00
Wes Todd
99473c593a
feat(deps): body-parser@^2.1.0 (#6332) 2025-02-12 09:44:53 -06:00
Dustin Popp
2d589b644a
fix(docs): retroactively note 5.0.0-beta.1 api change in history file (#6333)
Signed-off-by: Dustin Popp <dustinpopp@ibm.com>
2025-02-12 09:38:10 -06:00
Phillip Barta
85e48bb8c1
fix(deps): update debug to ^4.4.0 (#6313) 2025-02-10 13:41:39 -06:00
Alexander Cerutti
55869f49a6 feat: Added check to support Uint8Array in response sending (#6285)
Unified usage of ArrayBuffer.isView to comprehend Buffer and removed isView function check

Co-authored-by: Wes Todd <wes@wesleytodd.com>

Added Uint8Array test with encoding

fix: added history.md entry
2025-02-10 11:23:02 -06:00
Dustin Popp
af7cd90893
feat(deps): use carat notation for dependency versions (#6317)
Signed-off-by: Dustin Popp <dustinpopp@ibm.com>
Co-authored-by: Ulises Gascón <ulisesgascongonzalez@gmail.com>
2025-02-05 12:05:39 -06:00
Phillip Barta
ae6a4621bc
fix(ci): updated scorecard actions (#6322) 2025-02-05 11:40:08 -06:00
Phillip Barta
8d39345902
fix(ci): fix npm install --include typo (#6324) 2025-02-05 11:25:48 -06:00
Phillip Barta
a5cb681eb8
ci: updated github actions ci workflow (#6314) 2025-02-05 13:27:59 +01:00
Ayoub Mabrouk
511d9dfca8
refactor: simplify normalizeTypes function (#6097) 2025-02-04 11:59:48 +01:00
Ulises Gascón
7f13d572c1
docs: include team email in the security policy (#6278) 2025-02-04 11:28:18 +01:00
prajesh
62336717bf
fix: added a missing semicolon in css styles in examples/auth (#6297) 2025-01-26 11:54:07 +01:00
Sebastian Beltran
3bbffdc41c docs: add @Phillip9587 to the triage team 2025-01-23 09:51:45 -06:00
Ulises Gascón
ff86319ed5
ci: add support for OSSF scorecard reporting (#5431) 2025-01-15 07:39:30 +01:00
Hamir Mahal
1c5cf0fead refactor: remove Invalid action input 2025-01-14 13:01:39 -06:00
Jon Koops
256a3d1527 Remove unused depd dependency
Signed-off-by: Jon Koops <jonkoops@gmail.com>
2025-01-12 11:08:51 -06:00
Wes Todd
4f952a953b fix: remove download size badges 2025-01-11 11:12:04 -06:00
Szymon Łągiewka
41113599af fix(refactor): prefix built-in node module imports
Since v5 relies on node >= 18, this is now possible (since v16, v14.18.0
[^1][^2]).

It's functionally irrelevant:
1. It's not required for CJS nor ESM (with a few exceptions [^3])
2. It has no performance promises

However, there are upsides to this approach:
1. It brings clear boundaries to what's a built-in and what's an
external dependency
2. It reduces the risk of importing unwanted deps where a built-in is
expected
3. It's slightly more interoperable with other JS runtimes that provide
node compatibility[^4], albeit only during development. Once imported
from npm, built-ins are assumed.

[^1]:https://nodejs.org/docs/latest-v22.x/api/modules.html#built-in-modules
[^2]:https://github.com/nodejs/node/pull/37246
[^3]:https://nodejs.org/api/modules.html#built-in-modules-with-mandatory-node-prefix
[^4]:https://docs.deno.com/runtime/fundamentals/node/#using-node's-built-in-modules
2025-01-10 11:53:44 -06:00
AbdelMonaam Aouini
6a40af8293
fix(devdeps): update dev deps (#6211)
Co-authored-by: Monaam Aouini <abdelmonaem.aouini@mispay.co>
2025-01-08 14:45:36 -06:00
Phillip Barta
246f6f5aee
fix: Remove utils-merge dependency - use spread syntax instead (#6091) 2025-01-08 09:56:16 -06:00
Jon Koops
b11122be85
chore: replace methods dependency with standard library (#6196) 2025-01-02 08:00:30 +01:00
Sebastian Beltran
43020ff275
docs: clarify the security process in the triage role (#6217) 2024-12-20 18:18:55 +01:00
Shahan Arshad
e4a61bd88e
refactor: improve readability (#6173) 2024-11-27 21:22:22 +01:00
Ulises Gascón
39f5d633b5
docs: add @rxmarbles to the triage team (#6151) 2024-11-27 19:59:36 +01:00
Jon Church
52ed64606f
update history.md for acceptParams change (#6177) 2024-11-20 14:40:39 -05:00
Phillip Barta
4e92ac9031
cleanup: remove AsyncLocalStorage check from tests (#6147)
Co-authored-by: Wes Todd <wes@wesleytodd.com>
2024-11-15 10:23:42 -06:00
Phillip9587
9f8589e31c cleanup: remove unnecessary require for global Buffer
The Buffer object is globally available in Node.js, so there is no need to explicitly require it.
2024-11-15 10:16:29 -06:00
Sebastian Beltran
cc751cff8f improve step update documentation 2024-11-15 08:53:37 -06:00
Blake Embrey
805ef52ae6
Use loop for acceptParams (#6066) 2024-11-14 16:01:25 -05:00
Phillip Barta
9e3dbb4374
chore(test): remove promise support check from tests (#6148)
Promises are supported in all supported Node.js version so the check is unnecessary
2024-11-12 09:30:34 -06:00
Ulises Gascón
b31910c542
docs: Add DCO (#6048)
Co-authored-by: Chris de Almeida <ctcpip@users.noreply.github.com>
2024-10-29 13:35:44 +01:00
Bhavya Dhiman
c70197ad33
fix(buffer): use node:buffer instead of safe-buffer (#6071)
Main Changes:
- Removed dependency `safe-buffer@5.2.1`
- Use `node:buffer` core library instead of safe-buffer
2024-10-27 11:10:33 +01:00
Phillip Barta
8cb53ea5c3
refactor: Remove Object.setPrototypeOf polyfill (#6081) 2024-10-22 20:22:26 +02:00
Rand McKinney
e162764f0f
docs: add bjohansebas as repo captain for expressjs.com (#6058) 2024-10-20 20:10:23 +02:00
Sebastian Beltran
508c74091f
docs: update readme (#5994) 2024-10-20 20:09:00 +02:00
Sebastian Beltran
b274047a5d
docs: update homepage link http to https (#5920)
Co-authored-by: Ulises Gascón <ulisesgascongonzalez@gmail.com>
2024-10-20 20:07:22 +02:00
Chris de Almeida
082d6d1253
test: add discarded middleware test (#5819) 2024-10-20 20:06:49 +02:00
Sebastian Beltran
94546a3cc5
docs: add funding (#6064) 2024-10-20 19:58:49 +02:00
Sebastian Beltran
ab02240336
build: Node.js 23.0 (#6075) 2024-10-20 19:25:56 +02:00
Ulises Gascón
a46cfdc37f
docs: update captains
PR-URL: https://github.com/expressjs/express/pull/6027
2024-10-09 21:40:05 +02:00
Ulises Gascón
d14b2de782
5.0.1
PR-URL: https://github.com/expressjs/express/pull/6032
2024-10-08 21:31:10 +02:00
Josh Buker
2027b87a27
fix(deps): cookie@0.7.0
Co-authored-by: Ulises Gascón <ulisesgascongonzalez@gmail.com>
2024-10-08 12:10:56 +02:00
Blake Embrey
2cbf22721d
Link and update captains (#6013) 2024-10-06 14:06:57 -07:00
Ulises Gascón
3e1a1cedb2
Add @bjohansebas to the triage team (#6009)
Co-authored-by: Sebastian Beltran <bjohansebas@gmail.com>
2024-10-06 17:34:26 +02:00
Jon Church
6340d1509f
remove --bail from test script (#5962) 2024-09-30 16:49:26 -04:00
Wes Todd
344b022fc7 5.0.0
closes #2237
closes https://github.com/expressjs/discussions/issues/233
2024-09-09 23:37:22 -05:00
Wes Todd
0c49926a9b fix(deps): send@^1.1.0 2024-09-09 23:34:03 -05:00
Wes Todd
b3906cbdde fix(deps): serve-static@^2.1.0 2024-09-09 23:32:19 -05:00
Wes Todd
fed8c2a885 fix(deps): body-parser@^2.0.1 2024-09-09 23:27:40 -05:00
Blake Embrey
bdd81f8670
Delete back as a magic string (#5933) 2024-09-09 20:28:55 -07:00
ctcpip
6c98f80b6a 🔧 update CI, remove unsupported versions, clean up 2024-09-09 21:49:35 -05:00
Wes Todd
f9256ef36f
Merge branch '5.0' into 5-merge 2024-09-09 21:11:23 -05:00
Wes Todd
e5feb9fcc9 Merge tag '4.20.0' into 5.0 2024-09-09 21:07:57 -05:00
Ulises Gascón
21df421ebc
4.20.0 2024-09-10 04:01:43 +02:00
Ulises Gascón
4c9ddc1c47
feat: upgrade to serve-static@0.16.0 2024-09-10 04:01:43 +02:00
Ulises Gascón
9ebe5d500d
feat: upgrade to send@0.19.0 (#5928) 2024-09-10 04:01:43 +02:00
Ulises Gascón
ec4a01b6b8
feat: upgrade to body-parser@1.20.3 (#5926)
PR-URL: https://github.com/expressjs/express/pull/5926
2024-09-10 04:01:43 +02:00
Chris de Almeida
54271f69b5
fix: don't render redirect values in anchor href
Co-authored-by: Ulises Gascón <ulisesgascongonzalez@gmail.com>
2024-09-10 04:00:58 +02:00
Wes Todd
0264908903
feat(deps)!: router@^2.0.0 (#5885) 2024-09-09 17:50:11 -05:00
Jon Church
4d713d2b76
update to fresh@2.0.0 (#5916)
fixes handling of If-Modified-Since in combination with If-None-Match
2024-09-09 17:03:32 -05:00
Blake Embrey
125bb742a3
path-to-regexp@0.1.10 (#5902)
* path-to-regexp@0.1.10

* Update History.md
2024-09-09 16:02:06 -05:00
Wes Todd
accafc652e
fix(deps): finalhandler@^2.0.0 (#5899) 2024-09-02 13:36:21 -05:00
Wes Todd
05f40f4321
fix(deps)!: content-disposition@^1.0.0 (#5884) 2024-08-31 13:09:21 -05:00
Wes Todd
402e7f653f
fix(deps): type-is@^2.0.0 (#5883) 2024-08-31 12:31:31 -05:00
Wes Todd
4e61d0100d
fix(deps)!: mime-types@^3.0.0 (#5882) 2024-08-31 11:06:25 -05:00
Wes Todd
7748475747
fix(deps): accepts@^2.0.0 (#5881) 2024-08-31 10:55:04 -05:00
S M Mahmudul Hasan
91a58b5b03
cookie-signature@^1.2.1 (#5833)
* upgraded `cookie-signature` to 1.2.1

* declared cookie-signature deps in history

* add caret in version
2024-08-23 18:17:12 -05:00
Carlos Serrano
13e6894393
chore: qs@6.13.0 (#5847)
Co-authored-by: Wes Todd <wtodd@netflix.com>
2024-08-23 14:10:16 -07:00
Wes Todd
65b62065d2
fix(deps) serve-staic@2.0.0 (#5790) 2024-08-23 14:07:45 -07:00
Anna Bocharova
2a980ad160
merge-descriptors@1.0.3 (#5781)
* Allow patches for `merge-descriptors` dependency

* Set fixed latest of v1 (1.0.3)
2024-08-23 13:39:13 -07:00
Anna Bocharova
0b243b1aee
5.x: Upgrading merge-descriptors with allowing minors (#5782)
* Upgrading `merge-descriptors` with allowing minors in v5

* Using ^2.0.0 as per request

* Reflecting in History.md.

* Update History.md
2024-08-23 13:37:27 -07:00
S M Mahmudul Hasan
a3e7e05e0a
docs: specify new instructions for question and discuss
PR-URL: https://github.com/expressjs/express/pull/5835
2024-08-22 18:25:14 +02:00
Blake Embrey
c5addb9a17
deps: path-to-regexp@0.1.8 (#5603) 2024-08-21 20:15:02 -07:00
Ulises Gascón
e35380a39d
docs: add @IamLizu to the triage team (#5836)
PR-URL: https://github.com/expressjs/express/pull/5836
2024-08-19 22:12:24 +02:00
Sebastian Beltran
f5b6e67aed
docs: update scorecard link (#5814)
Co-authored-by: Ulises Gascón <ulisesgascongonzalez@gmail.com>
2024-08-18 20:37:51 +02:00
Carlos Serrano
09831580ec
refactor: replace 'path-is-absolute' dep with node:path isAbsolute method (#5830)
* refactor: replace 'path-is-absolute' dep with node:path isAbsolute method

* docs: add path-is-absolute dep removal to History.md
2024-08-17 10:21:29 -05:00
Carlos Serrano
41c054cff1
chore: upgrade debug dep from 3.10 to 4.3.6 (#5829)
* chore: upgrade debug dep from 3.10 to 4.3.6

* docs: add debug dep upgrade to History.md
2024-08-17 10:20:25 -05:00
Wes Todd
ecf762ff38
fix(deps)!: send@^1.0.0 (#5786) 2024-08-09 09:59:53 -07:00
ctcpip
63992bb1d7 Merge branch 'ci/v5-node-lts' into 5-merge 2024-08-02 16:24:55 -05:00
ctcpip
ea49706052 Merge branch 'master' into 5-merge 2024-08-02 15:57:43 -05:00
ctcpip
dde1f7d6e8 Merge branch '5.0' into 5-merge 2024-08-02 15:38:18 -05:00
Jon Church
82fc12a40b
Ignore expires and maxAge in res.clearCookie() (#5792)
* add test for removing user provided expires

* rework impl and tests to ignore maxAge, do not set it

this is to take into account the built-in relative expires when passing
a maxAge to res.cookie

I realized that using maxAge to invalidate cookies inherrently hit this
relativee expires behavior, and the goal of this PR is not to rework
that relative expires behavior w/ maxAge, but to prevent users from
overwriting these values by accident when clearing cookies

* update history.md

* explicitly delete maxAge instead of setting as undefined

* drop the spread, use object.assign

* wording, review comment on history.md

Co-authored-by: Chris de Almeida <ctcpip@users.noreply.github.com>

* ♻️ use spread, update supported ecmascript version

---------

Co-authored-by: Chris de Almeida <ctcpip@users.noreply.github.com>
2024-08-02 15:26:45 -05:00
ctcpip
9c756b0105 💚 remove node <11, all failing permanently now 2024-08-02 13:15:51 -05:00
Ulises Gascón
160b91cbf7
feat: adopt Node@18 as the minimum supported version (#5803)
- PR-URL: https://github.com/expressjs/express/pull/5803
- This is a BREAKING CHANGE
2024-08-02 16:07:36 +02:00
Mick A.
d106bf5324
Use Array.flat instead of array-flatten (#5677) 2024-08-01 19:42:07 -04:00
Jon Church
723b5451bb
Throw on invalid status codes (#4212)
* check status code is integer, or string integer, in range

* fix tests, update jsdoc comment for res.status

* throw if number is string

* narrow valid range to between 1xx and 5xx

* disambiguate the error message

* update skipped tests, remove invalid string test

* remove invalid float test

* fixup! remove invalid float test

* fix invalid range tests error assertions

* remove unused deprecate function

* add test to assert on 200.00 coming through as 200

this is the behavior of node's underlying HTTP module

* revert back to throwing only on > 999 and < 100

* update implementation for > 999

* add test for 700 status code

* update history with change

* update jsdoc

* clarify jsdoc comment

* one more round of jsdoc

* update 501 test

* add invalid status code test for res.sendStatus

* add test describe block for valid range

* fixup! add test describe block for valid range

* reduce the describe nesting

* switch to testing status 100, to avoid 100-continue behavior

* fix 900 test

* stringify code in thrown RangeError message

* remove accidentally duplicated res.status method

* fix error range message

Co-authored-by: Chris de Almeida <ctcpip@users.noreply.github.com>

* update sendStatus invalid code test to use sendStatus

---------

Co-authored-by: Chris de Almeida <ctcpip@users.noreply.github.com>
2024-07-30 14:49:13 -07:00
Ulises Gascón
2177f67f54
docs: add OSSF Scorecard badge (#5436)
PR-URL: https://github.com/expressjs/express/pull/5436
2024-07-28 12:55:10 +02:00
Jon Church
f4bd86ed36
Replace Appveyor windows testing with GHA (#5599)
This PR moves us off of Appveyor for windows testing.

We are now doing windows/linux testing on GHA. With the exception of iojs, which we are only testing on Linux and have split out to it's own workflow.

We have also added npm-shrinkwrap.json to our gitignore, in order to not have to configure npm in CI to ignore it. If it's never checked in, it shouldn't exist in CI as you need to go out of your way to create it w/ npm.
2024-07-27 14:15:55 -04:00
ctcpip
c96c690dc0 Merge branch 'master' into 5.0 2024-07-25 16:55:48 -05:00
ctcpip
088856c3f8 💚 add legacy CI, clean up 2024-07-25 12:39:38 -05:00
S M Mahmudul Hasan
2ec589c113
Fix Contributor Covenant link definition reference in attribution section (#5762) 2024-07-17 13:44:03 -07:00
Jon Church
4cf7eed927
remove minor version pinning from ci (#5722) 2024-06-26 18:23:19 -04:00
Chris de Almeida
6d084715ba
📝 update people, add ctcpip to TC (#5683) 2024-06-10 17:19:11 -04:00
Jon Church
61421a8c0c
skip QUERY tests for Node 21 only, still not supported (#5695)
* skip QUERY tests for Node 21 only, still not supported

QUERY support has now landed in Node 22.2.0, but is still not supported
in 21.7.3

QUERY showed up in http.METHODS in 21.7.2. Only Node versions after that
will attempt to run tests for it, based on the way we dynamically test
members of the http.METHODS array from Node

* update CI to run on 21.7 and 22.2
2024-06-08 23:25:42 -04:00
Jon Church
f42b160bbc
[v4] Deprecate res.clearCookie accepting options.maxAge and options.expires (#5672)
* add deprecation notice for res.clearCookie maxAge/expires

* update History.md for clearCookie deprecation change

* add tests to codify deprecated behavior

Co-authored-by: Chris de Almeida <ctcpip@users.noreply.github.com>

---------

Co-authored-by: Chris de Almeida <ctcpip@users.noreply.github.com>
2024-06-07 19:48:48 -04:00
Chris de Almeida
689073d657
bring back query tests for node 21 (#5690) 2024-06-05 17:25:58 -04:00
Ulises Gascón
2803a2b35a
docs: add @UlisesGascon as captain for cookie-parser (#5666) 2024-05-22 18:29:16 -04:00
Wes
ee40a881f5 call callback once on listen error 2024-05-17 13:47:56 -07:00
Blake Embrey
a7d6d29ed3 Add @UlisesGascon to mime repos
Co-authored-by: Ulises Gascón <ulisesgascongonzalez@gmail.com>
2024-05-13 21:31:23 -05:00
Blake Embrey
897290b685 List and sort all projects, add captains 2024-05-13 21:31:23 -05:00
Mert Can Altin
700349ffaf
doc: add table of contents, tc/triager lists to readme (#5619)
* doc: updated readme file

* doc: updated readme file for doc lint

* Update Readme.md

Co-authored-by: krzysdz <krzysdz@users.noreply.github.com>

* Update Readme.md

Co-authored-by: Ulises Gascón <ulisesgascongonzalez@gmail.com>

* Update Readme.md

Co-authored-by: Ulises Gascón <ulisesgascongonzalez@gmail.com>

* Update Readme.md

Co-authored-by: Christine Belzie <105683440+CBID2@users.noreply.github.com>

* repair readme

* added Emeritus area

* Add @carpasse to the triager team

* removed old collaborators

* add missing triagers

* lint

* Update Readme.md

Co-authored-by: Jon Church <me@jonchurch.com>

* Update Readme.md

Co-authored-by: Jon Church <me@jonchurch.com>

* dedent to fix ToC spacing

* fixup! dedent to fix ToC spacing

* us @ for jonchurch

* format names to use github handles first, single line

* added emeritus triagers

* edited title

* added emeritus team members

* added menu head

* edited emeritus

* Update Readme.md

Co-authored-by: Jon Church <me@jonchurch.com>

* Update Readme.md

Co-authored-by: Jon Church <me@jonchurch.com>

* edits to TC and anchors

* Update Readme.md

Co-authored-by: Jon Church <me@jonchurch.com>

* Update Readme.md

Co-authored-by: Jon Church <me@jonchurch.com>

* Update Readme.md

Co-authored-by: Jon Church <me@jonchurch.com>

* Update Readme.md

Co-authored-by: Jon Church <me@jonchurch.com>

* Update Readme.md

Co-authored-by: Jon Church <me@jonchurch.com>

* Update Readme.md

Co-authored-by: Ulises Gascón <ulisesgascongonzalez@gmail.com>

* Update Readme.md

Co-authored-by: Ulises Gascón <ulisesgascongonzalez@gmail.com>

* Update Readme.md

Co-authored-by: Ulises Gascón <ulisesgascongonzalez@gmail.com>

* Update Readme.md

Co-authored-by: Ulises Gascón <ulisesgascongonzalez@gmail.com>

* Update Readme.md

Co-authored-by: Ulises Gascón <ulisesgascongonzalez@gmail.com>

---------

Co-authored-by: Mert Can Altin <mert.altin@trendyol.com>
Co-authored-by: krzysdz <krzysdz@users.noreply.github.com>
Co-authored-by: Ulises Gascón <ulisesgascongonzalez@gmail.com>
Co-authored-by: Christine Belzie <105683440+CBID2@users.noreply.github.com>
Co-authored-by: Jon Church <me@jonchurch.com>
2024-05-08 17:02:11 -04:00
Mert Can Altin
4b9cd2fd0e
add support Node.js@22 in the CI (#5627)
Co-authored-by: Mert Can Altin <mert.altin@trendyol.com>
2024-05-04 18:15:53 -04:00
Jon Church
b44191eb3d
ignore ETAG query test as well, reuse skip util (#5639) 2024-05-04 18:01:42 -04:00
Jon Church
8417c60fcf
skip QUERY method test (#5628) 2024-05-04 17:09:52 -04:00
Blake Embrey
bf91946bd4
deps: encodeurl@~2.0.0 (#5569) 2024-05-04 16:53:09 -04:00
Evan Hahn
26801a0afd Use object with null prototype for settings closes #4835 2024-04-29 10:12:23 -05:00
Evan Hahn
14439731f9 Use object with null prototype for various app properties
`app.cache`, `app.engines`, and `app.settings` are now created with
`Object.create(null)` instead of `{}`.

This also updates a test to ensure that `app.locals` is created the same
way.
2024-04-29 09:43:25 -05:00
Ulises Gascón
d97d79ed9a docs: add UlisesGascon as triage initiative captain 2024-04-21 11:48:10 +02:00
Ulises Gascón
26e53f0fbc
ci: add CodeQL (SAST) (#5433)
PR-URL: https://github.com/expressjs/express/pull/5433

---------

Co-authored-by: Íñigo Marquínez Prado <25435858+inigomarquinez@users.noreply.github.com>
2024-04-17 15:13:07 +02:00
Ulises Gascón
6abec204c0
docs: update triage nomination policy (#5600)
PR-URL: https://github.com/expressjs/express/pull/5600
2024-04-17 13:53:16 +02:00
Ulises Gascón
4b3b8cc231
feat: adopt Node@18 as the minimum supported version 2024-04-11 19:19:47 +02:00
Ulises Gascón
e9bcdd399b
ci: adopt Node@18 as the minimum supported version 2024-04-11 19:16:20 +02:00
Íñigo Marquínez Prado
815f799310
docs: update reference to the threat model (#5590)
PR: https://github.com/expressjs/express/pull/5590
2024-04-10 18:53:52 +02:00
Jon Church
7f9e5843b9 add jonchurch as repo captain on several packages 2024-04-09 08:51:51 -05:00
Blake Embrey
93cf646d5c
docs: add blakeembrey as captain for encodeurl (#5579) 2024-04-07 18:40:16 +02:00
Ulises Gascón
2676a1f281
docs: add reference to the Threat Model
* docs: add Threat Model

* docs: update reference

Co-authored-by: Chris de Almeida <ctcpip@users.noreply.github.com>

* docs: improve readability

Co-authored-by: Chris de Almeida <ctcpip@users.noreply.github.com>

* docs: add reference to the Threat Model

---------

Co-authored-by: Chris de Almeida <ctcpip@users.noreply.github.com>
2024-04-04 13:01:35 +02:00
Jon Church
6da57c7819 remove examples from the ignore 2024-03-27 09:57:44 -05:00
Jon Church
d546f93f2f add develop to branches 2024-03-27 09:57:44 -05:00
Jon Church
4771ba2bc3 crib fastify's ci concurrency logic
76674fdf46/.github/workflows/ci.yml (L18)
2024-03-27 09:57:44 -05:00
Jon Church
3ae704f67f update ci push trigger only to some branches, ignore examples, .md 2024-03-27 09:57:44 -05:00
Marco Ippolito
8b6d34963d Update Security.md
Co-authored-by: Chris de Almeida <ctcpip@users.noreply.github.com>
2024-03-27 09:57:09 -05:00
Marco Ippolito
36b8148110 Update Security.md
Co-authored-by: Chris de Almeida <ctcpip@users.noreply.github.com>
2024-03-27 09:57:09 -05:00
Marco Ippolito
6d98d2e110 Update Release-Process.md
Co-authored-by: Chris de Almeida <ctcpip@users.noreply.github.com>
2024-03-27 09:57:09 -05:00
marco-ippolito
51a76366e3 refactor: reword to pre-releases 2024-03-27 09:57:09 -05:00
Marco Ippolito
4e3f95c0ea Update Security.md
Co-authored-by: Wes Todd <wes@wesleytodd.com>
2024-03-27 09:57:09 -05:00
Marco Ippolito
88bd6d8e3a Update Release-Process.md
Co-authored-by: Wes Todd <wes@wesleytodd.com>
2024-03-27 09:57:09 -05:00
marco-ippolito
51595d402b feat: document beta releases expectations 2024-03-27 09:57:09 -05:00
Wes Todd
94669f9289 remove duplicate location test for data uri 2024-03-26 09:41:06 -05:00
Wes Todd
cd7d79f92a v5.0.0-beta.3 2024-03-25 09:41:30 -05:00
Wes Todd
5e2345e966 Merge branch '5.0' into 5.x 2024-03-25 09:38:58 -05:00
Wes Todd
6415f7035b Merge tag '4.19.2' into 5.0
4.19.2
2024-03-25 09:37:02 -05:00
Wes Todd
b28db2c12c 4.19.2 2024-03-25 09:29:41 -05:00
Wes Todd
0b746953c4 Improved fix for open redirect allow list bypass
Co-authored-by: Jon Church <me@jonchurch.com>
Co-authored-by: Blake Embrey <hello@blakeembrey.com>
2024-03-25 09:29:41 -05:00
Wes Todd
04bc62787b 4.19.2 2024-03-25 09:26:03 -05:00
Wes Todd
da4d763ff6 Improved fix for open redirect allow list bypass
Co-authored-by: Jon Church <me@jonchurch.com>
Co-authored-by: Blake Embrey <hello@blakeembrey.com>
2024-03-25 09:22:34 -05:00
Wes Todd
7091ec17f0 5.0.0-beta.2 2024-03-20 22:00:19 -05:00
Wes Todd
416ba025a1 build: disable test for 4.x which is failing in v5 2024-03-20 21:52:27 -05:00
Wes Todd
60fb1d2acd Merge tag '4.19.1' into 5.x
4.19.1
2024-03-20 21:17:26 -05:00
Wes Todd
e9f9aaeebd Merge tag '4.19.0' into 5.x
4.19.0
2024-03-20 21:14:00 -05:00
Wes Todd
4f0f6cc67d 4.19.1 2024-03-20 17:17:59 -05:00
Wes Todd
a003cfab03 Allow passing non-strings to res.location with new encoding handling checks fixes #5554 #5555 2024-03-20 17:12:46 -05:00
Wes Todd
a1fa90fcea fixed un-edited version in history.md for 4.19.0 2024-03-20 16:52:48 -05:00
Wes Todd
11f2b1db22 build: fix build due to inconsistent supertest behavior in older versions 2024-03-20 16:33:03 -05:00
Wes Todd
084e36506a 4.19.0 2024-03-20 10:18:54 -05:00
FDrag0n
0867302ddb Prevent open redirect allow list bypass due to encodeurl
Co-authored-by: Jon Church <me@jonchurch.com>
2024-03-20 10:18:54 -05:00
Rand McKinney
567c9c665d
Add note on how to update docs for new release (#5541)
* Update Release-Process.md

Add note about updating docs.

* Update Release-Process.md

* Update Release-Process.md
2024-03-16 11:57:42 -06:00
Rich Hodgkins
69a4cf2819 deps: cookie@0.6.0
closes #5404
2024-03-15 10:27:45 -05:00
Wes Todd
4ee853e837 docs: loosen TC activity rules 2024-03-14 12:43:12 +01:00
Wes Todd
414854b82e docs: nominating @wesleytodd to be project captian 2024-03-14 12:40:52 +01:00
Ulises Gascón
06c6b88808 docs: update release date 2024-03-11 16:19:21 +01:00
Ulises Gascón
1b51edac7c
4.18.3 2024-02-26 20:20:53 +01:00
Ulises Gascón
b625132864
build: pin Node 21.x to minor
Co-authored-by: Aravind Nair <22199259+aravindvnair99@users.noreply.github.com>
closes #5430
2024-02-26 20:08:10 +01:00
Ulises Gascón
e3eca80584
build: pin Node 21.x to minor
Co-authored-by: Aravind Nair <22199259+aravindvnair99@users.noreply.github.com>
2024-02-26 20:07:59 +01:00
Ulises Gascon
23b44b3ddd
build: support Node.js 21.6.2 2024-02-26 20:07:27 +01:00
Ulises Gascon
b9fea12245
build: support Node.js 21.x in appveyor 2024-02-26 20:06:49 +01:00
Ulises Gascon
c259c3407f
build: support Node.js 21.x 2024-02-26 20:05:58 +01:00
Ulises Gascon
fdeb1d3176
build: support Node.js 20.x in appveyor
closes #5429
2024-02-26 19:57:01 +01:00
Ulises Gascón
734b281900
build: support Node.js 20.x 2024-02-26 19:41:28 +01:00
Dmitry Kondar
0e3ab6ec21 examples: improve view count in cookie-sessions
closes #5414
2024-02-19 16:47:26 -05:00
Ulises Gascon
59af63ac2e build: Node.js@18.19
closes #5490
2024-02-19 14:18:24 -05:00
Ulises Gascon
e720c5a21b docs: add documentation for benchmarks
closes #5312
2024-02-19 12:04:49 -05:00
riddlew
3abea7f818 examples: remove multipart example
Closes #5193
closes #5195
2024-02-19 10:04:05 -05:00
christof louw
2a89eb5c74 tests: fix handling multiple callbacks
closes #5233
2024-02-19 08:20:39 -05:00
Gireesh Punathil
59aae7686b docs: add project captains to contribution
closes #4210
closes #5484
2024-02-18 12:21:22 -06:00
Wes Todd
c4fe7de7bc docs: update TC governance rules
closes #5483
2024-02-18 22:04:47 -05:00
Douglas Christopher Wilson
a22920707b build: actions/checkout@v4 2023-11-01 22:08:37 -04:00
Douglas Christopher Wilson
02d1c3916e build: Node.js@19.9 2023-08-23 20:07:50 -04:00
Douglas Christopher Wilson
8d8bfaac7b build: Node.js@18.17 2023-08-23 19:58:41 -04:00
Douglas Christopher Wilson
13df1de857 build: eslint@8.47.0 2023-08-23 19:49:36 -04:00
Raz Luvaton
2a00da2067 tests: use random port in listen test
closes #5162
2023-06-04 11:47:20 -04:00
Douglas Christopher Wilson
24e4a2570d build: Node.js@16.20 2023-04-06 20:43:53 -04:00
Douglas Christopher Wilson
91b6fb83b4 build: use nyc@14.1.1 for Node.js < 10 2023-04-06 20:40:27 -04:00
Rakesh Bisht
3531987844 lint: remove unused function arguments in Route tests
closes #5137
2023-05-15 21:53:48 -04:00
Douglas Christopher Wilson
f540c3b019 build: Node.js@18.15 2023-03-13 22:59:15 -04:00
Douglas Christopher Wilson
b8b2eff3c3 build: eslint@8.36.0 2023-03-13 22:52:34 -04:00
Douglas Christopher Wilson
f4e48bc43e build: ejs@3.1.9 2023-03-13 22:49:54 -04:00
Douglas Christopher Wilson
8c24fa8f7b tests: wait for server close in app.listen() 2023-03-13 22:43:19 -04:00
Douglas Christopher Wilson
0debedf4f3 build: fix code coverage aggregate upload 2023-02-26 13:34:32 -05:00
Douglas Christopher Wilson
74beeac071 Fix routing requests without method 2023-02-23 17:23:22 -05:00
Arnaud Benhamdine
9bc1742937 build: support Node.js 19.x 2023-02-23 15:28:18 -05:00
Rakesh Bisht
5ad95419ba docs: fix typos in history
closes #5131
2023-02-23 12:14:47 -05:00
Douglas Christopher Wilson
8a76f39d98 build: eslint@8.34.0 2023-02-23 00:28:41 -05:00
Douglas Christopher Wilson
60b7c672c1 build: mocha@10.2.0 2023-02-23 00:27:06 -05:00
Douglas Christopher Wilson
1e42a98db6 deps: body-parser@1.20.2 2023-02-23 00:24:20 -05:00
Rakesh Bisht
506fbd63be docs: add missing JSDoc param for parseExtendedQueryString
closes #5130
2023-02-22 21:10:07 -05:00
Douglas Christopher Wilson
b9f7a97fe1 build: use $GITHUB_OUTPUT for environment list 2023-02-22 18:10:59 -05:00
Douglas Christopher Wilson
546969d198 build: Node.js@18.14 2023-02-22 12:07:48 -05:00
Douglas Christopher Wilson
f05b5d0e9c build: Node.js@16.19 2023-02-22 11:59:40 -05:00
Rakesh Bisht
3c1d605da7 lint: remove unused parameters in examples
closes #5113
2023-02-22 10:25:07 -05:00
Rakesh Bisht
6b4c4f5426 docs: fix typos in JSDoc comments
closes #5117
2023-02-22 00:16:40 -05:00
Rakesh Bisht
a1efd9d6cf lint: remove unused parameter from internal function
coses #5119
2023-02-21 22:55:22 -05:00
Rakesh Bisht
c6ee8d6e7f lint: remove unused function arguments in tests
closes #5124
2023-02-20 22:57:13 -05:00
Abdul Rauf
442fd46799 build: actions/checkout@v3
closes #5027
2022-11-01 21:13:10 -04:00
Arnaud Benhamdine
723b67766f build: Node.js@18.12 2022-11-01 21:10:12 -04:00
Arnaud Benhamdine
29e117e676 build: Node.js@16.18 2022-11-01 21:08:43 -04:00
Kevin Jones
06b2b1416d docs: update git clone to https protocol
closes #5032
2022-11-01 21:05:31 -04:00
Douglas Christopher Wilson
8368dc178a 4.18.2 2022-10-08 16:11:42 -04:00
Abhinav Das
61f4049122 docs: replace Freenode with Libera Chat
closes #5013
2022-10-08 14:52:31 -04:00
Douglas Christopher Wilson
bb7907b932 build: Node.js@18.10
closes #5014
2022-10-07 17:48:59 -04:00
Douglas Christopher Wilson
f56ce73186 build: supertest@6.3.0 2022-10-06 10:28:13 -04:00
Douglas Christopher Wilson
24b3dc5516 deps: qs@6.11.0 2022-10-06 10:27:01 -04:00
Douglas Christopher Wilson
689d175b8b deps: body-parser@1.20.1 2022-10-06 10:26:18 -04:00
Douglas Christopher Wilson
340be0f79a build: eslint@8.24.0 2022-10-05 22:40:51 -04:00
REALSTEVEIG
33e8dc303a docs: use Node.js name style
closes #4926
2022-08-19 21:12:14 -04:00
Douglas Christopher Wilson
644f6464b9 build: supertest@6.2.4 2022-08-18 23:42:39 -04:00
Douglas Christopher Wilson
ecd7572f1e build: Node.js@14.20 2022-08-18 23:41:10 -04:00
Douglas Christopher Wilson
97131bcda8 build: Node.js@18.7 2022-08-18 23:01:25 -04:00
Douglas Christopher Wilson
8d98e86d7f build: Node.js@16.17 2022-08-18 23:00:36 -04:00
Alexandru Dragomir
2c47827053 examples: remove unused function arguments in params
closes #4914
2022-05-20 11:57:37 -04:00
Douglas Christopher Wilson
97f0a518d8 tests: verify all handlers called in stack tests 2022-05-20 11:54:35 -04:00
Douglas Christopher Wilson
7ec5dd2b3c Fix regression routing a large stack in a single route
fixes #4913
2022-05-20 09:37:20 -04:00
Douglas Christopher Wilson
ab2c70b954 build: Node.js@18.1 2022-05-20 09:35:20 -04:00
Douglas Christopher Wilson
745a63f825 build: ejs@3.1.8 2022-05-20 09:34:47 -04:00
Douglas Christopher Wilson
a2dfc56a49 build: mocha@10.0.0 2022-05-20 09:33:19 -04:00
Douglas Christopher Wilson
d854c43ea1 4.18.1 2022-04-29 15:32:26 -04:00
Douglas Christopher Wilson
b02a95c693 build: Node.js@16.15 2022-04-29 14:52:20 -04:00
Douglas Christopher Wilson
631ada0c64 Fix hanging on large stack of sync routes
fixes #4899
2022-04-29 13:34:47 -04:00
Hashen
75e0c7a2c9 bench: remove unused parameter
closes #4898
2022-04-28 22:00:49 -04:00
Douglas Christopher Wilson
e2482b7e36 build: ejs@3.1.7 2022-04-28 21:59:32 -04:00
Douglas Christopher Wilson
2df96e349f build: supertest@6.2.3 2022-04-28 13:04:38 -04:00
Douglas Christopher Wilson
a38fae126a build: mocha@9.2.2 2022-04-28 13:04:11 -04:00
Douglas Christopher Wilson
547fdd41dc 4.18.0 2022-04-25 14:53:28 -04:00
Deniz
0b330ef57c bench: print latency and vary connections
closes #4880
2022-04-24 19:31:42 -04:00
Douglas Christopher Wilson
158a17031a build: support Node.js 18.x 2022-04-21 02:09:08 -04:00
Douglas Christopher Wilson
29ea1b2f74 build: use 64-bit Node.js in AppVeyor 2022-04-21 01:38:59 -04:00
Douglas Christopher Wilson
11a209e4b7 build: support Node.js 17.x 2022-04-20 22:02:37 -04:00
phoenix
fd8e45c344 tests: mark stack overflow as long running
closes #4887
2022-04-20 19:52:20 -04:00
Douglas Christopher Wilson
708ac4cdf5 Fix handling very large stacks of sync middleware
closes #4891
2022-04-13 23:29:25 -04:00
Douglas Christopher Wilson
92c5ce59f5 deps: cookie@0.5.0 2022-04-11 22:51:13 -04:00
Hashen
8880ddad1c examples: add missing html label associations
closes #4884
2022-04-11 19:29:14 -04:00
Douglas Christopher Wilson
b91c7ffb28 examples: use http-errors to create errors 2022-04-11 19:28:50 -04:00
Eslam Salem
ecaf67c930 docs: remove Node Security Project from security policy
closes #4890
2022-04-11 18:54:33 -04:00
Ghouse Mohamed
99175c3ef6 docs: fix typo in casing of HTTP
closes #4872
2022-04-08 03:42:09 -04:00
Hashen
1b2e097be2 tests: fix typo in description
closes #4882
2022-04-07 19:20:41 -04:00
Douglas Christopher Wilson
04da4aaf1a build: use supertest@3.4.2 for Node.js 6.x 2022-04-07 19:17:10 -04:00
Douglas Christopher Wilson
2e2d78c4d9 deps: on-finished@2.4.1 2022-04-03 01:15:37 -04:00
3imed-jaberi
980d881e3b deps: statuses@2.0.1
closes #4336
2022-04-02 22:39:35 -04:00
Douglas Christopher Wilson
1df75763e3 deps: qs@6.10.3 2022-04-02 21:56:41 -04:00
Douglas Christopher Wilson
32c558d414 deps: body-parser@1.20.0 2022-04-02 21:51:31 -04:00
Douglas Christopher Wilson
a10770286e Use http-errors for res.format error 2022-03-27 23:41:31 -04:00
Chris Barth
5855339455 Fix behavior of null/undefined as "maxAge" in res.cookie
fixes #3935
closes #3936
2022-03-26 23:11:48 -04:00
Ulises Gascon
1cc8169938 deps: depd@2.0.0
closes #4174
2022-03-26 14:05:25 -04:00
Nadav Ivgi
9482b82d0b Invoke default with same arguments as types in res.format
closes #3587
2022-03-26 01:29:40 -04:00
Douglas Christopher Wilson
10b9b507b7 examples: use updated res.download in example 2022-03-25 18:14:27 -04:00
Douglas Christopher Wilson
03dc367187 Allow options without filename in res.download 2022-03-25 18:13:42 -04:00
Douglas Christopher Wilson
f739b162d9 deps: finalhandler@1.2.0 2022-03-25 01:46:32 -04:00
Douglas Christopher Wilson
c92420648e deps: serve-static@1.15.0 2022-03-25 01:44:51 -04:00
Douglas Christopher Wilson
dd69eedd18 deps: send@0.18.0 2022-03-25 01:43:45 -04:00
Tommaso Tofacchi
0def9bb659 Add "root" option to res.download
fixes #4834
closes #4855
2022-03-25 00:08:38 -04:00
Jon Church
4847d0efa1 Deprecate string and non-integer arguments to res.status
closes #4223
2022-03-23 23:14:08 -04:00
Evan Hahn
c17fe05861 Ignore Object.prototype values in settings through app.set/app.get
closes #4802
closes #4803
2022-03-23 20:05:05 -04:00
Tito D. Kesumo Siregar
87279c08aa Support proper 205 responses using res.send
closes #4592
closes #4596
2022-03-23 20:05:05 -04:00
Kris Kalavantavanich
8bf0720391 build: support Node.js 16.x 2022-03-23 20:05:05 -04:00
Kris Kalavantavanich
eb4c930d5f build: support Node.js 15.x 2022-03-23 20:05:05 -04:00
Hashen
947b6b7d57 lint: remove unnecessary continue statement in loop
closes #4868
2022-03-20 22:59:20 -04:00
Hashen
bf4c3ee00f docs: fix incomplete JSDoc comment
closes #4867
2022-03-20 20:51:39 -04:00
Hashen
2a7417dd84 examples: fixup html
closes #4866
2022-03-20 15:14:33 -04:00
Tobias Speicher
490f1a1738 lint: remove deprecated String.prototype.substr
closes #4860
2022-03-20 12:34:37 -04:00
Douglas Christopher Wilson
446046f886 build: mocha@9.2.1 2022-03-01 00:27:48 -05:00
Douglas Christopher Wilson
291993d73c tests: expand res.sendFile options tests 2022-03-01 00:22:09 -05:00
Steven
e8594c3571 docs: add install size badge
closes #3710
2022-02-28 23:41:41 -05:00
Douglas Christopher Wilson
07aa91f7cb docs: consolidate contributing in readme 2022-02-28 21:52:57 -05:00
Douglas Christopher Wilson
4ed35b4202 docs: switch badges to badgen 2022-02-28 21:23:49 -05:00
Douglas Christopher Wilson
ea66a9b81b docs: update link to github actions ci 2022-02-28 21:15:08 -05:00
apeltop
d0e166c3c6 docs: fix typo in private api jsdoc
closes #4843
2022-02-28 18:37:41 -05:00
Douglas Christopher Wilson
cf9f662655 tests: fix position of res.sendfile(path, options) test 2022-02-24 00:17:01 -05:00
Douglas Christopher Wilson
8da8f79c44 tests: fix callback in res.download test 2022-02-23 00:20:34 -05:00
Douglas Christopher Wilson
18f782bba9 tests: remove duplicate utils 2022-02-23 00:18:36 -05:00
Douglas Christopher Wilson
bc5ca05509 tests: remove usage of should 2022-02-21 19:54:52 -05:00
Douglas Christopher Wilson
9967ffbdc2 tests: update res.append to verify separate header lines 2022-02-21 19:23:25 -05:00
Douglas Christopher Wilson
7df0c840e0 tests: fix up app.locals tests 2022-02-21 19:07:26 -05:00
Douglas Christopher Wilson
d8ed591117 tests: fix req.acceptsLanguage tests 2022-02-20 23:49:42 -05:00
Douglas Christopher Wilson
8ee3420f0f tests: fix req.acceptsEncodings tests 2022-02-20 23:43:02 -05:00
Douglas Christopher Wilson
318fd4b543 Merge tag '4.17.3' 2022-02-17 00:27:11 -05:00
Douglas Christopher Wilson
3d7fce56a3 4.17.3 2022-02-16 21:03:42 -05:00
Douglas Christopher Wilson
f9063712e0 build: update example dependencies 2022-02-16 00:11:24 -05:00
Douglas Christopher Wilson
6381bc6317 deps: qs@6.9.7 2022-02-16 00:03:16 -05:00
Douglas Christopher Wilson
a007863096 deps: body-parser@1.19.2 2022-02-15 23:43:41 -05:00
Douglas Christopher Wilson
6faf26d59f 5.0.0-beta.1 2022-02-14 19:13:14 -05:00
Douglas Christopher Wilson
e98f5848a0 Revert "build: use minimatch@3.0.4 for Node.js < 4" 2022-02-14 18:42:47 -05:00
Douglas Christopher Wilson
a65913776d tests: use strict mode 2022-02-09 01:07:08 -05:00
Douglas Christopher Wilson
5213bd9fe7 docs: fix entry in history 2022-02-08 18:55:09 -05:00
Douglas Christopher Wilson
a39e409cf3 tests: prevent leaking changes to NODE_ENV 2022-02-08 18:40:07 -05:00
KoyamaSohei
82de4de5ab examples: fix path traversal in downloads example
closes #4120
2022-02-08 17:32:10 -05:00
Douglas Christopher Wilson
669c805615 deps: send@1.0.0-beta.1 2022-02-08 09:57:29 -05:00
Douglas Christopher Wilson
620df0e35e deps: serve-static@2.0.0-beta.1 2022-02-08 09:55:19 -05:00
Douglas Christopher Wilson
f6db4ee805 Drop support for Node.js below 4 2022-02-08 09:48:54 -05:00
Douglas Christopher Wilson
12310c5294 build: use nyc for test coverage 2022-02-07 23:08:12 -05:00
Thomas Strauß
884657d546 examples: remove bitwise syntax for includes check
closes #4814
2022-02-07 22:58:44 -05:00
Douglas Christopher Wilson
7511d08328 build: use minimatch@3.0.4 for Node.js < 4 2022-02-07 17:46:47 -05:00
Douglas Christopher Wilson
a0276c6c91 Use mime-types for file to content type mapping 2022-02-06 10:26:18 -05:00
Douglas Christopher Wilson
2585f209f9 tests: fix test missing assertion 2022-02-04 21:18:47 -05:00
Douglas Christopher Wilson
9d0976229d build: supertest@6.2.2 2022-02-04 21:14:41 -05:00
Douglas Christopher Wilson
43cc56eb9e build: clean up gitignore 2022-02-04 16:48:33 -05:00
Douglas Christopher Wilson
1c7bbcc143 build: Node.js@14.19 2022-02-04 16:36:47 -05:00
Douglas Christopher Wilson
9cbbc8ae74 deps: cookie@0.4.2 2022-02-04 16:35:50 -05:00
Douglas Christopher Wilson
6fbc269563 pref: remove unnecessary regexp for trust proxy 2022-02-04 16:34:56 -05:00
Douglas Christopher Wilson
2bc734aa3f deps: accepts@~1.3.8 2022-02-04 16:21:11 -05:00
caioagiani
89bb531b31 docs: fix typo in res.download jsdoc
closes #4805
2022-02-03 23:26:17 -05:00
Douglas Christopher Wilson
744564fcf8 tests: add test for multiple ips in "trust proxy" 2022-02-02 16:19:01 -05:00
Douglas Christopher Wilson
da6cb0ed8a tests: add range tests to res.download 2022-02-02 15:15:41 -05:00
Douglas Christopher Wilson
00ad5bee96 tests: add more tests for app.request & app.response 2022-02-02 15:02:46 -05:00
Douglas Christopher Wilson
141914e817 tests: fix tests that did not bubble errors 2022-02-02 14:16:20 -05:00
Douglas Christopher Wilson
bd4fdfe5f7 tests: remove global dependency on should
fixes #4797
2022-02-02 01:55:16 -05:00
Douglas Christopher Wilson
215f484fb4 tests: fix wording of req.accepts* test cases 2022-02-02 01:42:35 -05:00
Douglas Christopher Wilson
20047bb6e4 examples: use strict mode 2022-02-02 01:30:51 -05:00
Douglas Christopher Wilson
8b9757e8b8 build: fix running linter in CI 2022-02-02 01:25:55 -05:00
Douglas Christopher Wilson
a84e73b958 tests: add test for hello-world example 2022-02-02 01:23:40 -05:00
Douglas Christopher Wilson
69997cbdbe examples: fix error handling in auth example 2022-02-02 00:44:28 -05:00
Douglas Christopher Wilson
3d05e85b0c deps: array-flatten@3.0.0 2022-02-01 21:51:28 -05:00
Douglas Christopher Wilson
c221b8596e build: mocha@9.2.0 2022-01-27 19:02:58 -05:00
Czarek
450c468d04 Change query parser setting default to 'simple'
closes #3361
closes #3621
2021-12-17 23:15:29 -05:00
Douglas Christopher Wilson
af341b0f09 deps: body-parser@2.0.0-beta.1 2021-12-17 23:02:38 -05:00
Douglas Christopher Wilson
1574925cad deps: router@2.0.0-beta.1
closes #4321
2021-12-16 23:05:41 -05:00
Douglas Christopher Wilson
c7d528cdc0 Merge tag '4.17.2' 2021-12-16 23:01:28 -05:00
Douglas Christopher Wilson
ea537d907d 4.17.2 2021-12-16 22:40:49 -05:00
Douglas Christopher Wilson
eee93a2760 build: update example dependencies 2021-12-16 21:47:10 -05:00
Douglas Christopher Wilson
b35773cf19 build: eslint@7.32.0 2021-12-16 21:44:26 -05:00
Douglas Christopher Wilson
c8a42006b8 build: mocha@9.1.3 2021-12-16 21:39:43 -05:00
Aalaap Ghag
21cf522dcd examples: improve 404 message wording
closes #4471
2021-12-16 13:00:12 -05:00
Douglas Christopher Wilson
a24f27aba7 deps: serve-static@1.14.2 2021-12-16 12:54:18 -05:00
3imed-jaberi
a33266a206 build: support Node.js 14.x 2021-12-16 00:22:28 -05:00
3imed-jaberi
6fe271e8aa build: support Node.js 13.x 2021-12-16 00:22:28 -05:00
Wes Todd
cbe25d66b3 deps: setprototypeof@1.2.0
closes #4011
2021-12-15 22:38:19 -05:00
Douglas Christopher Wilson
3bb6d96ba9 examples: demonstrate sub directory download 2021-12-15 21:06:33 -05:00
Douglas Christopher Wilson
6660649f1b deps: qs@6.9.6 2021-12-15 20:48:00 -05:00
Douglas Christopher Wilson
a75e4707b9 docs: add note about security report location 2021-12-15 20:45:56 -05:00
Douglas Christopher Wilson
db05a741f0 deps: send@0.17.2 2021-12-11 20:19:38 -05:00
Douglas Christopher Wilson
c2e23ece2e deps: body-parser@1.19.1 2021-12-11 03:45:46 -05:00
Douglas Christopher Wilson
96850e872a deps: content-disposition@0.5.4 2021-12-10 17:58:03 -05:00
Douglas Christopher Wilson
b8d59d5c98 deps: safe-buffer@5.2.1 2021-12-10 17:56:56 -05:00
Douglas Christopher Wilson
59d695c447 build: update example dependencies 2021-12-10 15:47:40 -05:00
Andy
e242796eb3 tests: fix test in app.head
closes #4765
2021-12-04 09:36:34 -05:00
Douglas Christopher Wilson
aaa9690bcf deps: proxy-addr@~2.0.7 2021-11-17 16:16:04 -05:00
drewm
f275e87dff Fix handling of undefined when "json escape" is enabled
closes #4744
2021-11-17 00:00:56 -05:00
Douglas Christopher Wilson
9dd0e7afdb Fix handling of undefined in res.jsonp 2021-11-16 23:58:17 -05:00
Douglas Christopher Wilson
1b2f3a0698 tests: fix up primitive tests for res.jsonp 2021-11-16 23:53:10 -05:00
3imed-jaberi
519126d732 deps: cookie@0.4.1
closes #4337
2021-11-16 21:59:01 -05:00
Ivan Derevianko
99a369f3d5 Fix incorrect middleware execution with unanchored RegExps
fixes #4204
closes #4205
2021-11-16 21:52:11 -05:00
Kim
a1dbb11377 Fix res.jsonp(obj, status) deprecation message
closes #4155
2021-11-16 00:41:19 -05:00
Florian Brandt
353348a83e Fix typo in res.is JSDoc
closes #4192
2021-11-16 00:25:10 -05:00
Juan José Arboleda
dab6ee5822 tests: remove extraneous code from app.listen test
closes #4714
2021-11-15 23:56:46 -05:00
3imed-jaberi
fc138c108f deps: proxy-addr@~2.0.6
closes #4340
2021-11-15 23:14:48 -05:00
Douglas Christopher Wilson
61a23e801f build: mocha@8.4.0 2021-10-05 21:55:00 -04:00
Douglas Christopher Wilson
313d54f033 build: supertest@6.1.6 2021-09-01 19:32:00 -04:00
Douglas Christopher Wilson
de081eb70f build: eslint@4.19.1 2021-09-01 19:27:00 -04:00
Aravind Nair
06d11755c9 build: Node.js@12.22 2021-08-14 01:12:32 -04:00
Aravind Nair
6f2afd3d80 build: Node.js@10.24 2021-08-14 01:12:31 -04:00
Aravind Nair
d5a1cbee70 build: fix wrong Node.js 8.x in AppVeyor
closes #4574
2021-08-14 01:12:24 -04:00
zhangky
f9a0560a9c docs: fix res.sendStatus/sendFile jsdoc comments
closes #4673
2021-08-14 00:39:56 -04:00
Andrew Heaney
821b7f0624 examples: fix typo in comment
closes #4667
2021-08-11 20:39:01 -04:00
Douglas Christopher Wilson
f490f78563 build: reduce npm output 2021-08-11 20:38:31 -04:00
Aravind Nair
884e080a19 build: ejs@3.1.6
closes #4572
closes #4573
2021-07-31 21:54:15 -04:00
alberto barboza
eb76236e2f build: hbs@4.1.2
closes #4643
2021-07-31 18:31:10 -04:00
Hussein Mohamed
52e9bd67b7 tests: fix typos
closes #4564
2021-07-31 16:00:16 -04:00
Hussein Mohamed
135a05c524 docs: fix typos in jsdoc
closes #4564
2021-07-31 16:00:00 -04:00
Lutger Kunst
30afebf8da examples: fixed typo in ejs example css
closes #4554
2021-07-30 16:22:34 -04:00
Douglas Christopher Wilson
8e4add7f74 tests: remove should usage from Router tests
fixes #4635
2021-07-30 16:19:55 -04:00
Abderrahmenla
0fbbc29632 lint: coalesce duplicate switch statements
closes #4587
2021-07-30 15:46:10 -04:00
Aravind Nair
2402126988 build: disable fast-fail for GitHub Actions
closes #4628
2021-07-02 15:53:27 -04:00
Douglas Christopher Wilson
ca3c863428 build: use GitHub Actions instead of Travis CI 2021-07-01 15:22:40 -04:00
Douglas Christopher Wilson
28db2c2c5c build: supertest@6.1.3 2021-01-28 20:17:55 -05:00
Douglas Christopher Wilson
685d4665fd build: mocha@8.2.1 2020-12-23 20:41:52 -05:00
Douglas Christopher Wilson
280a8d39ec build: fix Node.js version check in AppVeyor 2020-12-22 23:41:28 -05:00
Douglas Christopher Wilson
5c4f3e7cc7 build: supertest@6.0.1 2020-11-09 21:44:32 -05:00
Douglas Christopher Wilson
de122c14f5 build: Node.js@12.18 2020-10-21 19:48:58 -04:00
Douglas Christopher Wilson
2a2dd5d32b build: Node.js@10.23 2020-10-19 21:33:05 -04:00
H3RSKO
508936853a docs: update grammar in readme
closes #4376
2020-09-16 21:27:53 -04:00
Rodion Abdurakhimov
5596222f6a docs: update example summaries
closes #4370
2020-08-04 09:46:42 -04:00
Rodion Abdurakhimov
fe67523b9c docs: add examples summary page
closes #4343
closes #4354
2020-07-27 15:15:54 -04:00
yasser
4486fa6324 docs: fix Code of Conduct link in Contributing
closes #4351
2020-07-16 15:06:57 -04:00
Yogi
ecd8a08c1c docs: fix typos in Contributing 2020-07-07 22:43:16 -04:00
Yogi
a75728432e docs: fix typos in Collaborator Guide 2020-07-07 22:42:34 -04:00
Yogi
9007dcbdba docs: fix typos in Triager Guide 2020-07-07 22:42:01 -04:00
Yogi
c519886be5 docs: fix typos in Charter 2020-07-07 22:41:04 -04:00
Alexander Belov
8aabecaf1f docs: fix typo in history
closes #4286
closes #4327
2020-06-29 00:29:30 -04:00
Moni
3ff1dbeb73 docs: fix markdown links in contributing
closes #4315
2020-06-21 23:06:54 -04:00
Gireesh Punathil
18da651c5b docs: add triager guide
closes #4055
closes #4211
2020-05-06 09:58:29 -07:00
Douglas Christopher Wilson
1b48a5cc3c docs: fix heading levels 2020-04-14 21:12:37 -04:00
Wes Todd
561b4b601e docs: add Charter
closes #4144
2020-04-14 01:39:53 -04:00
Wes Todd
67e64ca4c1 docs: add Code of Conduct
closes #4143
2020-04-07 01:35:34 -04:00
Douglas Christopher Wilson
bd04d8a87f 5.0.0-alpha.8 2020-03-25 20:14:47 -04:00
Manuel Baesler
922e9a4615 build: add http keyword for npm search
closes #4102
2020-03-25 19:00:15 -04:00
KoyamaSohei
323a38965a examples: properly escape user input in route-map
fixes #3992
closes #4119
2020-03-25 17:35:14 -04:00
Aditya Srivastava
3f1dcb96e0 examples: add viewport and charset where missing
closes #3860
2020-03-25 17:10:34 -04:00
yanokenken
4b4fa26298 docs: add npm init hint to install section 2020-03-25 16:26:39 -04:00
Chang Wang
47c1d2a816 docs: point npm downloads badge to npm charts of express
closes #3579
2020-03-25 15:37:04 -04:00
Douglas Christopher Wilson
65aff94ec6 build: remove deprecated Travis CI directive 2020-03-17 20:37:16 -04:00
Douglas Christopher Wilson
2d519077ea build: supertest@4.0.2 2020-03-17 20:31:10 -04:00
Douglas Christopher Wilson
d967675852 build: mocha@7.0.1 2020-02-19 00:49:36 -05:00
Douglas Christopher Wilson
22d5b7ed10 build: Node.js@12.16 2020-02-19 00:32:14 -05:00
Douglas Christopher Wilson
872aa4741c build: Node.js@10.19 2020-02-19 00:27:51 -05:00
Douglas Christopher Wilson
87bc4ef763 build: update example dependencies 2020-02-11 23:10:15 -05:00
Douglas Christopher Wilson
f0cbdeadf6 build: mocha@7.0.0 2020-01-09 18:58:52 -05:00
Douglas Christopher Wilson
f1e8a877f4 build: Node.js@12.14 2020-01-09 18:40:28 -05:00
Douglas Christopher Wilson
55831bbd08 build: Node.js@10.18 2020-01-09 18:37:52 -05:00
Douglas Christopher Wilson
e757fa0039 build: Node.js@8.17 2020-01-09 18:30:57 -05:00
Douglas Christopher Wilson
95735a6fcc build: supertest@3.4.2 2019-11-10 22:21:57 -05:00
Douglas Christopher Wilson
668d029a14 build: mocha@6.2.2 2019-11-10 22:15:49 -05:00
Douglas Christopher Wilson
866ffd67d7 build: Node.js@12.13 2019-11-10 22:09:43 -05:00
Douglas Christopher Wilson
741e3f81af build: Node.js@10.17 2019-11-10 22:04:12 -05:00
Douglas Christopher Wilson
4efb49866d build: mocha@6.2.0 2019-08-04 22:23:09 -04:00
Douglas Christopher Wilson
6506fb578c build: Node.js@12.7 2019-08-04 22:09:45 -04:00
Douglas Christopher Wilson
dfa7b80642 build: Node.js@10.16 2019-08-04 22:03:22 -04:00
Douglas Christopher Wilson
121fe9982b Merge tag '4.17.1' 2019-06-08 19:43:21 -04:00
Douglas Christopher Wilson
e1b45ebd05 4.17.1 2019-05-26 00:24:55 -04:00
Douglas Christopher Wilson
0a48e18056 Revert "Improve error message for null/undefined to res.status"
fixes #3968
2019-05-25 18:15:13 -04:00
Douglas Christopher Wilson
eed05a1464 build: Node.js@12.3 2019-05-24 23:20:52 -04:00
Douglas Christopher Wilson
10c7756764 4.17.0 2019-05-16 21:25:42 -04:00
Douglas Christopher Wilson
9dadca2c64 docs: remove Gratipay links 2019-05-16 20:53:07 -04:00
Douglas Christopher Wilson
b8e50568af tests: ignore unreachable line 2019-05-16 10:04:24 -04:00
Douglas Christopher Wilson
94e48a16f2 build: update example dependencies 2019-05-16 09:58:40 -04:00
Douglas Christopher Wilson
efcb17dcb2 deps: cookie@0.4.0
closes #3958
2019-05-16 09:55:26 -04:00
huadong zuo
b9ecb9afe3 build: support Node.js 12.x
closes #3946
2019-05-16 01:20:24 -04:00
Douglas Christopher Wilson
5266f3a5cb build: test against Node.js 13.x nightly 2019-05-12 22:15:36 -04:00
Douglas Christopher Wilson
e502dde3c8 build: Node.js@10.15 2019-05-12 22:09:35 -04:00
Douglas Christopher Wilson
da6f701317 deps: range-parser@~1.2.1 2019-05-12 22:01:06 -04:00
Douglas Christopher Wilson
88f9733ffa deps: serve-static@1.14.1 2019-05-11 19:29:33 -04:00
Douglas Christopher Wilson
8267c4b724 deps: send@0.17.1 2019-05-10 23:49:13 -04:00
Douglas Christopher Wilson
bc07a41693 deps: finalhandler@~1.1.2 2019-05-09 22:09:56 -04:00
Douglas Christopher Wilson
c754c8ad7b build: support Node.js 11.x 2019-05-09 19:45:01 -04:00
Douglas Christopher Wilson
e917028729 build: Node.js@8.16 2019-05-09 18:03:56 -04:00
Douglas Christopher Wilson
7b076bd8e1 build: Node.js@6.17 2019-05-09 18:03:12 -04:00
Douglas Christopher Wilson
bb5211fa1c tests: add express.text test suite 2019-05-08 23:39:45 -04:00
Ilya Guterman
7f4e37f3ea Add express.text to parse bodies into string
closes #3455
2019-05-08 23:39:16 -04:00
Douglas Christopher Wilson
11192bd168 tests: add express.raw test suite 2019-05-08 00:58:08 -04:00
Amit Zur
0bcdd88dd0 Add express.raw to parse bodies into Buffer
closes #3708
2019-05-08 00:57:02 -04:00
Douglas Christopher Wilson
60aacac167 deps: serve-static@1.14.0
closes #3486
2019-05-07 23:42:36 -04:00
Douglas Christopher Wilson
70a19472f1 deps: send@0.17.0 2019-05-07 23:05:37 -04:00
Douglas Christopher Wilson
6f7a8301a1 tests: add express.static test suite 2019-05-02 17:49:29 -04:00
Douglas Christopher Wilson
8b71f39516 tests: add express.urlencoded test suite 2019-05-01 23:29:28 -04:00
Douglas Christopher Wilson
955f2a5f78 tests: add express.json test suite 2019-05-01 22:59:42 -04:00
Douglas Christopher Wilson
2f782d8478 deps: body-parser@1.19.0 2019-04-30 23:31:32 -04:00
Douglas Christopher Wilson
32f5293afa deps: qs@6.7.0 2019-04-30 23:06:50 -04:00
Douglas Christopher Wilson
6d9dd2da49 deps: type-is@~1.6.18 2019-04-30 22:48:56 -04:00
Douglas Christopher Wilson
40dbfa2de2 deps: accepts@~1.3.7 2019-04-30 22:24:35 -04:00
Douglas Christopher Wilson
9afa1cfc85 deps: statuses@~1.5.0 2019-04-30 22:17:03 -04:00
Douglas Christopher Wilson
7eacdcef19 deps: setprototypeof@1.1.1 2019-04-22 13:40:23 -04:00
James George
b02d3a1744 docs: add link to contributing guide
closes #3846
2019-04-17 16:18:37 -04:00
Douglas Christopher Wilson
03341204ff deps: parseurl@~1.3.3 2019-04-17 16:06:35 -04:00
Douglas Christopher Wilson
50eb5e4377 deps: proxy-addr@~2.0.5 2019-04-17 16:05:17 -04:00
Douglas Christopher Wilson
952484f73a deps: content-disposition@0.5.3 2019-04-17 16:00:02 -04:00
Douglas Christopher Wilson
4218d04183 build: marked@0.6.2 2019-04-17 15:58:26 -04:00
Douglas Christopher Wilson
cf5c813d2f build: hbs@4.0.4 2019-04-17 15:51:33 -04:00
Douglas Christopher Wilson
9e5d1a30c3 build: test against Node.js 12.x nightly 2019-04-17 10:44:27 -04:00
김정환
8a97346eaf tests: assert calls order in middleware basic tests
closes #3878
2019-04-17 10:41:43 -04:00
Marcin Wanago
6eda52a3dc docs: use const in readme example
fixes #3867
closes #3868
2019-04-16 17:56:38 -04:00
김정환
b9b1b19758 tests: fix typos in descriptions
closes #3875
2019-04-16 12:40:59 -04:00
Louis
6f12eee8ab docs: fix typo in jsdoc comment
closes #3859
2019-04-16 10:29:07 -04:00
Ciro Santilli
186a206a0a docs: add listening address to example
closes #3873
2019-04-16 00:28:15 -04:00
Alvin Smith
02f3933b69 examples: minor fixes to some examples
closes #3812
2018-12-17 23:00:19 -05:00
Austin Scriver
0ae10bb154 docs: fix typos in history
closes #3810
2018-12-17 19:49:39 -05:00
HubCodes
95c31f7041 docs: fix typo in contributing
closes #3827
2018-12-17 19:12:37 -05:00
Horatiu Eugen Vlad
b93ffd4bdc Support multiple hosts in X-Forwarded-Host
fixes #3494
closes #3495
2018-10-28 15:58:25 -04:00
Joshua Caron
8da51108e7 Improve error message for null/undefined to res.status
closes #2795
closes #2797
closes #3111
2018-10-27 14:04:49 -04:00
void
6bcdfef6ad Improve error message for non-strings to res.sendFile
closes #3582
2018-10-27 02:27:15 -04:00
Felix Bünemann
44e539e1dc build: support Node.js 10.x
closes #3617
2018-10-27 01:28:11 -04:00
Nacim Goura
003459b795 build: support Node.js 9.x
closes #3617
2018-10-27 00:55:42 -04:00
Douglas Christopher Wilson
6295b45920 build: test against Node.js 11.x nightly 2018-10-27 00:50:58 -04:00
Douglas Christopher Wilson
a6b119d27a build: coveralls@2.12.0 2018-10-27 00:05:00 -04:00
Douglas Christopher Wilson
d0421ac7e1 tests: use supertest to perform assertions 2018-10-26 23:34:00 -04:00
Douglas Christopher Wilson
5f0c829d7c 5.0.0-alpha.7 2018-10-26 22:29:15 -04:00
Douglas Christopher Wilson
c82fa19447 tests: add router promise tests 2018-10-26 21:31:28 -04:00
Douglas Christopher Wilson
fa22245cc6 deps: router@2.0.0-alpha.1 2018-10-23 21:02:44 -04:00
Douglas Christopher Wilson
302a6152b4 Merge tag '4.16.4' 2018-10-23 20:38:42 -04:00
Douglas Christopher Wilson
dc538f6e81 4.16.4 2018-10-10 23:50:45 -04:00
Douglas Christopher Wilson
62a59b6ace build: update example dependencies 2018-09-27 18:09:27 -04:00
Douglas Christopher Wilson
451ee5d9c1 build: supertest@3.3.0 2018-09-24 23:40:21 -04:00
Douglas Christopher Wilson
f07f368fba build: mocha@5.2.0 2018-09-21 23:16:17 -04:00
Douglas Christopher Wilson
09d5654488 build: restructure CI build steps 2018-09-21 23:01:22 -04:00
Douglas Christopher Wilson
3d10279826 Fix issue where "Request aborted" may be logged in res.sendfile 2018-09-19 23:25:16 -04:00
Douglas Christopher Wilson
5e9de5dcb6 deps: safe-buffer@5.1.2 2018-09-19 14:47:48 -04:00
Douglas Christopher Wilson
5de1a08ebf build: supertest@2.0.0 2018-09-19 14:06:22 -04:00
Douglas Christopher Wilson
4480fb997e deps: proxy-addr@~2.0.4 2018-09-19 12:40:40 -04:00
Felix Bünemann
b8fb6a7fb1 deps: body-parser@1.18.3
closes #3655
closes #3706
2018-09-18 21:58:46 -04:00
Douglas Christopher Wilson
b4eb1f59d3 deps: qs@6.5.2 2018-09-18 21:56:31 -04:00
Linus Unnebäck
431f65305e lint: move removed middlewares list to a variable
closes #3558
closes #3677
closes #3678
2018-09-13 18:46:45 -04:00
Andreas Kohn
f3fa758af9 Fix JSDoc for Router constructor
fixes #3598
fixes #3599
fixes #3698
2018-09-13 18:44:47 -04:00
Logan Ripplinger
ede24da964 examples: fix typo in multi-router example
closes #3718
2018-09-13 18:15:48 -04:00
Douglas Christopher Wilson
d5b33cfad8 build: update example dependencies 2018-09-13 12:26:36 -04:00
Douglas Christopher Wilson
c39d7d9339 build: Node.js@8.12 2018-09-13 12:23:38 -04:00
Douglas Christopher Wilson
f95dbc28fd build: should@13.2.3 2018-07-31 17:09:27 -04:00
Douglas Christopher Wilson
ac89f6f121 build: Node.js@8.11 2018-06-07 00:12:07 -04:00
Douglas Christopher Wilson
3d8ca8ad4a build: Node.js@6.14 2018-06-07 00:04:28 -04:00
Douglas Christopher Wilson
02c753583e build: Node.js@4.9 2018-06-06 23:50:03 -04:00
Douglas Christopher Wilson
3ed5090ca9 4.16.3 2018-03-12 13:38:44 -04:00
Douglas Christopher Wilson
76bf96e9ce deps: finalhandler@1.1.1 2018-03-12 11:20:19 -04:00
Douglas Christopher Wilson
d3bdc3b663 build: marked@0.3.17 2018-03-12 11:17:26 -04:00
Douglas Christopher Wilson
0e88dceac2 deps: accepts@~1.3.5 2018-02-28 23:44:00 -05:00
Douglas Christopher Wilson
e69a29d9c2 deps: type-is@~1.6.16 2018-02-28 19:55:34 -05:00
Douglas Christopher Wilson
0083372bed deps: proxy-addr@~2.0.3 2018-02-26 23:18:07 -05:00
Douglas Christopher Wilson
f3c5f7ee29 build: test against Node.js 10.x nightly 2018-02-13 21:21:26 -05:00
Alejandro Estrada
40e04ec7a6 lint: remove usages of "=="
closes #3540
2018-02-13 19:30:57 -05:00
Douglas Christopher Wilson
972ada9079 tests: remove duplicate block in router test 2018-02-13 17:14:48 -05:00
Steven Anthony
80e64691e1 examples: add full urls to web-service example
closes #3519
2018-02-13 16:50:13 -05:00
Yuta Hiroto
98b0b66b6c build: use yaml eslint configuration
closes #3561
2018-02-13 16:45:40 -05:00
Douglas Christopher Wilson
cbaa04629a deps: serve-static@1.13.2 2018-02-09 13:20:09 -05:00
Douglas Christopher Wilson
276a80895c deps: send@0.16.2 2018-02-09 13:09:25 -05:00
Douglas Christopher Wilson
94a6cbfbfe tests: remove unnecessary functions for supertest 2018-01-17 00:28:25 -05:00
Douglas Christopher Wilson
f8fba68ec0 tests: use supertest expect to test body 2018-01-17 00:20:15 -05:00
Douglas Christopher Wilson
c6f12a8971 deps: statuses@~1.4.0 2018-01-17 00:00:22 -05:00
Douglas Christopher Wilson
323572610b deps: encodeurl@~1.0.2 2018-01-16 23:50:41 -05:00
Douglas Christopher Wilson
f448a96685 deps: depd@~1.1.2 2018-01-16 23:46:11 -05:00
Douglas Christopher Wilson
68e824cbff build: remove Node.js 8 nightly build 2018-01-16 19:19:03 -05:00
Douglas Christopher Wilson
086e56f1c4 build: marked@0.3.12 2018-01-16 19:12:34 -05:00
Douglas Christopher Wilson
b4020ec92b build: should@13.2.1 2018-01-16 19:09:25 -05:00
Douglas Christopher Wilson
fe0bc4082d build: Node.js@8.9 2018-01-02 22:38:09 -05:00
Douglas Christopher Wilson
1780ed1091 build: Node.js@6.12 2018-01-02 21:47:13 -05:00
Douglas Christopher Wilson
b49af6a674 build: should@13.2.0 2018-01-02 19:46:31 -05:00
Douglas Christopher Wilson
a743d5be4d build: marked@0.3.9 2018-01-02 19:45:25 -05:00
David Wu
187d1f57c9 docs: remove gratipay badges
closes #3524
2018-01-02 19:41:43 -05:00
chainhelen
950f4423f0 tests: separate res.send() chain test
closes #3448
2018-01-02 19:26:27 -05:00
Yaman Jain
53bee2506d examples: use https github url
closes #3465
2018-01-02 19:05:52 -05:00
Douglas Christopher Wilson
659fcc1598 deps: router@~1.3.2 2017-10-13 22:59:21 -04:00
Douglas Christopher Wilson
a163e2cdf4 deps: debug@3.1.0 2017-10-13 22:57:58 -04:00
Douglas Christopher Wilson
62e12fe710 Merge tag '4.16.2' 2017-10-13 22:27:30 -04:00
Douglas Christopher Wilson
8fabed82aa Remove path-to-regexp dependency 2017-10-13 22:12:14 -04:00
Douglas Christopher Wilson
351396f971 4.16.2 2017-10-09 22:55:18 -04:00
Douglas Christopher Wilson
b97faff6e2 perf: skip parsing of entire "X-Forwarded-Proto" header 2017-10-09 22:43:23 -04:00
David Wood
b7817ab1b0 Fix TypeError in res.send when given Buffer and ETag header set
fixes #3445
2017-10-09 22:11:49 -04:00
Douglas Christopher Wilson
48aba21ea4 docs: add missing history for res.download change 2017-10-04 23:09:22 -04:00
Douglas Christopher Wilson
de129c289d tests: run mocha with --no-exit to detect hangs
closes #3439
2017-10-01 00:48:29 -04:00
Douglas Christopher Wilson
f4120a6453 5.0.0-alpha.6 2017-09-25 01:28:00 -04:00
Douglas Christopher Wilson
19c8d64855 Merge tag '4.15.5' 2017-09-25 01:07:08 -04:00
Mike Tunnicliffe
71395f5933 Remove res.redirect(url, status) signature
closes #2941
2017-08-07 20:17:52 -04:00
Mike Tunnicliffe
e3bd14dcca Remove res.send(status, body) signature
closes #2942
2017-08-07 20:06:44 -04:00
Douglas Christopher Wilson
c319fe260a Merge tag '4.15.4' 2017-08-07 19:33:00 -04:00
Douglas Christopher Wilson
21f725e0ef 5.0.0-alpha.5 2017-03-06 08:43:58 -05:00
Douglas Christopher Wilson
e5dbb0cb4e Merge tag '4.15.2' 2017-03-06 08:40:02 -05:00
Douglas Christopher Wilson
a3a9166c52 5.0.0-alpha.4 2017-03-01 18:51:29 -05:00
Wes
06f423d4f5 Remove Express 3.x middleware error stubs
closes #3217
2017-03-01 18:29:48 -05:00
Douglas Christopher Wilson
501e24e0a9 Merge tag '4.15.0' 2017-03-01 18:17:04 -05:00
Douglas Christopher Wilson
c8d9223e93 5.0.0-alpha.3 2017-01-28 22:21:29 -05:00
Douglas Christopher Wilson
4b39a01e6a deps: path-is-absolute@1.0.1 2017-01-28 21:56:53 -05:00
Douglas Christopher Wilson
ad4d52de29 deps: array-flatten@2.1.1 2017-01-28 21:55:32 -05:00
Douglas Christopher Wilson
07077c4457 deps: router@~1.1.5 2017-01-28 21:54:42 -05:00
Douglas Christopher Wilson
bcbb9d56c5 Merge tag '4.14.1' 2017-01-28 21:02:36 -05:00
Mike Tunnicliffe
ab1c9e924e Remove res.jsonp(status, obj) signature
closes #2940
2017-01-27 23:53:41 -05:00
Mike Tunnicliffe
25fdefac45 Remove res.json(status, obj) signature
closes #2939
2017-01-27 23:46:54 -05:00
Mike Tunnicliffe
a856456a95 Remove res.vary() (no arguments) signature
closes #2943
2017-01-27 22:04:36 -05:00
Douglas Christopher Wilson
1dbfee6623 Merge tag '4.14.0' 2016-06-20 00:37:34 -04:00
Douglas Christopher Wilson
8a387d3ede deps: array-flatten@2.0.0 2016-01-21 21:28:24 -05:00
Douglas Christopher Wilson
943f28f05f deps: router@~1.1.3 2016-01-21 21:26:03 -05:00
Douglas Christopher Wilson
7cafdb5824 Merge tag '4.13.4' 2016-01-21 21:23:07 -05:00
Douglas Christopher Wilson
2c668f87c7 5.0.0-alpha.2 2015-07-07 01:33:55 -04:00
Douglas Christopher Wilson
6343288bef Make res.render callback is always async, even for sync view engines
closes #2668
2015-07-07 01:02:13 -04:00
Jeremiah Senkpiel
694869d2aa Use path-is-absolute module for absolute path detection
closes #2620
2015-07-06 23:55:17 -04:00
Douglas Christopher Wilson
cec5780db4 Use router module for routing
closes #2411
2015-07-06 23:46:00 -04:00
Douglas Christopher Wilson
21d52daafb Remove req.param() 2015-07-06 21:15:16 -04:00
Douglas Christopher Wilson
a7d15f382e Remove un-used depd import in router 2015-07-06 21:13:49 -04:00
Douglas Christopher Wilson
6c751191dd Remove utils.flatten 2015-07-06 21:12:44 -04:00
Douglas Christopher Wilson
1e2951a832 Remove app.param(fn) signature 2015-07-06 16:45:09 -04:00
Douglas Christopher Wilson
3a1f27fcde Remove ":" stripping from app.param() 2015-07-06 16:31:51 -04:00
Douglas Christopher Wilson
b309b873f1 Merge tag '4.13.1' 2015-07-06 16:13:54 -04:00
Douglas Christopher Wilson
f90e045334 Merge tag '4.12.4' 2015-05-18 00:41:42 -04:00
Douglas Christopher Wilson
f6ec710534 Merge tag '4.12.0' 2015-02-23 01:00:12 -05:00
Douglas Christopher Wilson
a9ef9e13fb Merge tag '4.11.2' 2015-02-01 15:41:51 -05:00
Douglas Christopher Wilson
f56e2a2503 docs: simplify 5.x history 2015-01-21 04:01:41 -05:00
Douglas Christopher Wilson
8a5ecd3d89 Merge tag '4.11.1' 2015-01-21 03:58:41 -05:00
Douglas Christopher Wilson
4052c15c7f 5.0.0-alpha.1 2014-11-06 21:52:29 -05:00
Douglas Christopher Wilson
97ccc52207 Remove res.send(status) signature 2014-11-06 21:20:46 -05:00
Douglas Christopher Wilson
0fc4f0735a Remove res.sendfile 2014-11-06 21:03:04 -05:00
Douglas Christopher Wilson
ccdbe4ea37 Remove req.acceptsLanguage 2014-11-06 20:54:29 -05:00
Douglas Christopher Wilson
59f2b4048a Remove acceptsEncoding 2014-11-06 20:53:17 -05:00
Douglas Christopher Wilson
7f2532808a Remove req.acceptsCharset 2014-11-06 20:52:14 -05:00
Douglas Christopher Wilson
be35e4927c Remove utils.contentDisposition 2014-11-06 20:48:32 -05:00
Douglas Christopher Wilson
f31dcff10c Remove app.del 2014-11-06 20:44:42 -05:00
Douglas Christopher Wilson
509ebb1aff Add app.router reference back 2014-11-06 20:20:33 -05:00
Douglas Christopher Wilson
78e50547f1 Refactor away init middleware 2014-11-06 20:18:51 -05:00
Douglas Christopher Wilson
dcc4eaabe8 Change req.query to a getter 2014-11-06 20:18:48 -05:00
Douglas Christopher Wilson
8c6f9c4253 Remove app.router error message 2014-11-06 20:18:44 -05:00
Douglas Christopher Wilson
88103063fe Remove res.jsonp(obj, status) signature 2014-11-06 20:18:42 -05:00
Douglas Christopher Wilson
164638b24f Remove res.json(obj, status) signature 2014-11-06 20:18:40 -05:00
Douglas Christopher Wilson
e66625be50 Remove res.send(body, status) signature 2014-11-06 20:18:39 -05:00
Douglas Christopher Wilson
085a29685a Change req.host to return host 2014-11-06 20:18:37 -05:00
200 changed files with 9158 additions and 4709 deletions

View File

@ -1,4 +1,4 @@
# http://editorconfig.org
# https://editorconfig.org
root = true
[*]

View File

@ -1,8 +0,0 @@
{
"rules": {
"eol-last": "error",
"indent": ["error", 2, { "SwitchCase": 1 }],
"no-trailing-spaces": "error",
"no-unused-vars": ["error", { "vars": "all", "args": "none", "ignoreRestSiblings": true }]
}
}

14
.eslintrc.yml Normal file
View File

@ -0,0 +1,14 @@
root: true
env:
es2022: true
node: true
rules:
eol-last: error
eqeqeq: [error, allow-null]
indent: [error, 2, { MemberExpression: "off", SwitchCase: 1 }]
no-trailing-spaces: error
no-unused-vars: [error, { vars: all, args: none, ignoreRestSiblings: true }]
no-restricted-globals:
- error
- name: Buffer
message: Use `import { Buffer } from "node:buffer"` instead of the global Buffer.

17
.github/dependabot.yml vendored Normal file
View File

@ -0,0 +1,17 @@
version: 2
updates:
- package-ecosystem: github-actions
directory: /
schedule:
interval: monthly
- package-ecosystem: npm
directory: /
schedule:
interval: monthly
time: "23:00"
timezone: Europe/London
open-pull-requests-limit: 10
ignore:
- dependency-name: "*"
update-types: ["version-update:semver-major"]

117
.github/workflows/ci.yml vendored Normal file
View File

@ -0,0 +1,117 @@
name: ci
on:
push:
branches:
- master
- develop
- '4.x'
- '5.x'
- '5.0'
paths-ignore:
- '*.md'
pull_request:
workflow_dispatch:
permissions:
contents: read
# Cancel in progress workflows
# in the scenario where we already had a run going for that PR/branch/tag but then triggered a new run
concurrency:
group: "${{ github.workflow }} ✨ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}"
cancel-in-progress: true
jobs:
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Setup Node.js
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0
with:
node-version: 'lts/*'
- name: Install dependencies
run: npm install --ignore-scripts --include=dev
- name: Run lint
run: npm run lint
test:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
node-version: [18, 19, 20, 21, 22, 23, 24, 25]
# Node.js release schedule: https://nodejs.org/en/about/releases/
name: Node.js ${{ matrix.node-version }} - ${{matrix.os}}
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Setup Node.js ${{ matrix.node-version }}
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0
with:
node-version: ${{ matrix.node-version }}
- name: Configure npm loglevel
run: |
npm config set loglevel error
shell: bash
- name: Install dependencies
run: npm install
- name: Output Node and NPM versions
run: |
echo "Node.js version: $(node -v)"
echo "NPM version: $(npm -v)"
- name: Run tests
shell: bash
run: npm run test-ci
- name: Upload code coverage
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
with:
name: coverage-node-${{ matrix.node-version }}-${{ matrix.os }}
path: ./coverage/lcov.info
retention-days: 1
coverage:
needs: test
runs-on: ubuntu-latest
permissions:
contents: read
checks: write
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Install lcov
shell: bash
run: sudo apt-get -y install lcov
- name: Collect coverage reports
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
with:
path: ./coverage
pattern: coverage-node-*
- name: Merge coverage reports
shell: bash
run: find ./coverage -name lcov.info -exec printf '-a %q\n' {} \; | xargs lcov -o ./lcov.info
- name: Upload coverage report
uses: coverallsapp/github-action@648a8eb78e6d50909eff900e4ec85cab4524a45b # v2.3.6
with:
file: ./lcov.info

74
.github/workflows/codeql.yml vendored Normal file
View File

@ -0,0 +1,74 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: ["master"]
pull_request:
# The branches below must be a subset of the branches above
branches: ["master"]
schedule:
- cron: "0 0 * * 1"
workflow_dispatch:
permissions:
contents: read
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [javascript, actions]
steps:
- name: Checkout repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@0499de31b99561a6d14a36a5f662c2a54f91beee # v3.29.5
with:
languages: ${{ matrix.language }}
config: |
paths-ignore:
- test
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
# - name: Autobuild
# uses: github/codeql-action/autobuild@3ab4101902695724f9365a384f86c1074d94e18c # v3.24.7
# Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
# If the Autobuild fails above, remove it and uncomment the following three lines.
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
# - run: |
# echo "Run, Build Application using script"
# ./location_of_script_within_repo/buildscript.sh
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@0499de31b99561a6d14a36a5f662c2a54f91beee # v3.29.5

101
.github/workflows/legacy.yml vendored Normal file
View File

@ -0,0 +1,101 @@
name: legacy
on:
push:
branches:
- master
- develop
- '4.x'
- '5.x'
- '5.0'
paths-ignore:
- '*.md'
pull_request:
paths-ignore:
- '*.md'
workflow_dispatch:
permissions:
contents: read
# Cancel in progress workflows
# in the scenario where we already had a run going for that PR/branch/tag but then triggered a new run
concurrency:
group: "${{ github.workflow }} ✨ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}"
cancel-in-progress: true
jobs:
test:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
node-version: [16, 17]
# Node.js release schedule: https://nodejs.org/en/about/releases/
name: Node.js ${{ matrix.node-version }} - ${{matrix.os}}
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Setup Node.js ${{ matrix.node-version }}
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0
with:
node-version: ${{ matrix.node-version }}
- name: Configure npm loglevel
run: |
npm config set loglevel error
shell: bash
- name: Install dependencies
run: npm install
- name: Output Node and NPM versions
run: |
echo "Node.js version: $(node -v)"
echo "NPM version: $(npm -v)"
- name: Run tests
shell: bash
run: npm run test-ci
- name: Upload code coverage
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
with:
name: coverage-node-${{ matrix.node-version }}-${{ matrix.os }}
path: ./coverage/lcov.info
retention-days: 1
coverage:
needs: test
runs-on: ubuntu-latest
permissions:
contents: read
checks: write
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Install lcov
shell: bash
run: sudo apt-get -y install lcov
- name: Collect coverage reports
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
with:
path: ./coverage
pattern: coverage-node-*
- name: Merge coverage reports
shell: bash
run: find ./coverage -name lcov.info -exec printf '-a %q\n' {} \; | xargs lcov -o ./lcov.info
- name: Upload coverage report
uses: coverallsapp/github-action@648a8eb78e6d50909eff900e4ec85cab4524a45b # v2.3.6
with:
file: ./lcov.info

72
.github/workflows/scorecard.yml vendored Normal file
View File

@ -0,0 +1,72 @@
# This workflow uses actions that are not certified by GitHub. They are provided
# by a third-party and are governed by separate terms of service, privacy
# policy, and support documentation.
name: Scorecard supply-chain security
on:
# For Branch-Protection check. Only the default branch is supported. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection
branch_protection_rule:
# To guarantee Maintained check is occasionally updated. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained
schedule:
- cron: '16 21 * * 1'
push:
branches: [ "master" ]
# Declare default permissions as read only.
permissions: read-all
jobs:
analysis:
name: Scorecard analysis
runs-on: ubuntu-latest
permissions:
# Needed to upload the results to code-scanning dashboard.
security-events: write
# Needed to publish results and get a badge (see publish_results below).
id-token: write
# Uncomment the permissions below if installing in a private repository.
# contents: read
# actions: read
steps:
- name: "Checkout code"
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: "Run analysis"
uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
with:
results_file: results.sarif
results_format: sarif
# (Optional) "write" PAT token. Uncomment the `repo_token` line below if:
# - you want to enable the Branch-Protection check on a *public* repository, or
# - you are installing Scorecard on a *private* repository
# To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat.
# repo_token: ${{ secrets.SCORECARD_TOKEN }}
# Public repositories:
# - Publish results to OpenSSF REST API for easy access by consumers
# - Allows the repository to include the Scorecard badge.
# - See https://github.com/ossf/scorecard-action#publishing-results.
# For private repositories:
# - `publish_results` will always be set to `false`, regardless
# of the value entered here.
publish_results: true
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
# format to the repository Actions tab.
- name: "Upload artifact"
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
with:
name: SARIF file
path: results.sarif
retention-days: 5
# Upload the results to GitHub's code scanning dashboard.
- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@0499de31b99561a6d14a36a5f662c2a54f91beee # v3.29.5
with:
sarif_file: results.sarif

23
.gitignore vendored
View File

@ -1,27 +1,20 @@
# OS X
.DS_Store*
Icon?
._*
# Windows
Thumbs.db
ehthumbs.db
Desktop.ini
# Linux
.directory
*~
# npm
node_modules
package-lock.json
npm-shrinkwrap.json
*.log
*.gz
# Yarn
yarn-error.log
yarn.lock
# Coveralls
.nyc_output
coverage
# Benchmarking
benchmarks/graphs
# ignore additional files using core.excludesFile
# https://git-scm.com/docs/gitignore

1
.npmrc Normal file
View File

@ -0,0 +1 @@
package-lock=false

View File

@ -1,39 +0,0 @@
language: node_js
node_js:
- "0.10"
- "0.12"
- "1.8"
- "2.5"
- "3.3"
- "4.8"
- "5.12"
- "6.11"
- "7.10"
- "8.4"
matrix:
include:
- node_js: "8"
env: "NVM_NODEJS_ORG_MIRROR=https://nodejs.org/download/nightly"
- node_js: "9"
env: "NVM_NODEJS_ORG_MIRROR=https://nodejs.org/download/nightly"
allow_failures:
# Allow the nightly installs to fail
- env: "NVM_NODEJS_ORG_MIRROR=https://nodejs.org/download/nightly"
sudo: false
cache:
directories:
- node_modules
before_install:
# Skip updating shrinkwrap / lock
- "npm config set shrinkwrap false"
# Remove all non-test dependencies
- "npm rm --save-dev connect-redis"
# Update Node.js modules
- "test ! -d node_modules || npm prune"
- "test ! -d node_modules || npm rebuild"
script:
- "npm run test-ci"
- "npm run lint"
after_script: "npm install coveralls@2.10.0 && cat ./coverage/lcov.info | coveralls"

View File

@ -1,50 +0,0 @@
## Website Issues
Open issues for the expressjs.com website in https://github.com/expressjs/expressjs.com.
## PRs and Code contributions
* Tests must pass.
* Follow the [JavaScript Standard Style](http://standardjs.com/) and `npm run lint`.
* If you fix a bug, add a test.
## Branches
Use the `master` branch for bug fixes or minor work that is intended for the
current release stream.
Use the correspondingly named branch, e.g. `5.0`, for anything intended for
a future release of Express.
## Steps for contributing
1. [Create an issue](https://github.com/expressjs/express/issues/new) for the
bug you want to fix or the feature that you want to add.
2. Create your own [fork](https://github.com/expressjs/express) on github, then
checkout your fork.
3. Write your code in your local copy. It's good practice to create a branch for
each new issue you work on, although not compulsory.
4. To run the test suite, first install the dependencies by running `npm install`,
then run `npm test`.
5. Ensure your code is linted by running `npm run lint` -- fix any issue you
see listed.
6. If the tests pass, you can commit your changes to your fork and then create
a pull request from there. Make sure to reference your issue from the pull
request comments by including the issue number e.g. `#123`.
## Issues which are questions
We will typically close any vague issues or questions that are specific to some
app you are writing. Please double check the docs and other references before
being trigger happy with posting a question issue.
Things that will help get your question issue looked at:
* Full and runnable JS code.
* Clear description of the problem or unexpected behavior.
* Clear description of the expected result.
* Steps you have taken to debug it yourself.
If you post a question and do not outline the above items or make it easy for
us to understand and reproduce your issue, it will be closed.

View File

@ -1,85 +0,0 @@
# Express.js Community Contributing Guide 1.0
The goal of this document is to create a contribution process that:
* Encourages new contributions.
* Encourages contributors to remain involved.
* Avoids unnecessary processes and bureaucracy whenever possible.
* Creates a transparent decision making process that makes it clear how
contributors can be involved in decision making.
## Vocabulary
* A **Contributor** is any individual creating or commenting on an issue or pull request.
* A **Committer** is a subset of contributors who have been given write access to the repository.
* A **TC (Technical Committee)** is a group of committers representing the required technical
expertise to resolve rare disputes.
# Logging Issues
Log an issue for any question or problem you might have. When in doubt, log an issue, and
any additional policies about what to include will be provided in the responses. The only
exception is security dislosures which should be sent privately.
Committers may direct you to another repository, ask for additional clarifications, and
add appropriate metadata before the issue is addressed.
Please be courteous and respectful. Every participant is expected to follow the
project's Code of Conduct.
# Contributions
Any change to resources in this repository must be through pull requests. This applies to all changes
to documentation, code, binary files, etc. Even long term committers and TC members must use
pull requests.
No pull request can be merged without being reviewed.
For non-trivial contributions, pull requests should sit for at least 36 hours to ensure that
contributors in other timezones have time to review. Consideration should also be given to
weekends and other holiday periods to ensure active committers all have reasonable time to
become involved in the discussion and review process if they wish.
The default for each contribution is that it is accepted once no committer has an objection.
During review committers may also request that a specific contributor who is most versed in a
particular area gives a "LGTM" before the PR can be merged. There is no additional "sign off"
process for contributions to land. Once all issues brought by committers are addressed it can
be landed by any committer.
In the case of an objection being raised in a pull request by another committer, all involved
committers should seek to arrive at a consensus by way of addressing concerns being expressed
by discussion, compromise on the proposed change, or withdrawal of the proposed change.
If a contribution is controversial and committers cannot agree about how to get it to land
or if it should land then it should be escalated to the TC. TC members should regularly
discuss pending contributions in order to find a resolution. It is expected that only a
small minority of issues be brought to the TC for resolution and that discussion and
compromise among committers be the default resolution mechanism.
# Becoming a Committer
All contributors who land a non-trivial contribution should be on-boarded in a timely manner,
and added as a committer, and be given write access to the repository.
Committers are expected to follow this policy and continue to send pull requests, go through
proper review, and have other committers merge their pull requests.
# TC Process
The TC uses a "consensus seeking" process for issues that are escalated to the TC.
The group tries to find a resolution that has no open objections among TC members.
If a consensus cannot be reached that has no objections then a majority wins vote
is called. It is also expected that the majority of decisions made by the TC are via
a consensus seeking process and that voting is only used as a last-resort.
Resolution may involve returning the issue to committers with suggestions on how to
move forward towards a consensus. It is not expected that a meeting of the TC
will resolve all issues on its agenda during that meeting and may prefer to continue
the discussion happening among the committers.
Members can be added to the TC at any time. Any committer can nominate another committer
to the TC and the TC uses its standard consensus seeking process to evaluate whether or
not to add this new member. Members who do not participate consistently at the level of
a majority of the other members are expected to resign.

View File

@ -1,3 +1,493 @@
5.1.0 / 2025-03-31
========================
* Add support for `Uint8Array` in `res.send()`
* Add support for ETag option in `res.sendFile()`
* Add support for multiple links with the same rel in `res.links()`
* Add funding field to package.json
* perf: use loop for acceptParams
* refactor: prefix built-in node module imports
* deps: remove `setprototypeof`
* deps: remove `safe-buffer`
* deps: remove `utils-merge`
* deps: remove `methods`
* deps: remove `depd`
* deps: `debug@^4.4.0`
* deps: `body-parser@^2.2.0`
* deps: `router@^2.2.0`
* deps: `content-type@^1.0.5`
* deps: `finalhandler@^2.1.0`
* deps: `qs@^6.14.0`
* deps: `server-static@2.2.0`
* deps: `type-is@2.0.1`
5.0.1 / 2024-10-08
==========
* Update `cookie` semver lock to address [CVE-2024-47764](https://nvd.nist.gov/vuln/detail/CVE-2024-47764)
5.0.0 / 2024-09-10
=========================
* remove:
- `path-is-absolute` dependency - use `path.isAbsolute` instead
* breaking:
* `res.status()` accepts only integers, and input must be greater than 99 and less than 1000
* will throw a `RangeError: Invalid status code: ${code}. Status code must be greater than 99 and less than 1000.` for inputs outside this range
* will throw a `TypeError: Invalid status code: ${code}. Status code must be an integer.` for non integer inputs
* deps: send@1.0.0
* `res.redirect('back')` and `res.location('back')` is no longer a supported magic string, explicitly use `req.get('Referrer') || '/'`.
* change:
- `res.clearCookie` will ignore user provided `maxAge` and `expires` options
* deps: cookie-signature@^1.2.1
* deps: debug@4.3.6
* deps: merge-descriptors@^2.0.0
* deps: serve-static@^2.1.0
* deps: qs@6.13.0
* deps: accepts@^2.0.0
* deps: mime-types@^3.0.0
- `application/javascript` => `text/javascript`
* deps: type-is@^2.0.0
* deps: content-disposition@^1.0.0
* deps: finalhandler@^2.0.0
* deps: fresh@^2.0.0
* deps: body-parser@^2.0.1
* deps: send@^1.1.0
5.0.0-beta.3 / 2024-03-25
=========================
This incorporates all changes after 4.19.1 up to 4.19.2.
5.0.0-beta.2 / 2024-03-20
=========================
This incorporates all changes after 4.17.2 up to 4.19.1.
5.0.0-beta.1 / 2022-02-14
=========================
This is the first Express 5.0 beta release, based off 4.17.2 and includes
changes from 5.0.0-alpha.8.
* change:
- Default "query parser" setting to `'simple'`
- Requires Node.js 4+
- Use `mime-types` for file to content type mapping
* deps: array-flatten@3.0.0
* deps: body-parser@2.0.0-beta.1
- `req.body` is no longer always initialized to `{}`
- `urlencoded` parser now defaults `extended` to `false`
- Use `on-finished` to determine when body read
* deps: router@2.0.0-beta.1
- Add new `?`, `*`, and `+` parameter modifiers
- Internalize private `router.process_params` method
- Matching group expressions are only RegExp syntax
- Named matching groups no longer available by position in `req.params`
- Regular expressions can only be used in a matching group
- Remove `debug` dependency
- Special `*` path segment behavior removed
- deps: array-flatten@3.0.0
- deps: parseurl@~1.3.3
- deps: path-to-regexp@3.2.0
- deps: setprototypeof@1.2.0
* deps: send@1.0.0-beta.1
- Change `dotfiles` option default to `'ignore'`
- Remove `hidden` option; use `dotfiles` option instead
- Use `mime-types` for file to content type mapping
- deps: debug@3.1.0
* deps: serve-static@2.0.0-beta.1
- Change `dotfiles` option default to `'ignore'`
- Remove `hidden` option; use `dotfiles` option instead
- Use `mime-types` for file to content type mapping
- Remove `express.static.mime` export; use `mime-types` package instead
- deps: send@1.0.0-beta.1
5.0.0-alpha.8 / 2020-03-25
==========================
This is the eighth Express 5.0 alpha release, based off 4.17.1 and includes
changes from 5.0.0-alpha.7.
5.0.0-alpha.7 / 2018-10-26
==========================
This is the seventh Express 5.0 alpha release, based off 4.16.4 and includes
changes from 5.0.0-alpha.6.
The major change with this alpha is the basic support for returned, rejected
Promises in the router.
* remove:
- `path-to-regexp` dependency
* deps: debug@3.1.0
- Add `DEBUG_HIDE_DATE` environment variable
- Change timer to per-namespace instead of global
- Change non-TTY date format
- Remove `DEBUG_FD` environment variable support
- Support 256 namespace colors
* deps: router@2.0.0-alpha.1
- Add basic support for returned, rejected Promises
- Fix JSDoc for `Router` constructor
- deps: debug@3.1.0
- deps: parseurl@~1.3.2
- deps: setprototypeof@1.1.0
- deps: utils-merge@1.0.1
5.0.0-alpha.6 / 2017-09-24
==========================
This is the sixth Express 5.0 alpha release, based off 4.15.5 and includes
changes from 5.0.0-alpha.5.
* remove:
- `res.redirect(url, status)` signature - use `res.redirect(status, url)`
- `res.send(status, body)` signature - use `res.status(status).send(body)`
* deps: router@~1.3.1
- deps: debug@2.6.8
5.0.0-alpha.5 / 2017-03-06
==========================
This is the fifth Express 5.0 alpha release, based off 4.15.2 and includes
changes from 5.0.0-alpha.4.
5.0.0-alpha.4 / 2017-03-01
==========================
This is the fourth Express 5.0 alpha release, based off 4.15.0 and includes
changes from 5.0.0-alpha.3.
* remove:
- Remove Express 3.x middleware error stubs
* deps: router@~1.3.0
- Add `next("router")` to exit from router
- Fix case where `router.use` skipped requests routes did not
- Skip routing when `req.url` is not set
- Use `%o` in path debug to tell types apart
- deps: debug@2.6.1
- deps: setprototypeof@1.0.3
- perf: add fast match path for `*` route
5.0.0-alpha.3 / 2017-01-28
==========================
This is the third Express 5.0 alpha release, based off 4.14.1 and includes
changes from 5.0.0-alpha.2.
* remove:
- `res.json(status, obj)` signature - use `res.status(status).json(obj)`
- `res.jsonp(status, obj)` signature - use `res.status(status).jsonp(obj)`
- `res.vary()` (no arguments) -- provide a field name as an argument
* deps: array-flatten@2.1.1
* deps: path-is-absolute@1.0.1
* deps: router@~1.1.5
- deps: array-flatten@2.0.1
- deps: methods@~1.1.2
- deps: parseurl@~1.3.1
- deps: setprototypeof@1.0.2
5.0.0-alpha.2 / 2015-07-06
==========================
This is the second Express 5.0 alpha release, based off 4.13.1 and includes
changes from 5.0.0-alpha.1.
* remove:
- `app.param(fn)`
- `req.param()` -- use `req.params`, `req.body`, or `req.query` instead
* change:
- `res.render` callback is always async, even for sync view engines
- The leading `:` character in `name` for `app.param(name, fn)` is no longer removed
- Use `router` module for routing
- Use `path-is-absolute` module for absolute path detection
5.0.0-alpha.1 / 2014-11-06
==========================
This is the first Express 5.0 alpha release, based off 4.10.1.
* remove:
- `app.del` - use `app.delete`
- `req.acceptsCharset` - use `req.acceptsCharsets`
- `req.acceptsEncoding` - use `req.acceptsEncodings`
- `req.acceptsLanguage` - use `req.acceptsLanguages`
- `res.json(obj, status)` signature - use `res.json(status, obj)`
- `res.jsonp(obj, status)` signature - use `res.jsonp(status, obj)`
- `res.send(body, status)` signature - use `res.send(status, body)`
- `res.send(status)` signature - use `res.sendStatus(status)`
- `res.sendfile` - use `res.sendFile` instead
- `express.query` middleware
* change:
- `req.host` now returns host (`hostname:port`) - use `req.hostname` for only hostname
- `req.query` is now a getter instead of a plain property
* add:
- `app.router` is a reference to the base router
4.20.0 / 2024-09-10
==========
* deps: serve-static@0.16.0
* Remove link renderization in html while redirecting
* deps: send@0.19.0
* Remove link renderization in html while redirecting
* deps: body-parser@0.6.0
* add `depth` option to customize the depth level in the parser
* IMPORTANT: The default `depth` level for parsing URL-encoded data is now `32` (previously was `Infinity`)
* Remove link renderization in html while using `res.redirect`
* deps: path-to-regexp@0.1.10
- Adds support for named matching groups in the routes using a regex
- Adds backtracking protection to parameters without regexes defined
* deps: encodeurl@~2.0.0
- Removes encoding of `\`, `|`, and `^` to align better with URL spec
* Deprecate passing `options.maxAge` and `options.expires` to `res.clearCookie`
- Will be ignored in v5, clearCookie will set a cookie with an expires in the past to instruct clients to delete the cookie
4.19.2 / 2024-03-25
==========
* Improved fix for open redirect allow list bypass
4.19.1 / 2024-03-20
==========
* Allow passing non-strings to res.location with new encoding handling checks
4.19.0 / 2024-03-20
==========
* Prevent open redirect allow list bypass due to encodeurl
* deps: cookie@0.6.0
4.18.3 / 2024-02-29
==========
* Fix routing requests without method
* deps: body-parser@1.20.2
- Fix strict json error message on Node.js 19+
- deps: content-type@~1.0.5
- deps: raw-body@2.5.2
* deps: cookie@0.6.0
- Add `partitioned` option
4.18.2 / 2022-10-08
===================
* Fix regression routing a large stack in a single route
* deps: body-parser@1.20.1
- deps: qs@6.11.0
- perf: remove unnecessary object clone
* deps: qs@6.11.0
4.18.1 / 2022-04-29
===================
* Fix hanging on large stack of sync routes
4.18.0 / 2022-04-25
===================
* Add "root" option to `res.download`
* Allow `options` without `filename` in `res.download`
* Deprecate string and non-integer arguments to `res.status`
* Fix behavior of `null`/`undefined` as `maxAge` in `res.cookie`
* Fix handling very large stacks of sync middleware
* Ignore `Object.prototype` values in settings through `app.set`/`app.get`
* Invoke `default` with same arguments as types in `res.format`
* Support proper 205 responses using `res.send`
* Use `http-errors` for `res.format` error
* deps: body-parser@1.20.0
- Fix error message for json parse whitespace in `strict`
- Fix internal error when inflated body exceeds limit
- Prevent loss of async hooks context
- Prevent hanging when request already read
- deps: depd@2.0.0
- deps: http-errors@2.0.0
- deps: on-finished@2.4.1
- deps: qs@6.10.3
- deps: raw-body@2.5.1
* deps: cookie@0.5.0
- Add `priority` option
- Fix `expires` option to reject invalid dates
* deps: depd@2.0.0
- Replace internal `eval` usage with `Function` constructor
- Use instance methods on `process` to check for listeners
* deps: finalhandler@1.2.0
- Remove set content headers that break response
- deps: on-finished@2.4.1
- deps: statuses@2.0.1
* deps: on-finished@2.4.1
- Prevent loss of async hooks context
* deps: qs@6.10.3
* deps: send@0.18.0
- Fix emitted 416 error missing headers property
- Limit the headers removed for 304 response
- deps: depd@2.0.0
- deps: destroy@1.2.0
- deps: http-errors@2.0.0
- deps: on-finished@2.4.1
- deps: statuses@2.0.1
* deps: serve-static@1.15.0
- deps: send@0.18.0
* deps: statuses@2.0.1
- Remove code 306
- Rename `425 Unordered Collection` to standard `425 Too Early`
4.17.3 / 2022-02-16
===================
* deps: accepts@~1.3.8
- deps: mime-types@~2.1.34
- deps: negotiator@0.6.3
* deps: body-parser@1.19.2
- deps: bytes@3.1.2
- deps: qs@6.9.7
- deps: raw-body@2.4.3
* deps: cookie@0.4.2
* deps: qs@6.9.7
* Fix handling of `__proto__` keys
* pref: remove unnecessary regexp for trust proxy
4.17.2 / 2021-12-16
===================
* Fix handling of `undefined` in `res.jsonp`
* Fix handling of `undefined` when `"json escape"` is enabled
* Fix incorrect middleware execution with unanchored `RegExp`s
* Fix `res.jsonp(obj, status)` deprecation message
* Fix typo in `res.is` JSDoc
* deps: body-parser@1.19.1
- deps: bytes@3.1.1
- deps: http-errors@1.8.1
- deps: qs@6.9.6
- deps: raw-body@2.4.2
- deps: safe-buffer@5.2.1
- deps: type-is@~1.6.18
* deps: content-disposition@0.5.4
- deps: safe-buffer@5.2.1
* deps: cookie@0.4.1
- Fix `maxAge` option to reject invalid values
* deps: proxy-addr@~2.0.7
- Use `req.socket` over deprecated `req.connection`
- deps: forwarded@0.2.0
- deps: ipaddr.js@1.9.1
* deps: qs@6.9.6
* deps: safe-buffer@5.2.1
* deps: send@0.17.2
- deps: http-errors@1.8.1
- deps: ms@2.1.3
- pref: ignore empty http tokens
* deps: serve-static@1.14.2
- deps: send@0.17.2
* deps: setprototypeof@1.2.0
4.17.1 / 2019-05-25
===================
* Revert "Improve error message for `null`/`undefined` to `res.status`"
4.17.0 / 2019-05-16
===================
* Add `express.raw` to parse bodies into `Buffer`
* Add `express.text` to parse bodies into string
* Improve error message for non-strings to `res.sendFile`
* Improve error message for `null`/`undefined` to `res.status`
* Support multiple hosts in `X-Forwarded-Host`
* deps: accepts@~1.3.7
* deps: body-parser@1.19.0
- Add encoding MIK
- Add petabyte (`pb`) support
- Fix parsing array brackets after index
- deps: bytes@3.1.0
- deps: http-errors@1.7.2
- deps: iconv-lite@0.4.24
- deps: qs@6.7.0
- deps: raw-body@2.4.0
- deps: type-is@~1.6.17
* deps: content-disposition@0.5.3
* deps: cookie@0.4.0
- Add `SameSite=None` support
* deps: finalhandler@~1.1.2
- Set stricter `Content-Security-Policy` header
- deps: parseurl@~1.3.3
- deps: statuses@~1.5.0
* deps: parseurl@~1.3.3
* deps: proxy-addr@~2.0.5
- deps: ipaddr.js@1.9.0
* deps: qs@6.7.0
- Fix parsing array brackets after index
* deps: range-parser@~1.2.1
* deps: send@0.17.1
- Set stricter CSP header in redirect & error responses
- deps: http-errors@~1.7.2
- deps: mime@1.6.0
- deps: ms@2.1.1
- deps: range-parser@~1.2.1
- deps: statuses@~1.5.0
- perf: remove redundant `path.normalize` call
* deps: serve-static@1.14.1
- Set stricter CSP header in redirect response
- deps: parseurl@~1.3.3
- deps: send@0.17.1
* deps: setprototypeof@1.1.1
* deps: statuses@~1.5.0
- Add `103 Early Hints`
* deps: type-is@~1.6.18
- deps: mime-types@~2.1.24
- perf: prevent internal `throw` on invalid type
4.16.4 / 2018-10-10
===================
* Fix issue where `"Request aborted"` may be logged in `res.sendfile`
* Fix JSDoc for `Router` constructor
* deps: body-parser@1.18.3
- Fix deprecation warnings on Node.js 10+
- Fix stack trace for strict json parse error
- deps: depd@~1.1.2
- deps: http-errors@~1.6.3
- deps: iconv-lite@0.4.23
- deps: qs@6.5.2
- deps: raw-body@2.3.3
- deps: type-is@~1.6.16
* deps: proxy-addr@~2.0.4
- deps: ipaddr.js@1.8.0
* deps: qs@6.5.2
* deps: safe-buffer@5.1.2
4.16.3 / 2018-03-12
===================
* deps: accepts@~1.3.5
- deps: mime-types@~2.1.18
* deps: depd@~1.1.2
- perf: remove argument reassignment
* deps: encodeurl@~1.0.2
- Fix encoding `%` as last character
* deps: finalhandler@1.1.1
- Fix 404 output for bad / missing pathnames
- deps: encodeurl@~1.0.2
- deps: statuses@~1.4.0
* deps: proxy-addr@~2.0.3
- deps: ipaddr.js@1.6.0
* deps: send@0.16.2
- Fix incorrect end tag in default error & redirects
- deps: depd@~1.1.2
- deps: encodeurl@~1.0.2
- deps: statuses@~1.4.0
* deps: serve-static@1.13.2
- Fix incorrect end tag in redirects
- deps: encodeurl@~1.0.2
- deps: send@0.16.2
* deps: statuses@~1.4.0
* deps: type-is@~1.6.16
- deps: mime-types@~2.1.18
4.16.2 / 2017-10-09
===================
* Fix `TypeError` in `res.send` when given `Buffer` and `ETag` header set
* perf: skip parsing of entire `X-Forwarded-Proto` header
4.16.1 / 2017-09-29
===================
@ -11,6 +501,7 @@
* Add `"json escape"` setting for `res.json` and `res.jsonp`
* Add `express.json` and `express.urlencoded` to parse bodies
* Add `options` argument to `res.download`
* Improve error message when autoloading invalid view engine
* Improve error messages when non-function provided as middleware
* Skip `Buffer` encoding when not generating ETag for small response
@ -240,7 +731,7 @@
- Fix including type extensions in parameters in `Accept` parsing
- Fix parsing `Accept` parameters with quoted equals
- Fix parsing `Accept` parameters with quoted semicolons
- Many performance improvments
- Many performance improvements
- deps: mime-types@~2.1.11
- deps: negotiator@0.6.1
* deps: content-type@~1.0.2
@ -255,7 +746,7 @@
- perf: enable strict mode
- perf: hoist regular expression
- perf: use for loop in parse
- perf: use string concatination for serialization
- perf: use string concatenation for serialization
* deps: finalhandler@0.5.0
- Change invalid or non-numeric status code to 500
- Overwrite status message to match set status code
@ -265,7 +756,7 @@
* deps: proxy-addr@~1.1.2
- Fix accepting various invalid netmasks
- Fix IPv6-mapped IPv4 validation edge cases
- IPv4 netmasks must be contingous
- IPv4 netmasks must be contiguous
- IPv6 addresses cannot be used as a netmask
- deps: ipaddr.js@1.1.1
* deps: qs@6.2.0
@ -1043,13 +1534,13 @@
- deps: negotiator@0.4.6
* deps: debug@1.0.2
* deps: send@0.4.3
- Do not throw un-catchable error on file open race condition
- Do not throw uncatchable error on file open race condition
- Use `escape-html` for HTML escaping
- deps: debug@1.0.2
- deps: finished@1.2.2
- deps: fresh@0.2.2
* deps: serve-static@1.2.3
- Do not throw un-catchable error on file open race condition
- Do not throw uncatchable error on file open race condition
- deps: send@0.4.3
4.4.2 / 2014-06-09
@ -1890,7 +2381,7 @@
* deps: connect@2.21.0
- deprecate `connect(middleware)` -- use `app.use(middleware)` instead
- deprecate `connect.createServer()` -- use `connect()` instead
- fix `res.setHeader()` patch to work with with get -> append -> set pattern
- fix `res.setHeader()` patch to work with get -> append -> set pattern
- deps: compression@~1.0.8
- deps: errorhandler@~1.1.1
- deps: express-session@~1.5.0
@ -1929,7 +2420,7 @@
- deps: serve-static@1.2.3
* deps: debug@1.0.2
* deps: send@0.4.3
- Do not throw un-catchable error on file open race condition
- Do not throw uncatchable error on file open race condition
- Use `escape-html` for HTML escaping
- deps: debug@1.0.2
- deps: finished@1.2.2
@ -3101,8 +3592,8 @@ Shaw]
* Added node v0.1.97 compatibility
* Added support for deleting cookies via Request#cookie('key', null)
* Updated haml submodule
* Fixed not-found page, now using using charset utf-8
* Fixed show-exceptions page, now using using charset utf-8
* Fixed not-found page, now using charset utf-8
* Fixed show-exceptions page, now using charset utf-8
* Fixed view support due to fs.readFile Buffers
* Changed; mime.type() no longer accepts ".type" due to node extname() changes
@ -3114,7 +3605,7 @@ Shaw]
* Updated haml submodule
* Changed ETag; removed inode, modified time only
* Fixed LF to CRLF for setting multiple cookies
* Fixed cookie complation; values are now urlencoded
* Fixed cookie compilation; values are now urlencoded
* Fixed cookies parsing; accepts quoted values and url escaped cookies
0.11.0 / 2010-05-06
@ -3137,7 +3628,7 @@ Shaw]
==================
* Added charset support via Request#charset (automatically assigned to 'UTF-8' when respond()'s
encoding is set to 'utf8' or 'utf-8'.
encoding is set to 'utf8' or 'utf-8').
* Added "encoding" option to Request#render(). Closes #299
* Added "dump exceptions" setting, which is enabled by default.
* Added simple ejs template engine support
@ -3176,7 +3667,7 @@ Shaw]
* Added [haml.js](http://github.com/visionmedia/haml.js) submodule; removed haml-js
* Added callback function support to Request#halt() as 3rd/4th arg
* Added preprocessing of route param wildcards using param(). Closes #251
* Added view partial support (with collections etc)
* Added view partial support (with collections etc.)
* Fixed bug preventing falsey params (such as ?page=0). Closes #286
* Fixed setting of multiple cookies. Closes #199
* Changed; view naming convention is now NAME.TYPE.ENGINE (for example page.html.haml)
@ -3309,7 +3800,7 @@ Shaw]
* Added "plot" format option for Profiler (for gnuplot processing)
* Added request number to Profiler plugin
* Fixed binary encoding for multi-part file uploads, was previously defaulting to UTF8
* Fixed binary encoding for multipart file uploads, was previously defaulting to UTF8
* Fixed issue with routes not firing when not files are present. Closes #184
* Fixed process.Promise -> events.Promise
@ -3355,7 +3846,7 @@ Shaw]
* Updated sample chat app to show messages on load
* Updated libxmljs parseString -> parseHtmlString
* Fixed `make init` to work with older versions of git
* Fixed specs can now run independent specs for those who cant build deps. Closes #127
* Fixed specs can now run independent specs for those who can't build deps. Closes #127
* Fixed issues introduced by the node url module changes. Closes 126.
* Fixed two assertions failing due to Collection#keys() returning strings
* Fixed faulty Collection#toArray() spec due to keys() returning strings

View File

@ -1,125 +0,0 @@
# README guidelines
Every module in the expressjs, pillarjs, and jshttp organizations should have
a README file named `README.md`. The purpose of the README is to:
- Explain the purpose of the module and how to use it.
- Act as a landing page (both on GitHub and npmjs.com) for the module to help
people find it via search. Middleware module READMEs are also incorporated
into https://expressjs.com/en/resources/middleware.html.
- Encourage community contributions and participation.
Use the [README template](https://github.com/expressjs/express/wiki/README-template)
to quickly create a new README file.
## Top-level items
**Badges** (optional): At the very top (with no subheading), include any
applicable badges, such as npm version/downloads, build status, test coverage,
and so on. Badges should resolve properly (not display a broken image).
Possible badges include:
- npm version: `[![NPM Version][npm-image]][npm-url]`
- npm downloads: `[![NPM Downloads][downloads-image]][downloads-url]`
- Build status: `[![Build Status][travis-image]][travis-url]`
- Test coverage: `[![Test Coverage][coveralls-image]][coveralls-url]`
- Tips: `[![Gratipay][gratipay-image]][gratipay-url]`
**Summary**: Following badges, provide a one- or two-sentence description of
what the module does. This should be the same as the npmjs.org blurb (which
comes from the description property of `package.json`). Since npm doesn't
handle markdown for the blurb, avoid using markdown in the summary sentence.
**TOC** (Optional): For longer READMEs, provide a table of contents that has
a relative link to each section. A tool such as
[doctoc](https://www.npmjs.com/package/doctoc) makes it very easy to generate
a TOC.
## Overview
Optionally, include a section of one or two paragraphs with more high-level
information on what the module does, what problems it solves, why one would
use it and how. Don't just repeat what's in the summary.
## Installation
Required. This section is typically just:
```sh
$ npm install module-name
```
But include any other steps or requirements.
NOTE: Use the `sh` code block to make the shell command display properly on
the website.
## Basic use
- Provide a general description of how to use the module with code sample.
Include any important caveats or restrictions.
- Explain the most common use cases.
- Optional: a simple "hello world" type example (where applicable). This
example is in addition to the more comprehensive [example section](#examples)
later.
## API
Provide complete API documentation.
Formatting conventions: Each function is listed in a 3rd-level heading (`###`),
like this:
```
### Function_name(arg, options [, optional_arg] ... )
```
**Options objects**
For arguments that are objects (for example, options object), describe the
properties in a table, as follows. This matches the formatting used in the
[Express API docs](https://expressjs.com/en/4x/api.html).
|Property | Description | Type | Default|
|----------|-----------|------------|-------------|
|Name of the property in `monospace`. | Brief description | String, Number, Boolean, etc. | If applicable.|
If all the properties are required (i.e. there are no defaults), then you
can omit the default column.
Instead of very lengthy descriptions, link out to subsequent paragraphs for
more detailed explanation of specific cases (e.g. "When this property is set
to 'foobar', xyz happens; see &lt;link to following section &gt;.)
If there are options properties that are themselves options, use additional
tables. See [`trust proxy` and `etag` properties](https://expressjs.com/en/4x/api.html#app.settings.table).
## Examples
Every README should have at least one example; ideally more. For code samples,
be sure to use the `js` code block, for proper display in the website, e.g.:
```js
var csurf = require('csurf')
...
```
## Tests
What tests are included.
How to run them.
The convention for running tests is `npm test`. All our projects should follow
this convention.
## Contributors
Names of module "owners" (lead developers) and other developers who have
contributed.
## License
Link to the license, with a short description of what it is, e.g. "MIT" or
whatever. Ideally, avoid putting the license text directly in the README; link
to it instead.

232
Readme.md
View File

@ -1,22 +1,48 @@
[![Express Logo](https://i.cloudup.com/zfY6lL7eFa-3000x3000.png)](http://expressjs.com/)
[![Express Logo](https://i.cloudup.com/zfY6lL7eFa-3000x3000.png)](https://expressjs.com/)
Fast, unopinionated, minimalist web framework for [node](http://nodejs.org).
**Fast, unopinionated, minimalist web framework for [Node.js](https://nodejs.org).**
**This project has a [Code of Conduct].**
## Table of contents
- [Table of contents](#table-of-contents)
- [Installation](#installation)
- [Features](#features)
- [Docs \& Community](#docs--community)
- [Quick Start](#quick-start)
- [Philosophy](#philosophy)
- [Examples](#examples)
- [Contributing](#contributing)
- [Security Issues](#security-issues)
- [Running Tests](#running-tests)
- [Current project team members](#current-project-team-members)
- [TC (Technical Committee)](#tc-technical-committee)
- [TC emeriti members](#tc-emeriti-members)
- [Triagers](#triagers)
- [Emeritus Triagers](#emeritus-triagers)
- [License](#license)
[![NPM Version][npm-version-image]][npm-url]
[![NPM Downloads][npm-downloads-image]][npm-downloads-url]
[![Linux Build][github-actions-ci-image]][github-actions-ci-url]
[![Test Coverage][coveralls-image]][coveralls-url]
[![OpenSSF Scorecard Badge][ossf-scorecard-badge]][ossf-scorecard-visualizer]
[![NPM Version][npm-image]][npm-url]
[![NPM Downloads][downloads-image]][downloads-url]
[![Linux Build][travis-image]][travis-url]
[![Windows Build][appveyor-image]][appveyor-url]
[![Test Coverage][coveralls-image]][coveralls-url]
```js
var express = require('express')
var app = express()
import express from 'express'
app.get('/', function (req, res) {
const app = express()
app.get('/', (req, res) => {
res.send('Hello World')
})
app.listen(3000)
app.listen(3000, () => {
console.log('Server is running on http://localhost:3000')
})
```
## Installation
@ -25,16 +51,19 @@ This is a [Node.js](https://nodejs.org/en/) module available through the
[npm registry](https://www.npmjs.com/).
Before installing, [download and install Node.js](https://nodejs.org/en/download/).
Node.js 0.10 or higher is required.
Node.js 18 or higher is required.
If this is a brand new project, make sure to create a `package.json` first with
the [`npm init` command](https://docs.npmjs.com/creating-a-package-json-file).
Installation is done using the
[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
```bash
$ npm install express
npm install express
```
Follow [our installing guide](http://expressjs.com/en/starter/installing.html)
Follow [our installing guide](https://expressjs.com/en/starter/installing.html)
for more information.
## Features
@ -49,18 +78,11 @@ for more information.
## Docs & Community
* [Website and Documentation](http://expressjs.com/) - [[website repo](https://github.com/expressjs/expressjs.com)]
* [#express](https://webchat.freenode.net/?channels=express) on freenode IRC
* [Website and Documentation](https://expressjs.com/) - [[website repo](https://github.com/expressjs/expressjs.com)]
* [GitHub Organization](https://github.com/expressjs) for Official Middleware & Modules
* Visit the [Wiki](https://github.com/expressjs/express/wiki)
* [Google Group](https://groups.google.com/group/express-js) for discussion
* [Gitter](https://gitter.im/expressjs/express) for support and discussion
* [Github Discussions](https://github.com/expressjs/discussions) for discussion on the development and usage of Express
**PROTIP** Be sure to read [Migrating from 3.x to 4.x](https://github.com/expressjs/express/wiki/Migrating-from-3.x-to-4.x) as well as [New features in 4.x](https://github.com/expressjs/express/wiki/New-features-in-4.x).
### Security Issues
If you discover a security vulnerability in Express, please see [Security Policies and Procedures](Security.md).
**PROTIP** Be sure to read the [migration guide to v5](https://expressjs.com/en/guide/migrating-5)
## Quick Start
@ -69,85 +91,185 @@ If you discover a security vulnerability in Express, please see [Security Polici
Install the executable. The executable's major version will match Express's:
```bash
$ npm install -g express-generator@4
npm install -g express-generator@4
```
Create the app:
```bash
$ express /tmp/foo && cd /tmp/foo
express /tmp/foo && cd /tmp/foo
```
Install dependencies:
```bash
$ npm install
npm install
```
Start the server:
```bash
$ npm start
npm start
```
View the website at: http://localhost:3000
## Philosophy
The Express philosophy is to provide small, robust tooling for HTTP servers, making
it a great solution for single page applications, web sites, hybrids, or public
it a great solution for single page applications, websites, hybrids, or public
HTTP APIs.
Express does not force you to use any specific ORM or template engine. With support for over
14 template engines via [Consolidate.js](https://github.com/tj/consolidate.js),
14 template engines via [@ladjs/consolidate](https://github.com/ladjs/consolidate),
you can quickly craft your perfect framework.
## Examples
To view the examples, clone the Express repo and install the dependencies:
To view the examples, clone the Express repository:
```bash
$ git clone git://github.com/expressjs/express.git --depth 1
$ cd express
$ npm install
git clone https://github.com/expressjs/express.git --depth 1 && cd express
```
Then install the dependencies:
```bash
npm install
```
Then run whichever example you want:
```bash
$ node examples/content-negotiation
node examples/content-negotiation
```
## Tests
## Contributing
To run the test suite, first install the dependencies, then run `npm test`:
The Express.js project welcomes all constructive contributions. Contributions take many forms,
from code for bug fixes and enhancements, to additions and fixes to documentation, additional
tests, triaging incoming pull requests and issues, and more!
See the [Contributing Guide] for more technical details on contributing.
### Security Issues
If you discover a security vulnerability in Express, please see [Security Policies and Procedures](SECURITY.md).
### Running Tests
To run the test suite, first install the dependencies:
```bash
$ npm install
$ npm test
npm install
```
## People
Then run `npm test`:
The original author of Express is [TJ Holowaychuk](https://github.com/tj) [![TJ's Gratipay][gratipay-image-visionmedia]][gratipay-url-visionmedia]
```bash
npm test
```
The current lead maintainer is [Douglas Christopher Wilson](https://github.com/dougwilson) [![Doug's Gratipay][gratipay-image-dougwilson]][gratipay-url-dougwilson]
## Current project team members
For information about the governance of the express.js project, see [GOVERNANCE.md](https://github.com/expressjs/discussions/blob/HEAD/docs/GOVERNANCE.md).
The original author of Express is [TJ Holowaychuk](https://github.com/tj)
[List of all contributors](https://github.com/expressjs/express/graphs/contributors)
### TC (Technical Committee)
* [UlisesGascon](https://github.com/UlisesGascon) - **Ulises Gascón** (he/him)
* [jonchurch](https://github.com/jonchurch) - **Jon Church**
* [wesleytodd](https://github.com/wesleytodd) - **Wes Todd**
* [LinusU](https://github.com/LinusU) - **Linus Unnebäck**
* [blakeembrey](https://github.com/blakeembrey) - **Blake Embrey**
* [sheplu](https://github.com/sheplu) - **Jean Burellier**
* [crandmck](https://github.com/crandmck) - **Rand McKinney**
* [ctcpip](https://github.com/ctcpip) - **Chris de Almeida**
<details>
<summary>TC emeriti members</summary>
#### TC emeriti members
* [dougwilson](https://github.com/dougwilson) - **Douglas Wilson**
* [hacksparrow](https://github.com/hacksparrow) - **Hage Yaapa**
* [jonathanong](https://github.com/jonathanong) - **jongleberry**
* [niftylettuce](https://github.com/niftylettuce) - **niftylettuce**
* [troygoode](https://github.com/troygoode) - **Troy Goode**
</details>
### Triagers
* [aravindvnair99](https://github.com/aravindvnair99) - **Aravind Nair**
* [bjohansebas](https://github.com/bjohansebas) - **Sebastian Beltran**
* [carpasse](https://github.com/carpasse) - **Carlos Serrano**
* [CBID2](https://github.com/CBID2) - **Christine Belzie**
* [dpopp07](https://github.com/dpopp07) - **Dustin Popp**
* [UlisesGascon](https://github.com/UlisesGascon) - **Ulises Gascón** (he/him)
* [3imed-jaberi](https://github.com/3imed-jaberi) - **Imed Jaberi**
* [IamLizu](https://github.com/IamLizu) - **S M Mahmudul Hasan** (he/him)
* [Phillip9587](https://github.com/Phillip9587) - **Phillip Barta**
* [Sushmeet](https://github.com/Sushmeet) - **Sushmeet Sunger**
* [rxmarbles](https://github.com/rxmarbles) **Rick Markins** (He/him)
<details>
<summary>Triagers emeriti members</summary>
#### Emeritus Triagers
* [AuggieH](https://github.com/AuggieH) - **Auggie Hudak**
* [G-Rath](https://github.com/G-Rath) - **Gareth Jones**
* [MohammadXroid](https://github.com/MohammadXroid) - **Mohammad Ayashi**
* [NawafSwe](https://github.com/NawafSwe) - **Nawaf Alsharqi**
* [NotMoni](https://github.com/NotMoni) - **Moni**
* [VigneshMurugan](https://github.com/VigneshMurugan) - **Vignesh Murugan**
* [davidmashe](https://github.com/davidmashe) - **David Ashe**
* [digitaIfabric](https://github.com/digitaIfabric) - **David**
* [e-l-i-s-e](https://github.com/e-l-i-s-e) - **Elise Bonner**
* [fed135](https://github.com/fed135) - **Frederic Charette**
* [firmanJS](https://github.com/firmanJS) - **Firman Abdul Hakim**
* [getspooky](https://github.com/getspooky) - **Yasser Ameur**
* [ghinks](https://github.com/ghinks) - **Glenn**
* [ghousemohamed](https://github.com/ghousemohamed) - **Ghouse Mohamed**
* [gireeshpunathil](https://github.com/gireeshpunathil) - **Gireesh Punathil**
* [jake32321](https://github.com/jake32321) - **Jake Reed**
* [jonchurch](https://github.com/jonchurch) - **Jon Church**
* [lekanikotun](https://github.com/lekanikotun) - **Troy Goode**
* [marsonya](https://github.com/marsonya) - **Lekan Ikotun**
* [mastermatt](https://github.com/mastermatt) - **Matt R. Wilson**
* [maxakuru](https://github.com/maxakuru) - **Max Edell**
* [mlrawlings](https://github.com/mlrawlings) - **Michael Rawlings**
* [rodion-arr](https://github.com/rodion-arr) - **Rodion Abdurakhimov**
* [sheplu](https://github.com/sheplu) - **Jean Burellier**
* [tarunyadav1](https://github.com/tarunyadav1) - **Tarun yadav**
* [tunniclm](https://github.com/tunniclm) - **Mike Tunnicliffe**
* [enyoghasim](https://github.com/enyoghasim) - **David Enyoghasim**
* [0ss](https://github.com/0ss) - **Salah**
* [import-brain](https://github.com/import-brain) - **Eric Cheng** (he/him)
* [dakshkhetan](https://github.com/dakshkhetan) - **Daksh Khetan** (he/him)
* [lucasraziel](https://github.com/lucasraziel) - **Lucas Soares Do Rego**
* [mertcanaltin](https://github.com/mertcanaltin) - **Mert Can Altin**
</details>
## License
[MIT](LICENSE)
[npm-image]: https://img.shields.io/npm/v/express.svg
[npm-url]: https://npmjs.org/package/express
[downloads-image]: https://img.shields.io/npm/dm/express.svg
[downloads-url]: https://npmjs.org/package/express
[travis-image]: https://img.shields.io/travis/expressjs/express/master.svg?label=linux
[travis-url]: https://travis-ci.org/expressjs/express
[appveyor-image]: https://img.shields.io/appveyor/ci/dougwilson/express/master.svg?label=windows
[appveyor-url]: https://ci.appveyor.com/project/dougwilson/express
[coveralls-image]: https://img.shields.io/coveralls/expressjs/express/master.svg
[coveralls-image]: https://badgen.net/coveralls/c/github/expressjs/express/master
[coveralls-url]: https://coveralls.io/r/expressjs/express?branch=master
[gratipay-image-visionmedia]: https://img.shields.io/gratipay/visionmedia.svg
[gratipay-url-visionmedia]: https://gratipay.com/visionmedia/
[gratipay-image-dougwilson]: https://img.shields.io/gratipay/dougwilson.svg
[gratipay-url-dougwilson]: https://gratipay.com/dougwilson/
[github-actions-ci-image]: https://badgen.net/github/checks/expressjs/express/master?label=CI
[github-actions-ci-url]: https://github.com/expressjs/express/actions/workflows/ci.yml
[npm-downloads-image]: https://badgen.net/npm/dm/express
[npm-downloads-url]: https://npmcharts.com/compare/express?minimal=true
[npm-url]: https://npmjs.org/package/express
[npm-version-image]: https://badgen.net/npm/v/express
[ossf-scorecard-badge]: https://api.scorecard.dev/projects/github.com/expressjs/express/badge
[ossf-scorecard-visualizer]: https://ossf.github.io/scorecard-visualizer/#/projects/github.com/expressjs/express
[Code of Conduct]: https://github.com/expressjs/.github/blob/HEAD/CODE_OF_CONDUCT.md
[Contributing Guide]: https://github.com/expressjs/.github/blob/HEAD/CONTRIBUTING.md

View File

@ -1,186 +0,0 @@
# Express Release Process
This document contains the technical aspects of the Express release process. The
intended audience is those who have been authorized by the Express Technical
Committee (TC) to create, promote and sign official release builds for Express,
as npm packages hosted on https://npmjs.com/package/express.
## Who can make releases?
Release authorization is given by the Express TC. Once authorized, an individual
must have the following access permissions:
### 1. Github release access
The individual making the release will need to be a member of the
expressjs/express team with Write permission level so they are able to tag the
release commit and push changes to the expressjs/express repository
(see Steps 4 and 5).
### 2. npmjs.com release access
The individual making the release will need to be made an owner on the
`express` package on npmjs.com so they are able to publish the release
(see Step 6).
## How to publish a release
Before publishing, the following preconditions should be met:
- A release proposal issue or tracking pull request (see "Proposal branch"
below) will exist documenting:
- the proposed changes
- the type of release: patch, minor or major
- the version number (according to semantic versioning - http://semver.org)
- The proposed changes should be complete.
There are two main release flows: patch and non-patch.
The patch flow is for making **patch releases**. As per semantic versioning,
patch releases are for simple changes, eg: typo fixes, patch dependency updates,
and simple/low-risk bug fixes. Every other type of change is made via the
non-patch flow.
### Branch terminology
"Master branch"
- There is a branch in git used for the current major version of Express, named
`master`.
- This branch contains the completed commits for the next patch release of the
current major version.
- Releases for the current major version are published from this branch.
"Version branch"
- For any given major version of Express (current, previous or next) there is
a branch in git for that release named `<major-version>.x` (eg: `4.x`).
- This branch points to the commit of the latest tag for the given major version.
"Release branch"
- For any given major version of Express, there is a branch used for publishing
releases.
- For the current major version of Express, the release branch is the
"Master branch" named `master`.
- For all other major versions of Express, the release branch is the
"Version branch" named `<major-version>.x`.
"Proposal branch"
- A branch in git representing a proposed new release of Express. This can be a
minor or major release, named `<major-version>.0` for a major release,
`<major-version>.<minor-version>` for a minor release.
- A tracking pull request should exist to document the proposed release,
targeted at the appropriate release branch. Prior to opening the tracking
pull request the content of the release may have be discussed in an issue.
- This branch contains the commits accepted so far that implement the proposal
in the tracking pull request.
### Patch flow
In the patch flow, simple changes are committed to the release branch which
acts as an ever-present branch for the next patch release of the associated
major version of Express.
The release branch is usually kept in a state where it is ready to release.
Releases are made when sufficient time or change has been made to warrant it.
This is usually proposed and decided using a github issue.
### Non-patch flow
In the non-patch flow, changes are committed to a temporary proposal branch
created specifically for that release proposal. The branch is based on the
most recent release of the major version of Express that the release targets.
Releases are made when all the changes on a proposal branch are complete and
approved. This is done by merging the proposal branch into the release branch
(using a fast-forward merge), tagging it with the new version number and
publishing the release package to npmjs.com.
### Flow
Below is a detailed description of the steps to publish a release.
#### Step 1. Check the release is ready to publish
Check any relevant information to ensure the release is ready, eg: any
milestone, label, issue or tracking pull request for the release. The release
is ready when all proposed code, tests and documentation updates are complete
(either merged, closed or re-targeted to another release).
#### Step 2. (Non-patch flow only) Merge the proposal branch into the release branch
In the patch flow: skip this step.
In the non-patch flow:
```sh
$ git checkout <release-branch>
$ git merge --ff-only <proposal-branch>
```
<release-branch> - see "Release branch" of "Branches" above.
<proposal-branch> - see "Proposal branch" of "Non-patch flow" above.
**NOTE:** You may need to rebase the proposal branch to allow a fast-forward
merge. Using a fast-forward merge keeps the history clean as it does
not introduce merge commits.
### Step 3. Update the History.md and package.json to the new version number
The changes so far for the release should already be documented under the
"unreleased" section at the top of the History.md file, as per the usual
development practice. Change "unreleased" to the new release version / date.
Example diff fragment:
```diff
-unreleased
-==========
+4.13.3 / 2015-08-02
+===================
```
The version property in the package.json should already contain the version of
the previous release. Change it to the new release version.
Commit these changes together under a single commit with the message set to
the new release version (eg: `4.13.3`):
```sh
$ git checkout <release-branch>
<..edit files..>
$ git add History.md package.json
$ git commit -m '<version-number>'
```
### Step 4. Identify and tag the release commit with the new release version
Create a lightweight tag (rather than an annotated tag) named after the new
release version (eg: `4.13.3`).
```sh
$ git tag <version-number>
```
### Step 5. Push the release branch changes and tag to github
The branch and tag should be pushed directly to the main repository
(https://github.com/expressjs/express).
```sh
$ git push origin <release-branch>
$ git push origin <version-number>
```
### Step 6. Publish to npmjs.com
Ensure your local working copy is completely clean (no extra or changed files).
You can use `git status` for this purpose.
```sh
$ npm login <npm-username>
$ npm publish
```
**NOTE:** The version number to publish will be picked up automatically from
package.json.

View File

@ -14,7 +14,11 @@ Thank you for improving the security of Express. We appreciate your efforts and
responsible disclosure and will make every effort to acknowledge your
contributions.
Report security bugs by emailing the lead maintainer in the Readme.md file.
Report security bugs by emailing `express-security@lists.openjsf.org`.
To ensure the timely response to your report, please ensure that the entirety
of the report is contained within the email body and not solely behind a web
link or an attachment.
The lead maintainer will acknowledge your email within 48 hours, and will send a
more detailed response within 48 hours indicating the next steps in handling
@ -23,8 +27,13 @@ endeavor to keep you informed of the progress towards a fix and full
announcement, and may ask for additional information or guidance.
Report security bugs in third-party modules to the person or team maintaining
the module. You can also report a vulnerability through the
[Node Security Project](https://nodesecurity.io/report).
the module.
## Pre-release Versions
Alpha and Beta releases are unstable and **not suitable for production use**.
Vulnerabilities found in pre-releases should be reported according to the [Reporting a Bug](#reporting-a-bug) section.
Due to the unstable nature of the branch it is not guaranteed that any fixes will be released in the next pre-release.
## Disclosure Policy
@ -37,6 +46,10 @@ involving the following steps:
* Prepare fixes for all releases still under maintenance. These fixes will be
released as fast as possible to npm.
## The Express Threat Model
We are currently working on a new version of the security model, the most updated version can be found [here](https://github.com/expressjs/security-wg/blob/main/docs/ThreatModel.md)
## Comments on this Policy
If you have suggestions on how this process could be improved please submit a

View File

@ -1,28 +0,0 @@
environment:
matrix:
- nodejs_version: "0.10"
- nodejs_version: "0.12"
- nodejs_version: "1.8"
- nodejs_version: "2.5"
- nodejs_version: "3.3"
- nodejs_version: "4.8"
- nodejs_version: "5.12"
- nodejs_version: "6.11"
- nodejs_version: "7.10"
- nodejs_version: "8.4"
cache:
- node_modules
install:
- ps: Install-Product node $env:nodejs_version
- npm config set shrinkwrap false
- npm rm --save-dev connect-redis
- if exist node_modules npm prune
- if exist node_modules npm rebuild
- npm install
build: off
test_script:
- node --version
- npm --version
- npm run test-ci
- npm run lint
version: "{build}"

View File

@ -1,13 +1,17 @@
all:
@./run 1 middleware
@./run 5 middleware
@./run 10 middleware
@./run 15 middleware
@./run 20 middleware
@./run 30 middleware
@./run 50 middleware
@./run 100 middleware
@./run 1 middleware 50
@./run 5 middleware 50
@./run 10 middleware 50
@./run 15 middleware 50
@./run 20 middleware 50
@./run 30 middleware 50
@./run 50 middleware 50
@./run 100 middleware 50
@./run 10 middleware 100
@./run 10 middleware 250
@./run 10 middleware 500
@./run 10 middleware 1000
@echo
.PHONY: all

34
benchmarks/README.md Normal file
View File

@ -0,0 +1,34 @@
# Express Benchmarks
## Installation
You will need to install [wrk](https://github.com/wg/wrk/blob/master/INSTALL) in order to run the benchmarks.
## Running
To run the benchmarks, first install the dependencies `npm i`, then run `make`
The output will look something like this:
```
50 connections
1 middleware
7.15ms
6784.01
[...redacted...]
1000 connections
10 middleware
139.21ms
6155.19
```
### Tip: Include Node.js version in output
You can use `make && node -v` to include the node.js version in the output.
### Tip: Save the results to a file
You can use `make > results.log` to save the results to a file `results.log`.

View File

@ -13,7 +13,7 @@ while (n--) {
});
}
app.use(function(req, res, next){
app.use(function(req, res){
res.send('Hello World')
});

View File

@ -4,13 +4,15 @@ echo
MW=$1 node $2 &
pid=$!
echo " $3 connections"
sleep 2
wrk 'http://localhost:3333/?foo[bar]=baz' \
-d 3 \
-c 50 \
-c $3 \
-t 8 \
| grep 'Requests/sec' \
| awk '{ print " " $2 }'
| grep 'Requests/sec\|Latency' \
| awk '{ print " " $2 }'
kill $pid

29
examples/README.md Normal file
View File

@ -0,0 +1,29 @@
# Express examples
This page contains list of examples using Express.
- [auth](./auth) - Authentication with login and password
- [content-negotiation](./content-negotiation) - HTTP content negotiation
- [cookie-sessions](./cookie-sessions) - Working with cookie-based sessions
- [cookies](./cookies) - Working with cookies
- [downloads](./downloads) - Transferring files to client
- [ejs](./ejs) - Working with Embedded JavaScript templating (ejs)
- [error-pages](./error-pages) - Creating error pages
- [error](./error) - Working with error middleware
- [hello-world](./hello-world) - Simple request handler
- [markdown](./markdown) - Markdown as template engine
- [multi-router](./multi-router) - Working with multiple Express routers
- [mvc](./mvc) - MVC-style controllers
- [online](./online) - Tracking online user activity with `online` and `redis` packages
- [params](./params) - Working with route parameters
- [resource](./resource) - Multiple HTTP operations on the same resource
- [route-map](./route-map) - Organizing routes using a map
- [route-middleware](./route-middleware) - Working with route middleware
- [route-separation](./route-separation) - Organizing routes per each resource
- [search](./search) - Search API
- [session](./session) - User sessions
- [static-files](./static-files) - Serving static files
- [vhost](./vhost) - Working with virtual hosts
- [view-constructor](./view-constructor) - Rendering views dynamically
- [view-locals](./view-locals) - Saving data in request object between middleware calls
- [web-service](./web-service) - Simple API service

View File

@ -1,10 +1,12 @@
'use strict'
/**
* Module dependencies.
*/
var express = require('../..');
var hash = require('pbkdf2-password')()
var path = require('path');
var path = require('node:path');
var session = require('express-session');
var app = module.exports = express();
@ -16,7 +18,7 @@ app.set('views', path.join(__dirname, 'views'));
// middleware
app.use(express.urlencoded({ extended: false }))
app.use(express.urlencoded())
app.use(session({
resave: false, // don't save session if unmodified
saveUninitialized: false, // don't create session until something stored
@ -59,14 +61,14 @@ function authenticate(name, pass, fn) {
if (!module.parent) console.log('authenticating %s:%s', name, pass);
var user = users[name];
// query the db for the given username
if (!user) return fn(new Error('cannot find user'));
if (!user) return fn(null, null)
// apply the same algorithm to the POSTed password, applying
// the hash against the pass / salt, if there is a match we
// found the user
hash({ password: pass, salt: user.salt }, function (err, pass, salt, hash) {
if (err) return fn(err);
if (hash == user.hash) return fn(null, user);
fn(new Error('invalid password'));
if (hash === user.hash) return fn(null, user)
fn(null, null)
});
}
@ -99,8 +101,10 @@ app.get('/login', function(req, res){
res.render('login');
});
app.post('/login', function(req, res){
app.post('/login', function (req, res, next) {
if (!req.body) return res.sendStatus(400)
authenticate(req.body.username, req.body.password, function(err, user){
if (err) return next(err)
if (user) {
// Regenerate session when signing in
// to prevent fixation
@ -112,7 +116,7 @@ app.post('/login', function(req, res){
req.session.success = 'Authenticated as ' + user.name
+ ' click to <a href="/logout">logout</a>. '
+ ' You may now access <a href="/restricted">/restricted</a>.';
res.redirect('back');
res.redirect(req.get('Referrer') || '/');
});
} else {
req.session.error = 'Authentication failed, please check your '

View File

@ -1,6 +1,8 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title><%= title %></title>
<style>
body {
@ -8,7 +10,7 @@
font: 13px Helvetica, Arial, sans-serif;
}
.error {
color: red
color: red;
}
.success {
color: green;

View File

@ -1,22 +1,21 @@
<% var title = 'Authentication Example' %>
<% include head %>
<%- include('head', { title: 'Authentication Example' }) -%>
<h1>Login</h1>
<%- message %>
Try accessing <a href="/restricted">/restricted</a>, then authenticate with "tj" and "foobar".
<form method="post" action="/login">
<p>
<label>Username:</label>
<input type="text" name="username">
<label for="username">Username:</label>
<input type="text" name="username" id="username">
</p>
<p>
<label>Password:</label>
<input type="text" name="password">
<label for="password">Password:</label>
<input type="text" name="password" id="password">
</p>
<p>
<input type="submit" value="Login">
</p>
</form>
<% include foot %>
<%- include('foot') -%>

View File

@ -1,3 +1,5 @@
'use strict'
var users = [];
users.push({ name: 'Tobi' });

View File

@ -1,3 +1,5 @@
'use strict'
var express = require('../../');
var app = module.exports = express();
var users = require('./db');

View File

@ -1,3 +1,4 @@
'use strict'
var users = require('./db');

View File

@ -1,3 +1,5 @@
'use strict'
/**
* Module dependencies.
*/
@ -11,13 +13,10 @@ var app = module.exports = express();
app.use(cookieSession({ secret: 'manny is cool' }));
// do something with the session
app.use(count);
// custom middleware
function count(req, res) {
app.get('/', function (req, res) {
req.session.count = (req.session.count || 0) + 1
res.send('viewed ' + req.session.count + ' times\n')
}
})
/* istanbul ignore next */
if (!module.parent) {

View File

@ -1,3 +1,5 @@
'use strict'
/**
* Module dependencies.
*/
@ -8,7 +10,7 @@ var logger = require('morgan');
var cookieParser = require('cookie-parser');
// custom log format
if ('test' != process.env.NODE_ENV) app.use(logger(':method :url'));
if (process.env.NODE_ENV !== 'test') app.use(logger(':method :url'))
// parses request cookies, populating
// req.cookies and req.signedCookies
@ -17,7 +19,7 @@ if ('test' != process.env.NODE_ENV) app.use(logger(':method :url'));
app.use(cookieParser('my secret here'));
// parses x-www-form-urlencoded
app.use(express.urlencoded({ extended: false }))
app.use(express.urlencoded())
app.get('/', function(req, res){
if (req.cookies.remember) {
@ -31,13 +33,17 @@ app.get('/', function(req, res){
app.get('/forget', function(req, res){
res.clearCookie('remember');
res.redirect('back');
res.redirect(req.get('Referrer') || '/');
});
app.post('/', function(req, res){
var minute = 60000;
if (req.body.remember) res.cookie('remember', 1, { maxAge: minute });
res.redirect('back');
if (req.body && req.body.remember) {
res.cookie('remember', 1, { maxAge: minute })
}
res.redirect(req.get('Referrer') || '/');
});
/* istanbul ignore next */

View File

@ -0,0 +1,3 @@
* milk
* eggs
* bread

View File

@ -1,27 +1,32 @@
'use strict'
/**
* Module dependencies.
*/
var express = require('../../');
var path = require('path');
var path = require('node:path');
var app = module.exports = express();
// path to where the files are stored on disk
var FILES_DIR = path.join(__dirname, 'files')
app.get('/', function(req, res){
res.send('<ul>'
+ '<li>Download <a href="/files/amazing.txt">amazing.txt</a>.</li>'
+ '<li>Download <a href="/files/missing.txt">missing.txt</a>.</li>'
+ '<li>Download <a href="/files/CCTV大赛上海分赛区.txt">CCTV大赛上海分赛区.txt</a>.</li>'
+ '</ul>');
res.send('<ul>' +
'<li>Download <a href="/files/notes/groceries.txt">notes/groceries.txt</a>.</li>' +
'<li>Download <a href="/files/amazing.txt">amazing.txt</a>.</li>' +
'<li>Download <a href="/files/missing.txt">missing.txt</a>.</li>' +
'<li>Download <a href="/files/CCTV大赛上海分赛区.txt">CCTV大赛上海分赛区.txt</a>.</li>' +
'</ul>')
});
// /files/* is accessed via req.params[0]
// but here we name it :file
app.get('/files/:file(*)', function(req, res, next){
var filePath = path.join(__dirname, 'files', req.params.file);
res.download(filePath, function (err) {
app.get('/files/*file', function (req, res, next) {
res.download(req.params.file.join('/'), { root: FILES_DIR }, function (err) {
if (!err) return; // file sent
if (err && err.status !== 404) return next(err); // non-404 error
if (err.status !== 404) return next(err); // non-404 error
// file for download not found
res.statusCode = 404;
res.send('Cant find that file, sorry!');

View File

@ -1,9 +1,11 @@
'use strict'
/**
* Module dependencies.
*/
var express = require('../../');
var path = require('path');
var path = require('node:path');
var app = module.exports = express();

View File

@ -1,4 +1,4 @@
body {
padding: 50px 80px;
font: 14px "Helvetica Nueue", "Lucida Grande", Arial, sans-serif;
font: 14px "Helvetica Neue", "Lucida Grande", Arial, sans-serif;
}

View File

@ -2,6 +2,7 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title><%= title %></title>
<link rel="stylesheet" href="/stylesheets/style.css">
</head>

View File

@ -1,4 +1,4 @@
<% include header.html %>
<%- include('header.html') -%>
<h1>Users</h1>
<ul id="users">
@ -7,4 +7,4 @@
<% }) %>
</ul>
<% include footer.html %>
<%- include('footer.html') -%>

View File

@ -1,12 +1,14 @@
'use strict'
/**
* Module dependencies.
*/
var express = require('../../');
var path = require('path');
var path = require('node:path');
var app = module.exports = express();
var logger = require('morgan');
var silent = 'test' == process.env.NODE_ENV;
var silent = process.env.NODE_ENV === 'test'
// general config
app.set('views', path.join(__dirname, 'views'));
@ -19,7 +21,7 @@ app.enable('verbose errors');
// disable them in production
// use $ NODE_ENV=production node examples/error-pages
if ('production' == app.settings.env) app.disable('verbose errors');
if (app.settings.env === 'production') app.disable('verbose errors')
silent || app.use(logger('dev'));

View File

@ -1,3 +1,3 @@
<% include error_header %>
<%- include('error_header') -%>
<h2>Cannot find <%= url %></h2>
<% include footer %>
<%- include('footer') -%>

View File

@ -1,8 +1,8 @@
<% include error_header %>
<%- include('error_header') -%>
<h2>Error: <%= error.message %></h2>
<% if (settings['verbose errors']) { %>
<pre><%= error.stack %></pre>
<% } else { %>
<p>An error occurred!</p>
<% } %>
<% include footer %>
<%- include('footer') -%>

View File

@ -1,6 +1,8 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Error</title>
</head>

View File

@ -1,6 +1,8 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Custom Pages Example</title>
</head>

View File

@ -1,3 +1,5 @@
'use strict'
/**
* Module dependencies.
*/
@ -5,7 +7,7 @@
var express = require('../../');
var logger = require('morgan');
var app = module.exports = express();
var test = app.get('env') == 'test';
var test = app.get('env') === 'test'
if (!test) app.use(logger('dev'));
@ -24,7 +26,7 @@ function error(err, req, res, next) {
res.send('Internal Server Error');
}
app.get('/', function(req, res){
app.get('/', function () {
// Caught and passed down to the errorHandler middleware
throw new Error('something broke!');
});

View File

@ -1,6 +1,8 @@
'use strict'
var express = require('../../');
var app = express();
var app = module.exports = express()
app.get('/', function(req, res){
res.send('Hello World');

View File

@ -1,12 +1,14 @@
'use strict'
/**
* Module dependencies.
*/
var escapeHtml = require('escape-html');
var express = require('../..');
var fs = require('fs');
var fs = require('node:fs');
var marked = require('marked');
var path = require('path');
var path = require('node:path');
var app = module.exports = express();
@ -24,7 +26,7 @@ app.engine('md', function(path, options, fn){
app.set('views', path.join(__dirname, 'views'));
// make it the default so we dont need .md
// make it the default, so we don't need .md
app.set('view engine', 'md');
app.get('/', function(req, res){

View File

@ -1,3 +1,5 @@
'use strict'
var express = require('../../..');
var apiv1 = express.Router();

View File

@ -1,3 +1,5 @@
'use strict'
var express = require('../../..');
var apiv2 = express.Router();

View File

@ -1,3 +1,5 @@
'use strict'
var express = require('../..');
var app = module.exports = express();
@ -6,7 +8,7 @@ app.use('/api/v1', require('./controllers/api_v1'));
app.use('/api/v2', require('./controllers/api_v2'));
app.get('/', function(req, res) {
res.send('Hello form root route.');
res.send('Hello from root route.')
});
/* istanbul ignore next */

View File

@ -1,60 +0,0 @@
/**
* Module dependencies.
*/
var express = require('../..');
var multiparty = require('multiparty');
var format = require('util').format;
var app = module.exports = express();
app.get('/', function(req, res){
res.send('<form method="post" enctype="multipart/form-data">'
+ '<p>Title: <input type="text" name="title" /></p>'
+ '<p>Image: <input type="file" name="image" /></p>'
+ '<p><input type="submit" value="Upload" /></p>'
+ '</form>');
});
app.post('/', function(req, res, next){
// create a form to begin parsing
var form = new multiparty.Form();
var image;
var title;
form.on('error', next);
form.on('close', function(){
res.send(format('\nuploaded %s (%d Kb) as %s'
, image.filename
, image.size / 1024 | 0
, title));
});
// listen on field event for title
form.on('field', function(name, val){
if (name !== 'title') return;
title = val;
});
// listen on part event for image file
form.on('part', function(part){
if (!part.filename) return;
if (part.name !== 'image') return part.resume();
image = {};
image.filename = part.filename;
image.size = 0;
part.on('data', function(buf){
image.size += buf.length;
});
});
// parse the form
form.parse(req);
});
/* istanbul ignore next */
if (!module.parent) {
app.listen(4000);
console.log('Express started on port 4000');
}

View File

@ -1,3 +1,5 @@
'use strict'
exports.index = function(req, res){
res.redirect('/users');
};

View File

@ -1,3 +1,5 @@
'use strict'
/**
* Module dependencies.
*/

View File

@ -1,6 +1,8 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="/style.css">
<title>Edit <%= pet.name %></title>
</head>

View File

@ -1,6 +1,8 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="/style.css">
<title><%= pet.name %></title>
</head>

View File

@ -1,3 +1,5 @@
'use strict'
/**
* Module dependencies.
*/

View File

@ -1,3 +1,5 @@
'use strict'
/**
* Module dependencies.
*/

View File

@ -1,6 +1,8 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="/style.css">
<title>Edit {{user.name}}</title>
</head>

View File

@ -1,6 +1,8 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="/style.css">
<title>Users</title>
</head>

View File

@ -1,6 +1,8 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="/style.css">
<title>{{user.name}}</title>
</head>

View File

@ -1,3 +1,5 @@
'use strict'
// faux database
var pets = exports.pets = [];

View File

@ -1,10 +1,12 @@
'use strict'
/**
* Module dependencies.
*/
var express = require('../..');
var logger = require('morgan');
var path = require('path');
var path = require('node:path');
var session = require('express-session');
var methodOverride = require('method-override');

View File

@ -1,10 +1,12 @@
'use strict'
/**
* Module dependencies.
*/
var express = require('../../..');
var fs = require('fs');
var path = require('path');
var fs = require('node:fs');
var path = require('node:path');
module.exports = function(parent, options){
var dir = path.join(__dirname, '..', 'controllers');

View File

@ -1,6 +1,6 @@
body {
padding: 50px;
font: 16px "Helvetica Neue", Helvetica, Arial;
font: 16px "Helvetica Neue", Helvetica, Arial, sans-serif;
}
a {
color: #107aff;

View File

@ -2,6 +2,7 @@
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Not Found</title>
<link rel="stylesheet" href="/style.css">
</head>

View File

@ -2,6 +2,7 @@
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Internal Server Error</title>
<link rel="stylesheet" href="/style.css">
</head>

View File

@ -1,3 +1,4 @@
'use strict'
// install redis first:
// https://redis.io/

View File

@ -1,28 +1,23 @@
'use strict'
/**
* Module dependencies.
*/
var createError = require('http-errors')
var express = require('../../');
var app = module.exports = express();
// Faux database
var users = [
{ name: 'tj' }
{ name: 'tj' }
, { name: 'tobi' }
, { name: 'loki' }
, { name: 'jane' }
, { name: 'bandit' }
];
// Create HTTP error
function createError(status, message) {
var err = new Error(message);
err.status = status;
return err;
}
// Convert :to and :from to integers
app.param(['to', 'from'], function(req, res, next, num, name){
@ -37,7 +32,8 @@ app.param(['to', 'from'], function(req, res, next, num, name){
// Load user by id
app.param('user', function(req, res, next, id){
if (req.user = users[id]) {
req.user = users[id]
if (req.user) {
next();
} else {
next(createError(404, 'failed to find user'));
@ -56,7 +52,7 @@ app.get('/', function(req, res){
* GET :user.
*/
app.get('/user/:user', function(req, res, next){
app.get('/user/:user', function (req, res) {
res.send('user ' + req.user.name);
});
@ -64,7 +60,7 @@ app.get('/user/:user', function(req, res, next){
* GET users :from - :to.
*/
app.get('/users/:from-:to', function(req, res, next){
app.get('/users/:from-:to', function (req, res) {
var from = req.params.from;
var to = req.params.to;
var names = users.map(function(user){ return user.name; });

View File

@ -1,3 +1,5 @@
'use strict'
/**
* Module dependencies.
*/
@ -10,7 +12,7 @@ var app = module.exports = express();
app.resource = function(path, obj) {
this.get(path, obj.index);
this.get(path + '/:a..:b.:format?', function(req, res){
this.get(path + '/:a..:b{.:format}', function(req, res){
var a = parseInt(req.params.a, 10);
var b = parseInt(req.params.b, 10);
var format = req.params.format;
@ -26,7 +28,7 @@ app.resource = function(path, obj) {
// Fake records
var users = [
{ name: 'tj' }
{ name: 'tj' }
, { name: 'ciaran' }
, { name: 'aaron' }
, { name: 'guillermo' }

View File

@ -1,10 +1,13 @@
'use strict'
/**
* Module dependencies.
*/
var escapeHtml = require('escape-html')
var express = require('../../lib/express');
var verbose = process.env.NODE_ENV != 'test';
var verbose = process.env.NODE_ENV !== 'test'
var app = module.exports = express();
@ -31,7 +34,7 @@ var users = {
},
get: function(req, res){
res.send('user ' + req.params.uid);
res.send('user ' + escapeHtml(req.params.uid))
},
delete: function(req, res){
@ -41,11 +44,11 @@ var users = {
var pets = {
list: function(req, res){
res.send('user ' + req.params.uid + '\'s pets');
res.send('user ' + escapeHtml(req.params.uid) + '\'s pets')
},
delete: function(req, res){
res.send('delete ' + req.params.uid + '\'s pet ' + req.params.pid);
res.send('delete ' + escapeHtml(req.params.uid) + '\'s pet ' + escapeHtml(req.params.pid))
}
};

View File

@ -1,3 +1,5 @@
'use strict'
/**
* Module dependencies.
*/
@ -15,7 +17,7 @@ var app = express();
// Dummy users
var users = [
{ id: 0, name: 'tj', email: 'tj@vision-media.ca', role: 'member' }
{ id: 0, name: 'tj', email: 'tj@vision-media.ca', role: 'member' }
, { id: 1, name: 'ciaran', email: 'ciaranj@gmail.com', role: 'member' }
, { id: 2, name: 'aaron', email: 'aaron.heckmann+github@gmail.com', role: 'admin' }
];
@ -34,7 +36,7 @@ function loadUser(req, res, next) {
function andRestrictToSelf(req, res, next) {
// If our authenticated user is the user we are viewing
// then everything is fine :)
if (req.authenticatedUser.id == req.user.id) {
if (req.authenticatedUser.id === req.user.id) {
next();
} else {
// You may want to implement specific exceptions
@ -47,7 +49,7 @@ function andRestrictToSelf(req, res, next) {
function andRestrictTo(role) {
return function(req, res, next) {
if (req.authenticatedUser.role == role) {
if (req.authenticatedUser.role === role) {
next();
} else {
next(new Error('Unauthorized'));

View File

@ -1,9 +1,11 @@
'use strict'
/**
* Module dependencies.
*/
var express = require('../..');
var path = require('path');
var path = require('node:path');
var app = express();
var logger = require('morgan');
var cookieParser = require('cookie-parser');
@ -36,7 +38,7 @@ app.get('/', site.index);
// User
app.get('/users', user.list);
app.all('/user/:id/:op?', user.load);
app.all('/user/:id{/:op}', user.load);
app.get('/user/:id', user.view);
app.get('/user/:id/view', user.view);
app.get('/user/:id/edit', user.edit);

View File

@ -1,3 +1,5 @@
'use strict'
// Fake posts database
var posts = [

View File

@ -1,3 +1,5 @@
'use strict'
exports.index = function(req, res){
res.render('index', { title: 'Route Separation Example' });
};

View File

@ -1,3 +1,5 @@
'use strict'
// Fake user database
var users = [
@ -41,5 +43,5 @@ exports.update = function(req, res){
var user = req.body.user;
req.user.name = user.name;
req.user.email = user.email;
res.redirect('back');
res.redirect(req.get('Referrer') || '/');
};

View File

@ -2,6 +2,7 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title><%= title %></title>
<link rel="stylesheet" href="/style.css">
</head>

View File

@ -1,4 +1,4 @@
<% include header %>
<%- include('header') -%>
<h1><%= title %></h1>
@ -7,4 +7,4 @@
<li>Visit the <a href="/posts">posts</a> page.</li>
</ul>
<% include footer %>
<%- include('footer') -%>

View File

@ -1,4 +1,4 @@
<% include ../header %>
<%- include('../header') -%>
<h1>Posts</h1>
@ -9,4 +9,4 @@
<% }) %>
</dl>
<% include ../footer %>
<%- include('../footer') -%>

View File

@ -1,9 +1,9 @@
<% include ../header %>
<%- include('../header') -%>
<h1>Editing <%= user.name %></h1>
<div id="user">
<form action="?_method=put", method="post">
<form action="?_method=put" method="post">
<p>
Name:
<input type="text" value="<%= user.name %>" name="user[name]" />
@ -20,4 +20,4 @@
</form>
</div>
<% include ../footer %>
<%- include('../footer') -%>

View File

@ -1,4 +1,4 @@
<% include ../header %>
<%- include('../header') -%>
<h1><%= title %></h1>
@ -11,4 +11,4 @@
<% }) %>
</div>
<% include ../footer %>
<%- include('../footer') -%>

View File

@ -1,4 +1,4 @@
<% include ../header %>
<%- include('../header') -%>
<h1><%= user.name %></h1>
@ -6,4 +6,4 @@
<p>Email: <%= user.email %></p>
</div>
<% include ../footer %>
<%- include('../footer') -%>

View File

@ -1,3 +1,4 @@
'use strict'
// install redis first:
// https://redis.io/
@ -11,7 +12,7 @@
*/
var express = require('../..');
var path = require('path');
var path = require('node:path');
var redis = require('redis');
var db = redis.createClient();
@ -34,10 +35,10 @@ db.sadd('cat', 'luna');
* GET search for :query.
*/
app.get('/search/:query?', function(req, res){
app.get('/search/:query?', function(req, res, next){
var query = req.params.query;
db.smembers(query, function(err, vals){
if (err) return res.send(500);
if (err) return next(err);
res.send(vals);
});
});

View File

@ -1,3 +1,5 @@
'use strict'
var search = document.querySelector('[type=search]');
var code = document.querySelector('pre');
@ -5,7 +7,7 @@ search.addEventListener('keyup', function(){
var xhr = new XMLHttpRequest;
xhr.open('GET', '/search/' + search.value, true);
xhr.onreadystatechange = function(){
if (4 == xhr.readyState) {
if (xhr.readyState === 4) {
code.textContent = xhr.responseText;
}
};

View File

@ -2,8 +2,9 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Search example</title>
<style type="text/css">
<style>
body {
font: 14px "Helvetica Neue", Helvetica;
padding: 50px;
@ -14,7 +15,7 @@
<h2>Search</h2>
<p>Try searching for "ferret" or "cat".</p>
<input type="search" name="search" value="" />
<pre />
<pre></pre>
<script src="/client.js" charset="utf-8"></script>
</body>
</html>

View File

@ -1,3 +1,4 @@
'use strict'
// install redis first:
// https://redis.io/

View File

@ -1,3 +1,5 @@
'use strict'
/**
* Module dependencies.
*/

View File

@ -1,10 +1,12 @@
'use strict'
/**
* Module dependencies.
*/
var express = require('../..');
var logger = require('morgan');
var path = require('path');
var path = require('node:path');
var app = express();
// log requests

View File

@ -1 +1 @@
foo
// foo

View File

@ -1,3 +1,5 @@
'use strict'
/**
* Module dependencies.
*/

View File

@ -1,9 +1,11 @@
'use strict'
/**
* Module dependencies.
*/
var https = require('https');
var path = require('path');
var https = require('node:https');
var path = require('node:path');
var extname = path.extname;
/**

View File

@ -1,3 +1,5 @@
'use strict'
/**
* Module dependencies.
*/

View File

@ -1,9 +1,11 @@
'use strict'
/**
* Module dependencies.
*/
var express = require('../..');
var path = require('path');
var path = require('node:path');
var User = require('./user');
var app = express();
@ -13,7 +15,7 @@ app.set('view engine', 'ejs');
// filter ferrets only
function ferrets(user) {
return user.species == 'ferret';
return user.species === 'ferret'
}
// naive nesting approach,
@ -59,7 +61,7 @@ function users(req, res, next) {
})
}
app.get('/middleware', count, users, function(req, res, next){
app.get('/middleware', count, users, function (req, res) {
res.render('index', {
title: 'Users',
count: req.count,
@ -97,7 +99,7 @@ function users2(req, res, next) {
})
}
app.get('/middleware-locals', count2, users2, function(req, res, next){
app.get('/middleware-locals', count2, users2, function (req, res) {
// you can see now how we have much less
// to pass to res.render(). If we have
// several routes related to users this

View File

@ -1,3 +1,5 @@
'use strict'
module.exports = User;
// faux model

View File

@ -2,6 +2,7 @@
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title><%= title %></title>
<style media="screen">
body {

View File

@ -1,3 +1,5 @@
'use strict'
/**
* Module dependencies.
*/
@ -8,7 +10,7 @@ var app = module.exports = express();
// create an error with .status. we
// can then use the property in our
// custom error handler (Connect repects this prop as well)
// custom error handler (Connect respects this prop as well)
function error(status, msg) {
var err = new Error(msg);
@ -32,7 +34,7 @@ app.use('/api', function(req, res, next){
if (!key) return next(error(400, 'api key required'));
// key is invalid
if (!~apiKeys.indexOf(key)) return next(error(401, 'invalid api key'));
if (apiKeys.indexOf(key) === -1) return next(error(401, 'invalid api key'))
// all good, store req.key for route access
req.key = key;
@ -49,13 +51,13 @@ var apiKeys = ['foo', 'bar', 'baz'];
// these two objects will serve as our faux database
var repos = [
{ name: 'express', url: 'http://github.com/expressjs/express' }
, { name: 'stylus', url: 'http://github.com/learnboost/stylus' }
, { name: 'cluster', url: 'http://github.com/learnboost/cluster' }
{ name: 'express', url: 'https://github.com/expressjs/express' },
{ name: 'stylus', url: 'https://github.com/learnboost/stylus' },
{ name: 'cluster', url: 'https://github.com/learnboost/cluster' }
];
var users = [
{ name: 'tobi' }
{ name: 'tobi' }
, { name: 'loki' }
, { name: 'jane' }
];
@ -69,14 +71,17 @@ var userRepos = {
// we now can assume the api key is valid,
// and simply expose the data
app.get('/api/users', function(req, res, next){
// example: http://localhost:3000/api/users/?api-key=foo
app.get('/api/users', function (req, res) {
res.send(users);
});
app.get('/api/repos', function(req, res, next){
// example: http://localhost:3000/api/repos/?api-key=foo
app.get('/api/repos', function (req, res) {
res.send(repos);
});
// example: http://localhost:3000/api/user/tobi/repos/?api-key=foo
app.get('/api/user/:name/repos', function(req, res, next){
var name = req.params.name;
var user = userRepos[name];
@ -102,7 +107,7 @@ app.use(function(err, req, res, next){
// invoke next() and do not respond.
app.use(function(req, res){
res.status(404);
res.send({ error: "Lame, can't find that" });
res.send({ error: "Sorry, can't find that" })
});
/* istanbul ignore next */

View File

@ -14,22 +14,24 @@
*/
var finalhandler = require('finalhandler');
var Router = require('./router');
var methods = require('methods');
var middleware = require('./middleware/init');
var query = require('./middleware/query');
var debug = require('debug')('express:application');
var View = require('./view');
var http = require('http');
var http = require('node:http');
var methods = require('./utils').methods;
var compileETag = require('./utils').compileETag;
var compileQueryParser = require('./utils').compileQueryParser;
var compileTrust = require('./utils').compileTrust;
var deprecate = require('depd')('express');
var flatten = require('array-flatten');
var merge = require('utils-merge');
var resolve = require('path').resolve;
var setPrototypeOf = require('setprototypeof')
var resolve = require('node:path').resolve;
var once = require('once')
var Router = require('router');
/**
* Module variables.
* @private
*/
var slice = Array.prototype.slice;
var flatten = Array.prototype.flat;
/**
* Application prototype.
@ -55,11 +57,29 @@ var trustProxyDefaultSymbol = '@@symbol:trust_proxy_default';
*/
app.init = function init() {
this.cache = {};
this.engines = {};
this.settings = {};
var router = null;
this.cache = Object.create(null);
this.engines = Object.create(null);
this.settings = Object.create(null);
this.defaultConfiguration();
// Setup getting to lazily add base router
Object.defineProperty(this, 'router', {
configurable: true,
enumerable: true,
get: function getrouter() {
if (router === null) {
router = new Router({
caseSensitive: this.enabled('case sensitive routing'),
strict: this.enabled('strict routing')
});
}
return router;
}
});
};
/**
@ -74,7 +94,7 @@ app.defaultConfiguration = function defaultConfiguration() {
this.enable('x-powered-by');
this.set('etag', 'weak');
this.set('env', env);
this.set('query parser', 'extended');
this.set('query parser', 'simple')
this.set('subdomain offset', 2);
this.set('trust proxy', false);
@ -95,10 +115,10 @@ app.defaultConfiguration = function defaultConfiguration() {
}
// inherit protos
setPrototypeOf(this.request, parent.request)
setPrototypeOf(this.response, parent.response)
setPrototypeOf(this.engines, parent.engines)
setPrototypeOf(this.settings, parent.settings)
Object.setPrototypeOf(this.request, parent.request)
Object.setPrototypeOf(this.response, parent.response)
Object.setPrototypeOf(this.engines, parent.engines)
Object.setPrototypeOf(this.settings, parent.settings)
});
// setup locals
@ -118,32 +138,6 @@ app.defaultConfiguration = function defaultConfiguration() {
if (env === 'production') {
this.enable('view cache');
}
Object.defineProperty(this, 'router', {
get: function() {
throw new Error('\'app.router\' is deprecated!\nPlease see the 3.x to 4.x migration guide for details on how to update your app.');
}
});
};
/**
* lazily adds the base router if it has not yet been added.
*
* We cannot add the base router in the defaultConfiguration because
* it reads app settings which might be set after that has run.
*
* @private
*/
app.lazyrouter = function lazyrouter() {
if (!this._router) {
this._router = new Router({
caseSensitive: this.enabled('case sensitive routing'),
strict: this.enabled('strict routing')
});
this._router.use(query(this.get('query parser fn')));
this._router.use(middleware.init(this));
}
};
/**
@ -156,22 +150,31 @@ app.lazyrouter = function lazyrouter() {
*/
app.handle = function handle(req, res, callback) {
var router = this._router;
// final handler
var done = callback || finalhandler(req, res, {
env: this.get('env'),
onerror: logerror.bind(this)
});
// no routes
if (!router) {
debug('no routes defined on app');
done();
return;
// set powered by header
if (this.enabled('x-powered-by')) {
res.setHeader('X-Powered-By', 'Express');
}
router.handle(req, res, done);
// set circular references
req.res = res;
res.req = req;
// alter the prototypes
Object.setPrototypeOf(req, this.request)
Object.setPrototypeOf(res, this.response)
// setup locals
if (!res.locals) {
res.locals = Object.create(null);
}
this.router.handle(req, res, done);
};
/**
@ -204,15 +207,14 @@ app.use = function use(fn) {
}
}
var fns = flatten(slice.call(arguments, offset));
var fns = flatten.call(slice.call(arguments, offset), Infinity);
if (fns.length === 0) {
throw new TypeError('app.use() requires a middleware function')
}
// setup router
this.lazyrouter();
var router = this._router;
// get router
var router = this.router;
fns.forEach(function (fn) {
// non-express app
@ -228,8 +230,8 @@ app.use = function use(fn) {
router.use(path, function mounted_app(req, res, next) {
var orig = req.app;
fn.handle(req, res, function (err) {
setPrototypeOf(req, orig.request)
setPrototypeOf(res, orig.response)
Object.setPrototypeOf(req, orig.request)
Object.setPrototypeOf(res, orig.response)
next(err);
});
});
@ -252,8 +254,7 @@ app.use = function use(fn) {
*/
app.route = function route(path) {
this.lazyrouter();
return this._router.route(path);
return this.router.route(path);
};
/**
@ -276,7 +277,7 @@ app.route = function route(path) {
* In this case EJS provides a `.renderFile()` method with
* the same signature that Express expects: `(path, options, callback)`,
* though note that it aliases this method as `ejs.__express` internally
* so if you're using ".ejs" extensions you dont need to do anything.
* so if you're using ".ejs" extensions you don't need to do anything.
*
* Some template engines do not follow this convention, the
* [Consolidate.js](https://github.com/tj/consolidate.js)
@ -319,8 +320,6 @@ app.engine = function engine(ext, fn) {
*/
app.param = function param(name, fn) {
this.lazyrouter();
if (Array.isArray(name)) {
for (var i = 0; i < name.length; i++) {
this.param(name[i], fn);
@ -329,7 +328,7 @@ app.param = function param(name, fn) {
return this;
}
this._router.param(name, fn);
this.router.param(name, fn);
return this;
};
@ -469,16 +468,14 @@ app.disable = function disable(setting) {
* Delegate `.VERB(...)` calls to `router.VERB(...)`.
*/
methods.forEach(function(method){
app[method] = function(path){
methods.forEach(function (method) {
app[method] = function (path) {
if (method === 'get' && arguments.length === 1) {
// app.get(setting)
return this.set(path);
}
this.lazyrouter();
var route = this._router.route(path);
var route = this.route(path);
route[method].apply(route, slice.call(arguments, 1));
return this;
};
@ -495,9 +492,7 @@ methods.forEach(function(method){
*/
app.all = function all(path) {
this.lazyrouter();
var route = this._router.route(path);
var route = this.route(path);
var args = slice.call(arguments, 1);
for (var i = 0; i < methods.length; i++) {
@ -507,10 +502,6 @@ app.all = function all(path) {
return this;
};
// del -> delete alias
app.del = deprecate.function(app.delete, 'app.del: Use app.delete instead');
/**
* Render the given view `name` name with `options`
* and a callback accepting an error and the
@ -533,7 +524,6 @@ app.render = function render(name, options, callback) {
var done = callback;
var engines = this.engines;
var opts = options;
var renderOptions = {};
var view;
// support callback function as second arg
@ -542,16 +532,8 @@ app.render = function render(name, options, callback) {
opts = {};
}
// merge app.locals
merge(renderOptions, this.locals);
// merge options._locals
if (opts._locals) {
merge(renderOptions, opts._locals);
}
// merge options
merge(renderOptions, opts);
var renderOptions = { ...this.locals, ...opts._locals, ...opts };
// set .cache unless explicitly provided
if (renderOptions.cache == null) {
@ -601,8 +583,8 @@ app.render = function render(name, options, callback) {
* and HTTPS server you may do so with the "http"
* and "https" modules as shown here:
*
* var http = require('http')
* , https = require('https')
* var http = require('node:http')
* , https = require('node:https')
* , express = require('express')
* , app = express();
*
@ -614,9 +596,14 @@ app.render = function render(name, options, callback) {
*/
app.listen = function listen() {
var server = http.createServer(this);
return server.listen.apply(server, arguments);
};
var server = http.createServer(this)
var args = Array.prototype.slice.call(arguments)
if (typeof args[args.length - 1] === 'function') {
var done = args[args.length - 1] = once(args[args.length - 1])
server.once('error', done)
}
return server.listen.apply(server, args)
}
/**
* Log error using console.error.

View File

@ -13,11 +13,10 @@
*/
var bodyParser = require('body-parser')
var EventEmitter = require('events').EventEmitter;
var EventEmitter = require('node:events').EventEmitter;
var mixin = require('merge-descriptors');
var proto = require('./application');
var Route = require('./router/route');
var Router = require('./router');
var Router = require('router');
var req = require('./request');
var res = require('./response');
@ -68,7 +67,7 @@ exports.response = res;
* Expose constructors.
*/
exports.Route = Route;
exports.Route = Router.Route;
exports.Router = Router;
/**
@ -76,37 +75,7 @@ exports.Router = Router;
*/
exports.json = bodyParser.json
exports.query = require('./middleware/query');
exports.raw = bodyParser.raw
exports.static = require('serve-static');
exports.text = bodyParser.text
exports.urlencoded = bodyParser.urlencoded
/**
* Replace removed middleware with an appropriate error message.
*/
;[
'bodyParser',
'compress',
'cookieSession',
'session',
'logger',
'cookieParser',
'favicon',
'responseTime',
'errorHandler',
'timeout',
'methodOverride',
'vhost',
'csrf',
'directory',
'limit',
'multipart',
'staticCache',
].forEach(function (name) {
Object.defineProperty(exports, name, {
get: function () {
throw new Error('Most middleware (like ' + name + ') is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.');
},
configurable: true
});
});

View File

@ -1,43 +0,0 @@
/*!
* express
* Copyright(c) 2009-2013 TJ Holowaychuk
* Copyright(c) 2013 Roman Shtylman
* Copyright(c) 2014-2015 Douglas Christopher Wilson
* MIT Licensed
*/
'use strict';
/**
* Module dependencies.
* @private
*/
var setPrototypeOf = require('setprototypeof')
/**
* Initialization middleware, exposing the
* request and response to each other, as well
* as defaulting the X-Powered-By header field.
*
* @param {Function} app
* @return {Function}
* @api private
*/
exports.init = function(app){
return function expressInit(req, res, next){
if (app.enabled('x-powered-by')) res.setHeader('X-Powered-By', 'Express');
req.res = res;
res.req = req;
req.next = next;
setPrototypeOf(req, app.request)
setPrototypeOf(res, app.response)
res.locals = res.locals || Object.create(null);
next();
};
};

View File

@ -1,47 +0,0 @@
/*!
* express
* Copyright(c) 2009-2013 TJ Holowaychuk
* Copyright(c) 2013 Roman Shtylman
* Copyright(c) 2014-2015 Douglas Christopher Wilson
* MIT Licensed
*/
'use strict';
/**
* Module dependencies.
*/
var merge = require('utils-merge')
var parseUrl = require('parseurl');
var qs = require('qs');
/**
* @param {Object} options
* @return {Function}
* @api public
*/
module.exports = function query(options) {
var opts = merge({}, options)
var queryparse = qs.parse;
if (typeof options === 'function') {
queryparse = options;
opts = undefined;
}
if (opts !== undefined && opts.allowPrototypes === undefined) {
// back-compat for qs module
opts.allowPrototypes = true;
}
return function query(req, res, next){
if (!req.query) {
var val = parseUrl(req).query;
req.query = queryparse(val, opts);
}
next();
};
};

View File

@ -14,10 +14,9 @@
*/
var accepts = require('accepts');
var deprecate = require('depd')('express');
var isIP = require('net').isIP;
var isIP = require('node:net').isIP;
var typeis = require('type-is');
var http = require('http');
var http = require('node:http');
var fresh = require('fresh');
var parseRange = require('range-parser');
var parse = require('parseurl');
@ -147,9 +146,6 @@ req.acceptsEncodings = function(){
return accept.encodings.apply(accept, arguments);
};
req.acceptsEncoding = deprecate.function(req.acceptsEncodings,
'req.acceptsEncoding: Use acceptsEncodings instead');
/**
* Check if the given `charset`s are acceptable,
* otherwise you should respond with 406 "Not Acceptable".
@ -164,9 +160,6 @@ req.acceptsCharsets = function(){
return accept.charsets.apply(accept, arguments);
};
req.acceptsCharset = deprecate.function(req.acceptsCharsets,
'req.acceptsCharset: Use acceptsCharsets instead');
/**
* Check if the given `lang`s are acceptable,
* otherwise you should respond with 406 "Not Acceptable".
@ -176,14 +169,10 @@ req.acceptsCharset = deprecate.function(req.acceptsCharsets,
* @public
*/
req.acceptsLanguages = function(){
var accept = accepts(this);
return accept.languages.apply(accept, arguments);
req.acceptsLanguages = function(...languages) {
return accepts(this).languages(...languages);
};
req.acceptsLanguage = deprecate.function(req.acceptsLanguages,
'req.acceptsLanguage: Use acceptsLanguages instead');
/**
* Parse Range header field, capping to the given `size`.
*
@ -216,42 +205,31 @@ req.range = function range(size, options) {
};
/**
* Return the value of param `name` when present or `defaultValue`.
* Parse the query string of `req.url`.
*
* - Checks route placeholders, ex: _/user/:id_
* - Checks body params, ex: id=12, {"id":12}
* - Checks query string params, ex: ?id=12
* This uses the "query parser" setting to parse the raw
* string into an object.
*
* To utilize request bodies, `req.body`
* should be an object. This can be done by using
* the `bodyParser()` middleware.
*
* @param {String} name
* @param {Mixed} [defaultValue]
* @return {String}
* @public
* @api public
*/
req.param = function param(name, defaultValue) {
var params = this.params || {};
var body = this.body || {};
var query = this.query || {};
defineGetter(req, 'query', function query(){
var queryparse = this.app.get('query parser fn');
var args = arguments.length === 1
? 'name'
: 'name, default';
deprecate('req.param(' + args + '): Use req.params, req.body, or req.query instead');
if (!queryparse) {
// parsing is disabled
return Object.create(null);
}
if (null != params[name] && params.hasOwnProperty(name)) return params[name];
if (null != body[name]) return body[name];
if (null != query[name]) return query[name];
var querystring = parse(this).query;
return defaultValue;
};
return queryparse(querystring);
});
/**
* Check if the incoming request contains the "Content-Type"
* header field, and it contains the give mime `type`.
* header field, and it contains the given mime `type`.
*
* Examples:
*
@ -304,19 +282,23 @@ req.is = function is(types) {
*/
defineGetter(req, 'protocol', function protocol(){
var proto = this.connection.encrypted
var proto = this.socket.encrypted
? 'https'
: 'http';
var trust = this.app.get('trust proxy fn');
if (!trust(this.connection.remoteAddress, 0)) {
if (!trust(this.socket.remoteAddress, 0)) {
return proto;
}
// Note: X-Forwarded-Proto is normally only ever a
// single value, but this is to be safe.
proto = this.get('X-Forwarded-Proto') || proto;
return proto.split(/\s*,\s*/)[0];
var header = this.get('X-Forwarded-Proto') || proto
var index = header.indexOf(',')
return index !== -1
? header.substring(0, index).trim()
: header.trim()
});
/**
@ -410,7 +392,7 @@ defineGetter(req, 'path', function path() {
});
/**
* Parse the "Host" header field to a hostname.
* Parse the "Host" header field to a host.
*
* When the "trust proxy" setting trusts the socket
* address, the "X-Forwarded-Host" header field will
@ -420,14 +402,35 @@ defineGetter(req, 'path', function path() {
* @public
*/
defineGetter(req, 'hostname', function hostname(){
defineGetter(req, 'host', function host(){
var trust = this.app.get('trust proxy fn');
var host = this.get('X-Forwarded-Host');
var val = this.get('X-Forwarded-Host');
if (!host || !trust(this.connection.remoteAddress, 0)) {
host = this.get('Host');
if (!val || !trust(this.socket.remoteAddress, 0)) {
val = this.get('Host');
} else if (val.indexOf(',') !== -1) {
// Note: X-Forwarded-Host is normally only ever a
// single value, but this is to be safe.
val = val.substring(0, val.indexOf(',')).trimRight()
}
return val || undefined;
});
/**
* Parse the "Host" header field to a hostname.
*
* When the "trust proxy" setting trusts the socket
* address, the "X-Forwarded-Host" header field will
* be trusted.
*
* @return {String}
* @api public
*/
defineGetter(req, 'hostname', function hostname(){
var host = this.host;
if (!host) return;
// IPv6 literal support
@ -441,15 +444,9 @@ defineGetter(req, 'hostname', function hostname(){
: host;
});
// TODO: change req.host to return host in next major
defineGetter(req, 'host', deprecate.function(function host(){
return this.hostname;
}, 'req.host: Use req.hostname instead'));
/**
* Check if the request is fresh, aka
* Last-Modified and/or the ETag
* Last-Modified or the ETag
* still match.
*
* @return {Boolean}

View File

@ -12,17 +12,17 @@
* @private
*/
var Buffer = require('safe-buffer').Buffer
var contentDisposition = require('content-disposition');
var createError = require('http-errors')
var deprecate = require('depd')('express');
var encodeUrl = require('encodeurl');
var escapeHtml = require('escape-html');
var http = require('http');
var isAbsolute = require('./utils').isAbsolute;
var http = require('node:http');
var onFinished = require('on-finished');
var path = require('path');
var mime = require('mime-types')
var path = require('node:path');
var pathIsAbsolute = require('node:path').isAbsolute;
var statuses = require('statuses')
var merge = require('utils-merge');
var sign = require('cookie-signature').sign;
var normalizeType = require('./utils').normalizeType;
var normalizeTypes = require('./utils').normalizeTypes;
@ -30,9 +30,9 @@ var setCharset = require('./utils').setCharset;
var cookie = require('cookie');
var send = require('send');
var extname = path.extname;
var mime = send.mime;
var resolve = path.resolve;
var vary = require('vary');
const { Buffer } = require('node:buffer');
/**
* Response prototype.
@ -49,21 +49,28 @@ var res = Object.create(http.ServerResponse.prototype)
module.exports = res
/**
* Module variables.
* @private
*/
var charsetRegExp = /;\s*charset\s*=/;
/**
* Set status `code`.
* Set the HTTP status code for the response.
*
* @param {Number} code
* @return {ServerResponse}
* Expects an integer value between 100 and 999 inclusive.
* Throws an error if the provided status code is not an integer or if it's outside the allowable range.
*
* @param {number} code - The HTTP status code to set.
* @return {ServerResponse} - Returns itself for chaining methods.
* @throws {TypeError} If `code` is not an integer.
* @throws {RangeError} If `code` is outside the range 100 to 999.
* @public
*/
res.status = function status(code) {
// Check if the status code is not an integer
if (!Number.isInteger(code)) {
throw new TypeError(`Invalid status code: ${JSON.stringify(code)}. Status code must be an integer.`);
}
// Check if the status code is outside of Node's valid range
if (code < 100 || code > 999) {
throw new RangeError(`Invalid status code: ${JSON.stringify(code)}. Status code must be greater than 99 and less than 1000.`);
}
this.statusCode = code;
return this;
};
@ -75,7 +82,11 @@ res.status = function status(code) {
*
* res.links({
* next: 'http://api.example.com/users?page=2',
* last: 'http://api.example.com/users?page=5'
* last: 'http://api.example.com/users?page=5',
* pages: [
* 'http://api.example.com/users?page=1',
* 'http://api.example.com/users?page=2'
* ]
* });
*
* @param {Object} links
@ -83,11 +94,18 @@ res.status = function status(code) {
* @public
*/
res.links = function(links){
res.links = function(links) {
var link = this.get('Link') || '';
if (link) link += ', ';
return this.set('Link', link + Object.keys(links).map(function(rel){
return '<' + links[rel] + '>; rel="' + rel + '"';
return this.set('Link', link + Object.keys(links).map(function(rel) {
// Allow multiple links if links[rel] is an array
if (Array.isArray(links[rel])) {
return links[rel].map(function (singleLink) {
return `<${singleLink}>; rel="${rel}"`;
}).join(', ');
} else {
return `<${links[rel]}>; rel="${rel}"`;
}
}).join(', '));
};
@ -113,31 +131,6 @@ res.send = function send(body) {
// settings
var app = this.app;
// allow status / body
if (arguments.length === 2) {
// res.send(body, status) backwards compat
if (typeof arguments[0] !== 'number' && typeof arguments[1] === 'number') {
deprecate('res.send(body, status): Use res.status(status).send(body) instead');
this.statusCode = arguments[1];
} else {
deprecate('res.send(status, body): Use res.status(status).send(body) instead');
this.statusCode = arguments[0];
chunk = arguments[1];
}
}
// disambiguate res.send(status) and res.send(status, num)
if (typeof chunk === 'number' && arguments.length === 1) {
// res.send(status) will set status message as text string
if (!this.get('Content-Type')) {
this.type('txt');
}
deprecate('res.send(status): Use res.sendStatus(status) instead');
this.statusCode = chunk;
chunk = statuses[chunk]
}
switch (typeof chunk) {
// string defaulting to html
case 'string':
@ -150,7 +143,7 @@ res.send = function send(body) {
case 'object':
if (chunk === null) {
chunk = '';
} else if (Buffer.isBuffer(chunk)) {
} else if (ArrayBuffer.isView(chunk)) {
if (!this.get('Content-Type')) {
this.type('bin');
}
@ -178,17 +171,17 @@ res.send = function send(body) {
// populate Content-Length
var len
if (chunk !== undefined) {
if (!generateETag && chunk.length < 1000) {
if (Buffer.isBuffer(chunk)) {
// get length of Buffer
len = chunk.length
} else if (!generateETag && chunk.length < 1000) {
// just calculate length when no ETag + small chunk
len = Buffer.byteLength(chunk, encoding)
} else if (!Buffer.isBuffer(chunk)) {
} else {
// convert chunk to Buffer and calculate
chunk = Buffer.from(chunk, encoding)
encoding = undefined;
len = chunk.length
} else {
// get length of Buffer
len = chunk.length
}
this.set('Content-Length', len);
@ -203,7 +196,7 @@ res.send = function send(body) {
}
// freshness
if (req.fresh) this.statusCode = 304;
if (req.fresh) this.status(304);
// strip irrelevant headers
if (204 === this.statusCode || 304 === this.statusCode) {
@ -213,6 +206,13 @@ res.send = function send(body) {
chunk = '';
}
// alter headers for 205
if (this.statusCode === 205) {
this.set('Content-Length', '0')
this.removeHeader('Transfer-Encoding')
chunk = ''
}
if (req.method === 'HEAD') {
// skip body for HEAD
this.end();
@ -237,27 +237,12 @@ res.send = function send(body) {
*/
res.json = function json(obj) {
var val = obj;
// allow status / body
if (arguments.length === 2) {
// res.json(body, status) backwards compat
if (typeof arguments[1] === 'number') {
deprecate('res.json(obj, status): Use res.status(status).json(obj) instead');
this.statusCode = arguments[1];
} else {
deprecate('res.json(status, obj): Use res.status(status).json(obj) instead');
this.statusCode = arguments[0];
val = arguments[1];
}
}
// settings
var app = this.app;
var escape = app.get('json escape')
var replacer = app.get('json replacer');
var spaces = app.get('json spaces');
var body = stringify(val, replacer, spaces, escape)
var body = stringify(obj, replacer, spaces, escape)
// content-type
if (!this.get('Content-Type')) {
@ -280,27 +265,12 @@ res.json = function json(obj) {
*/
res.jsonp = function jsonp(obj) {
var val = obj;
// allow status / body
if (arguments.length === 2) {
// res.json(body, status) backwards compat
if (typeof arguments[1] === 'number') {
deprecate('res.jsonp(obj, status): Use res.status(status).json(obj) instead');
this.statusCode = arguments[1];
} else {
deprecate('res.jsonp(status, obj): Use res.status(status).jsonp(obj) instead');
this.statusCode = arguments[0];
val = arguments[1];
}
}
// settings
var app = this.app;
var escape = app.get('json escape')
var replacer = app.get('json replacer');
var spaces = app.get('json spaces');
var body = stringify(val, replacer, spaces, escape)
var body = stringify(obj, replacer, spaces, escape)
var callback = this.req.query[app.get('jsonp callback name')];
// content-type
@ -322,10 +292,15 @@ res.jsonp = function jsonp(obj) {
// restrict callback charset
callback = callback.replace(/[^\[\]\w$.]/g, '');
// replace chars not allowed in JavaScript that are in JSON
body = body
.replace(/\u2028/g, '\\u2028')
.replace(/\u2029/g, '\\u2029');
if (body === undefined) {
// empty argument
body = ''
} else if (typeof body === 'string') {
// replace chars not allowed in JavaScript that are in JSON
body = body
.replace(/\u2028/g, '\\u2028')
.replace(/\u2029/g, '\\u2029')
}
// the /**/ is a specific security mitigation for "Rosetta Flash JSONP abuse"
// the typeof check is just to reduce client error noise
@ -351,9 +326,9 @@ res.jsonp = function jsonp(obj) {
*/
res.sendStatus = function sendStatus(statusCode) {
var body = statuses[statusCode] || String(statusCode)
var body = statuses.message[statusCode] || String(statusCode)
this.statusCode = statusCode;
this.status(statusCode);
this.type('txt');
return this.send(body);
@ -364,7 +339,7 @@ res.sendStatus = function sendStatus(statusCode) {
*
* Automatically sets the _Content-Type_ response header field.
* The callback `callback(err)` is invoked when the transfer is complete
* or when an error occurs. Be sure to check `res.sentHeader`
* or when an error occurs. Be sure to check `res.headersSent`
* if you wish to attempt responding, as the header and some data
* may have already been transferred.
*
@ -411,18 +386,25 @@ res.sendFile = function sendFile(path, options, callback) {
throw new TypeError('path argument is required to res.sendFile');
}
if (typeof path !== 'string') {
throw new TypeError('path must be a string to res.sendFile')
}
// support function as second arg
if (typeof options === 'function') {
done = options;
opts = {};
}
if (!opts.root && !isAbsolute(path)) {
if (!opts.root && !pathIsAbsolute(path)) {
throw new TypeError('path must be absolute or specify root to res.sendFile');
}
// create file stream
var pathname = encodeURI(path);
// wire application etag option to send
opts.etag = this.app.enabled('etag');
var file = send(req, pathname, opts);
// transfer
@ -437,85 +419,13 @@ res.sendFile = function sendFile(path, options, callback) {
});
};
/**
* Transfer the file at the given `path`.
*
* Automatically sets the _Content-Type_ response header field.
* The callback `callback(err)` is invoked when the transfer is complete
* or when an error occurs. Be sure to check `res.sentHeader`
* if you wish to attempt responding, as the header and some data
* may have already been transferred.
*
* Options:
*
* - `maxAge` defaulting to 0 (can be string converted by `ms`)
* - `root` root directory for relative filenames
* - `headers` object of headers to serve with file
* - `dotfiles` serve dotfiles, defaulting to false; can be `"allow"` to send them
*
* Other options are passed along to `send`.
*
* Examples:
*
* The following example illustrates how `res.sendfile()` may
* be used as an alternative for the `static()` middleware for
* dynamic situations. The code backing `res.sendfile()` is actually
* the same code, so HTTP cache support etc is identical.
*
* app.get('/user/:uid/photos/:file', function(req, res){
* var uid = req.params.uid
* , file = req.params.file;
*
* req.user.mayViewFilesFrom(uid, function(yes){
* if (yes) {
* res.sendfile('/uploads/' + uid + '/' + file);
* } else {
* res.send(403, 'Sorry! you cant see that.');
* }
* });
* });
*
* @public
*/
res.sendfile = function (path, options, callback) {
var done = callback;
var req = this.req;
var res = this;
var next = req.next;
var opts = options || {};
// support function as second arg
if (typeof options === 'function') {
done = options;
opts = {};
}
// create file stream
var file = send(req, path, opts);
// transfer
sendfile(res, file, opts, function (err) {
if (done) return done(err);
if (err && err.code === 'EISDIR') return next();
// next() all but write errors
if (err && err.code !== 'ECONNABORT' && err.syscall !== 'write') {
next(err);
}
});
};
res.sendfile = deprecate.function(res.sendfile,
'res.sendfile: Use res.sendFile instead');
/**
* Transfer the file at the given `path` as an attachment.
*
* Optionally providing an alternate attachment `filename`,
* and optional callback `callback(err)`. The callback is invoked
* when the data transfer is complete, or when an error has
* ocurred. Be sure to check `res.headersSent` if you plan to respond.
* occurred. Be sure to check `res.headersSent` if you plan to respond.
*
* Optionally providing an `options` object to use with `res.sendFile()`.
* This function will set the `Content-Disposition` header, overriding
@ -542,6 +452,13 @@ res.download = function download (path, filename, options, callback) {
opts = null
}
// support optional filename, where options may be in it's place
if (typeof filename === 'object' &&
(typeof options === 'function' || options === undefined)) {
name = null
opts = filename
}
// set Content-Disposition when file is sent
var headers = {
'Content-Disposition': contentDisposition(name || path)
@ -563,15 +480,19 @@ res.download = function download (path, filename, options, callback) {
opts.headers = headers
// Resolve the full path for sendFile
var fullPath = resolve(path);
var fullPath = !opts.root
? resolve(path)
: path
// send file
return this.sendFile(fullPath, opts, done)
};
/**
* Set _Content-Type_ response header with `type` through `mime.lookup()`
* Set _Content-Type_ response header with `type` through `mime.contentType()`
* when it does not contain "/", or set the Content-Type to `type` otherwise.
* When no mapping is found though `mime.contentType()`, the type is set to
* "application/octet-stream".
*
* Examples:
*
@ -589,7 +510,7 @@ res.download = function download (path, filename, options, callback) {
res.contentType =
res.type = function contentType(type) {
var ct = type.indexOf('/') === -1
? mime.lookup(type)
? (mime.contentType(type) || 'application/octet-stream')
: type;
return this.set('Content-Type', ct);
@ -619,7 +540,7 @@ res.type = function contentType(type) {
* res.send('<p>hey</p>');
* },
*
* 'appliation/json': function(){
* 'application/json': function () {
* res.send({ message: 'hey' });
* }
* });
@ -656,9 +577,8 @@ res.format = function(obj){
var req = this.req;
var next = req.next;
var fn = obj.default;
if (fn) delete obj.default;
var keys = Object.keys(obj);
var keys = Object.keys(obj)
.filter(function (v) { return v !== 'default' })
var key = keys.length > 0
? req.accepts(keys)
@ -669,13 +589,12 @@ res.format = function(obj){
if (key) {
this.set('Content-Type', normalizeType(key).value);
obj[key](req, this, next);
} else if (fn) {
fn();
} else if (obj.default) {
obj.default(req, this, next)
} else {
var err = new Error('Not Acceptable');
err.status = err.statusCode = 406;
err.types = normalizeTypes(keys).map(function(o){ return o.value });
next(err);
next(createError(406, {
types: normalizeTypes(keys).map(function (o) { return o.value })
}))
}
return this;
@ -722,7 +641,7 @@ res.append = function append(field, val) {
// concat the new and prev vals
value = Array.isArray(prev) ? prev.concat(val)
: Array.isArray(val) ? [prev].concat(val)
: [prev, val];
: [prev, val]
}
return this.set(field, value);
@ -740,6 +659,9 @@ res.append = function append(field, val) {
*
* Aliased as `res.header()`.
*
* When the set header is "Content-Type", the type is expanded to include
* the charset if not present using `mime.contentType()`.
*
* @param {String|Object} field
* @param {String|Array} val
* @return {ServerResponse} for chaining
@ -758,10 +680,7 @@ res.header = function header(field, val) {
if (Array.isArray(value)) {
throw new TypeError('Content-Type cannot be set to an Array');
}
if (!charsetRegExp.test(value)) {
var charset = mime.charsets.lookup(value.split(';')[0]);
if (charset) value += '; charset=' + charset.toLowerCase();
}
value = mime.contentType(value)
}
this.setHeader(field, value);
@ -795,7 +714,10 @@ res.get = function(field){
*/
res.clearCookie = function clearCookie(name, options) {
var opts = merge({ expires: new Date(1), path: '/' }, options);
// Force cookie expiration by setting expires to the past
const opts = { path: '/', ...options, expires: new Date(1)};
// ensure maxAge is not passed
delete opts.maxAge
return this.cookie(name, '', opts);
};
@ -814,7 +736,7 @@ res.clearCookie = function clearCookie(name, options) {
* // "Remember Me" for 15 minutes
* res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true });
*
* // save as above
* // same as above
* res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true })
*
* @param {String} name
@ -825,7 +747,7 @@ res.clearCookie = function clearCookie(name, options) {
*/
res.cookie = function (name, value, options) {
var opts = merge({}, options);
var opts = { ...options };
var secret = this.req.secret;
var signed = opts.signed;
@ -841,9 +763,13 @@ res.cookie = function (name, value, options) {
val = 's:' + sign(val, secret);
}
if ('maxAge' in opts) {
opts.expires = new Date(Date.now() + opts.maxAge);
opts.maxAge /= 1000;
if (opts.maxAge != null) {
var maxAge = opts.maxAge - 0
if (!isNaN(maxAge)) {
opts.expires = new Date(Date.now() + maxAge)
opts.maxAge = Math.floor(maxAge / 1000)
}
}
if (opts.path == null) {
@ -873,25 +799,13 @@ res.cookie = function (name, value, options) {
*/
res.location = function location(url) {
var loc = url;
// "back" is an alias for the referrer
if (url === 'back') {
loc = this.req.get('Referrer') || '/';
}
// set location
return this.set('Location', encodeUrl(loc));
return this.set('Location', encodeUrl(url));
};
/**
* Redirect to the given `url` with optional response `status`
* defaulting to 302.
*
* The resulting `url` is determined by `res.location()`, so
* it will play nicely with mounted apps, relative paths,
* `"back"` etc.
*
* Examples:
*
* res.redirect('/foo/bar');
@ -909,13 +823,20 @@ res.redirect = function redirect(url) {
// allow status / url
if (arguments.length === 2) {
if (typeof arguments[0] === 'number') {
status = arguments[0];
address = arguments[1];
} else {
deprecate('res.redirect(url, status): Use res.redirect(status, url) instead');
status = arguments[1];
}
status = arguments[0]
address = arguments[1]
}
if (!address) {
deprecate('Provide a url argument');
}
if (typeof address !== 'string') {
deprecate('Url must be a string');
}
if (typeof status !== 'number') {
deprecate('Status must be a number');
}
// Set location header
@ -924,12 +845,12 @@ res.redirect = function redirect(url) {
// Support text/{plain,html} by default
this.format({
text: function(){
body = statuses[status] + '. Redirecting to ' + address
body = statuses.message[status] + '. Redirecting to ' + address
},
html: function(){
var u = escapeHtml(address);
body = '<p>' + statuses[status] + '. Redirecting to <a href="' + u + '">' + u + '</a></p>'
body = '<p>' + statuses.message[status] + '. Redirecting to ' + u + '</p>'
},
default: function(){
@ -938,7 +859,7 @@ res.redirect = function redirect(url) {
});
// Respond
this.statusCode = status;
this.status(status);
this.set('Content-Length', Buffer.byteLength(body));
if (this.req.method === 'HEAD') {
@ -958,12 +879,6 @@ res.redirect = function redirect(url) {
*/
res.vary = function(field){
// checks for back-compat
if (!field || (Array.isArray(field) && !field.length)) {
deprecate('res.vary(): Provide a field name');
return this;
}
vary(this, field);
return this;
@ -1104,7 +1019,7 @@ function sendfile(res, file, options, callback) {
* ability to escape characters that can trigger HTML sniffing.
*
* @param {*} value
* @param {function} replaces
* @param {function} replacer
* @param {number} spaces
* @param {boolean} escape
* @returns {string}
@ -1118,7 +1033,7 @@ function stringify (value, replacer, spaces, escape) {
? JSON.stringify(value, replacer, spaces)
: JSON.stringify(value);
if (escape) {
if (escape && typeof json === 'string') {
json = json.replace(/[<>&]/g, function (c) {
switch (c.charCodeAt(0)) {
case 0x3c:
@ -1127,6 +1042,7 @@ function stringify (value, replacer, spaces, escape) {
return '\\u003e'
case 0x26:
return '\\u0026'
/* istanbul ignore next: unreachable default */
default:
return c
}

Some files were not shown because too many files have changed in this diff Show More