Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: expressjs/express
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 3ed5090ca91f6a387e66370d57ead94d886275e1
Choose a base ref
...
head repository: expressjs/express
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: b28db2c12c3bd9cd763316824446f79bf81e0686
Choose a head ref

Commits on Jun 7, 2018

  1. build: Node.js@4.9

    dougwilson committed Jun 7, 2018
    Copy the full SHA
    02c7535 View commit details
  2. build: Node.js@6.14

    dougwilson committed Jun 7, 2018
    Copy the full SHA
    3d8ca8a View commit details
  3. build: Node.js@8.11

    dougwilson committed Jun 7, 2018
    Copy the full SHA
    ac89f6f View commit details

Commits on Jul 31, 2018

  1. build: should@13.2.3

    dougwilson committed Jul 31, 2018
    Copy the full SHA
    f95dbc2 View commit details

Commits on Sep 13, 2018

  1. build: Node.js@8.12

    dougwilson committed Sep 13, 2018
    Copy the full SHA
    c39d7d9 View commit details
  2. Copy the full SHA
    d5b33cf View commit details
  3. examples: fix typo in multi-router example

    closes #3718
    loganripplinger authored and dougwilson committed Sep 13, 2018
    Copy the full SHA
    ede24da View commit details
  4. Fix JSDoc for Router constructor

    fixes #3598
    fixes #3599
    fixes #3698
    ankon authored and dougwilson committed Sep 13, 2018
    Copy the full SHA
    f3fa758 View commit details
  5. lint: move removed middlewares list to a variable

    closes #3558
    closes #3677
    closes #3678
    LinusU authored and dougwilson committed Sep 13, 2018

    Unverified

    This commit is not signed, but one or more authors requires that any commit attributed to them is signed.
    Copy the full SHA
    431f653 View commit details

Commits on Sep 19, 2018

  1. deps: qs@6.5.2

    dougwilson committed Sep 19, 2018
    Copy the full SHA
    b4eb1f5 View commit details
  2. deps: body-parser@1.18.3

    closes #3655
    closes #3706
    felixbuenemann authored and dougwilson committed Sep 19, 2018
    Copy the full SHA
    b8fb6a7 View commit details
  3. deps: proxy-addr@~2.0.4

    dougwilson committed Sep 19, 2018
    Copy the full SHA
    4480fb9 View commit details
  4. build: supertest@2.0.0

    dougwilson committed Sep 19, 2018
    Copy the full SHA
    5de1a08 View commit details
  5. deps: safe-buffer@5.1.2

    dougwilson committed Sep 19, 2018
    Copy the full SHA
    5e9de5d View commit details

Commits on Sep 20, 2018

  1. Copy the full SHA
    3d10279 View commit details

Commits on Sep 22, 2018

  1. Copy the full SHA
    09d5654 View commit details
  2. build: mocha@5.2.0

    dougwilson committed Sep 22, 2018
    Copy the full SHA
    f07f368 View commit details

Commits on Sep 25, 2018

  1. build: supertest@3.3.0

    dougwilson committed Sep 25, 2018
    Copy the full SHA
    451ee5d View commit details

Commits on Sep 27, 2018

  1. Copy the full SHA
    62a59b6 View commit details

Commits on Oct 11, 2018

  1. 4.16.4

    dougwilson committed Oct 11, 2018
    Copy the full SHA
    dc538f6 View commit details

Commits on Oct 27, 2018

  1. Copy the full SHA
    d0421ac View commit details
  2. build: coveralls@2.12.0

    dougwilson committed Oct 27, 2018
    Copy the full SHA
    a6b119d View commit details
  3. Copy the full SHA
    6295b45 View commit details
  4. build: support Node.js 9.x

    closes #3617
    Nacim Goura authored and dougwilson committed Oct 27, 2018
    Copy the full SHA
    003459b View commit details
  5. build: support Node.js 10.x

    closes #3617
    felixbuenemann authored and dougwilson committed Oct 27, 2018
    Copy the full SHA
    44e539e View commit details
  6. Copy the full SHA
    6bcdfef View commit details
  7. Improve error message for null/undefined to res.status

    closes #2795
    closes #2797
    closes #3111
    joshuacaron authored and dougwilson committed Oct 27, 2018
    Copy the full SHA
    8da5110 View commit details

Commits on Oct 28, 2018

  1. Support multiple hosts in X-Forwarded-Host

    fixes #3494
    closes #3495
    iconoeugen authored and dougwilson committed Oct 28, 2018
    Copy the full SHA
    b93ffd4 View commit details

Commits on Dec 18, 2018

  1. docs: fix typo in contributing

    closes #3827
    taemin-fp authored and dougwilson committed Dec 18, 2018
    Copy the full SHA
    95c31f7 View commit details
  2. docs: fix typos in history

    closes #3810
    AScriver authored and dougwilson committed Dec 18, 2018
    Copy the full SHA
    0ae10bb View commit details
  3. examples: minor fixes to some examples

    closes #3812
    Alvin Smith authored and dougwilson committed Dec 18, 2018
    Copy the full SHA
    02f3933 View commit details

Commits on Apr 16, 2019

  1. docs: add listening address to example

    closes #3873
    cirosantilli authored and dougwilson committed Apr 16, 2019
    Copy the full SHA
    186a206 View commit details
  2. docs: fix typo in jsdoc comment

    closes #3859
    Louis authored and dougwilson committed Apr 16, 2019
    Copy the full SHA
    6f12eee View commit details
  3. tests: fix typos in descriptions

    closes #3875
    jhkimwoowa authored and dougwilson committed Apr 16, 2019
    Copy the full SHA
    b9b1b19 View commit details
  4. docs: use const in readme example

    fixes #3867
    closes #3868
    mwanago authored and dougwilson committed Apr 16, 2019
    Copy the full SHA
    6eda52a View commit details

Commits on Apr 17, 2019

  1. tests: assert calls order in middleware basic tests

    closes #3878
    김정환 authored and dougwilson committed Apr 17, 2019
    Copy the full SHA
    8a97346 View commit details
  2. Copy the full SHA
    9e5d1a3 View commit details
  3. build: hbs@4.0.4

    dougwilson committed Apr 17, 2019
    Copy the full SHA
    cf5c813 View commit details
  4. build: marked@0.6.2

    dougwilson committed Apr 17, 2019
    Copy the full SHA
    4218d04 View commit details
  5. Copy the full SHA
    952484f View commit details
  6. deps: proxy-addr@~2.0.5

    dougwilson committed Apr 17, 2019
    Copy the full SHA
    50eb5e4 View commit details
  7. deps: parseurl@~1.3.3

    dougwilson committed Apr 17, 2019
    Copy the full SHA
    0334120 View commit details
  8. docs: add link to contributing guide

    closes #3846
    jamesgeorge007 authored and dougwilson committed Apr 17, 2019
    Copy the full SHA
    b02d3a1 View commit details

Commits on Apr 22, 2019

  1. deps: setprototypeof@1.1.1

    dougwilson committed Apr 22, 2019
    Copy the full SHA
    7eacdce View commit details

Commits on May 1, 2019

  1. deps: statuses@~1.5.0

    dougwilson committed May 1, 2019
    Copy the full SHA
    9afa1cf View commit details
  2. deps: accepts@~1.3.7

    dougwilson committed May 1, 2019
    Copy the full SHA
    40dbfa2 View commit details
  3. deps: type-is@~1.6.18

    dougwilson committed May 1, 2019
    Copy the full SHA
    6d9dd2d View commit details
  4. deps: qs@6.7.0

    dougwilson committed May 1, 2019
    Copy the full SHA
    32f5293 View commit details
  5. deps: body-parser@1.19.0

    dougwilson committed May 1, 2019
    Copy the full SHA
    2f782d8 View commit details

Commits on May 2, 2019

  1. Copy the full SHA
    955f2a5 View commit details
Showing with 8,117 additions and 1,150 deletions.
  1. +1 −1 .eslintrc.yml
  2. +218 −0 .github/workflows/ci.yml
  3. +4 −16 .gitignore
  4. +0 −39 .travis.yml
  5. +92 −0 Charter.md
  6. +139 −0 Code-Of-Conduct.md
  7. +2 −1 Collaborator-Guide.md
  8. +104 −13 Contributing.md
  9. +227 −14 History.md
  10. +50 −37 Readme.md
  11. +6 −0 Release-Process.md
  12. +5 −2 Security.md
  13. +63 −0 Triager-Guide.md
  14. +95 −11 appveyor.yml
  15. +12 −8 benchmarks/Makefile
  16. +34 −0 benchmarks/README.md
  17. +1 −1 benchmarks/middleware.js
  18. +5 −3 benchmarks/run
  19. +29 −0 examples/README.md
  20. +6 −3 examples/auth/index.js
  21. +2 −0 examples/auth/views/head.ejs
  22. +6 −7 examples/auth/views/login.ejs
  23. +2 −0 examples/content-negotiation/db.js
  24. +2 −0 examples/content-negotiation/index.js
  25. +1 −0 examples/content-negotiation/users.js
  26. +4 −5 examples/cookie-sessions/index.js
  27. +2 −0 examples/cookies/index.js
  28. +3 −0 examples/downloads/files/notes/groceries.txt
  29. +14 −9 examples/downloads/index.js
  30. +2 −0 examples/ejs/index.js
  31. +1 −1 examples/ejs/public/stylesheets/style.css
  32. +1 −0 examples/ejs/views/header.html
  33. +2 −2 examples/ejs/views/users.html
  34. +2 −0 examples/error-pages/index.js
  35. +2 −2 examples/error-pages/views/404.ejs
  36. +2 −2 examples/error-pages/views/500.ejs
  37. +2 −0 examples/error-pages/views/error_header.ejs
  38. +2 −0 examples/error-pages/views/index.ejs
  39. +3 −1 examples/error/index.js
  40. +3 −1 examples/hello-world/index.js
  41. +3 −1 examples/markdown/index.js
  42. +2 −0 examples/multi-router/controllers/api_v1.js
  43. +2 −0 examples/multi-router/controllers/api_v2.js
  44. +3 −1 examples/multi-router/index.js
  45. +0 −60 examples/multipart/index.js
  46. +2 −0 examples/mvc/controllers/main/index.js
  47. +2 −0 examples/mvc/controllers/pet/index.js
  48. +2 −0 examples/mvc/controllers/pet/views/edit.ejs
  49. +2 −0 examples/mvc/controllers/pet/views/show.ejs
  50. +2 −0 examples/mvc/controllers/user-pet/index.js
  51. +2 −0 examples/mvc/controllers/user/index.js
  52. +2 −0 examples/mvc/controllers/user/views/edit.hbs
  53. +2 −0 examples/mvc/controllers/user/views/list.hbs
  54. +2 −0 examples/mvc/controllers/user/views/show.hbs
  55. +2 −0 examples/mvc/db.js
  56. +2 −0 examples/mvc/index.js
  57. +2 −0 examples/mvc/lib/boot.js
  58. +1 −1 examples/mvc/public/style.css
  59. +1 −0 examples/mvc/views/404.ejs
  60. +1 −0 examples/mvc/views/5xx.ejs
  61. +1 −0 examples/online/index.js
  62. +6 −11 examples/params/index.js
  63. +3 −1 examples/resource/index.js
  64. +6 −3 examples/route-map/index.js
  65. +3 −1 examples/route-middleware/index.js
  66. +2 −0 examples/route-separation/index.js
  67. +2 −0 examples/route-separation/post.js
  68. +2 −0 examples/route-separation/site.js
  69. +2 −0 examples/route-separation/user.js
  70. +1 −0 examples/route-separation/views/header.ejs
  71. +2 −2 examples/route-separation/views/index.ejs
  72. +2 −2 examples/route-separation/views/posts/index.ejs
  73. +3 −3 examples/route-separation/views/users/edit.ejs
  74. +2 −2 examples/route-separation/views/users/index.ejs
  75. +2 −2 examples/route-separation/views/users/view.ejs
  76. +1 −0 examples/search/index.js
  77. +2 −0 examples/search/public/client.js
  78. +3 −2 examples/search/public/index.html
  79. +1 −0 examples/session/index.js
  80. +2 −0 examples/session/redis.js
  81. +2 −0 examples/static-files/index.js
  82. +1 −1 examples/static-files/public/js/app.js
  83. +2 −0 examples/vhost/index.js
  84. +2 −0 examples/view-constructor/github-view.js
  85. +2 −0 examples/view-constructor/index.js
  86. +4 −2 examples/view-locals/index.js
  87. +2 −0 examples/view-locals/user.js
  88. +1 −0 examples/view-locals/views/index.ejs
  89. +8 −6 examples/web-service/index.js
  90. +19 −2 lib/application.js
  91. +7 −3 lib/express.js
  92. +5 −1 lib/request.js
  93. +76 −35 lib/response.js
  94. +27 −16 lib/router/index.js
  95. +22 −8 lib/router/route.js
  96. +7 −10 lib/utils.js
  97. +1 −1 lib/view.js
  98. +37 −37 package.json
  99. +52 −20 test/Route.js
  100. +87 −7 test/Router.js
  101. +16 −1 test/acceptance/auth.js
  102. +1 −1 test/acceptance/cookie-sessions.js
  103. +17 −0 test/acceptance/downloads.js
  104. +21 −0 test/acceptance/hello-world.js
  105. +1 −1 test/acceptance/multi-router.js
  106. +3 −3 test/acceptance/web-service.js
  107. +8 −5 test/app.all.js
  108. +1 −0 test/app.del.js
  109. +8 −6 test/app.engine.js
  110. +8 −10 test/app.head.js
  111. +40 −18 test/app.js
  112. +3 −7 test/app.listen.js
  113. +16 −17 test/app.locals.js
  114. +1 −0 test/app.options.js
  115. +19 −20 test/app.param.js
  116. +28 −27 test/app.render.js
  117. +120 −0 test/app.request.js
  118. +114 −15 test/app.response.js
  119. +2 −0 test/app.route.js
  120. +73 −50 test/app.router.js
  121. +9 −6 test/app.routes.error.js
  122. +11 −9 test/app.use.js
  123. +45 −0 test/config.js
  124. +37 −11 test/exports.js
  125. +790 −0 test/express.json.js
  126. +555 −0 test/express.raw.js
  127. +814 −0 test/express.static.js
  128. +605 −0 test/express.text.js
  129. +866 −0 test/express.urlencoded.js
  130. 0 test/fixtures/empty.txt
  131. +1 −0 test/fixtures/nums.txt
  132. +1 −0 test/fixtures/pets/names.txt
  133. 0 test/fixtures/snow ☃/.gitkeep
  134. +1 −0 test/fixtures/todo.html
  135. +1 −0 test/fixtures/todo.txt
  136. +1 −0 test/fixtures/users/index.html
  137. +1 −0 test/fixtures/users/tobi.txt
  138. +3 −0 test/middleware.basic.js
  139. +0 −3 test/mocha.opts
  140. +1 −0 test/regression.js
  141. +1 −0 test/req.accepts.js
  142. +3 −2 test/req.acceptsCharset.js
  143. +3 −2 test/req.acceptsCharsets.js
  144. +19 −16 test/req.acceptsEncoding.js
  145. +20 −17 test/req.acceptsEncodings.js
  146. +29 −25 test/req.acceptsLanguage.js
  147. +29 −25 test/req.acceptsLanguages.js
  148. +1 −0 test/req.baseUrl.js
  149. +1 −0 test/req.fresh.js
  150. +1 −0 test/req.get.js
  151. +1 −0 test/req.host.js
  152. +51 −0 test/req.hostname.js
  153. +17 −1 test/req.ip.js
  154. +1 −0 test/req.ips.js
  155. +1 −0 test/req.is.js
  156. +1 −0 test/req.param.js
  157. +1 −0 test/req.path.js
  158. +1 −0 test/req.protocol.js
  159. +7 −4 test/req.query.js
  160. +1 −0 test/req.range.js
  161. +7 −4 test/req.route.js
  162. +1 −0 test/req.secure.js
  163. +1 −0 test/req.signedCookies.js
  164. +1 −0 test/req.stale.js
  165. +1 −0 test/req.subdomains.js
  166. +23 −43 test/req.xhr.js
  167. +42 −30 test/res.append.js
  168. +1 −0 test/res.attachment.js
  169. +1 −0 test/res.clearCookie.js
  170. +142 −23 test/res.cookie.js
  171. +324 −18 test/res.download.js
  172. +31 −3 test/res.format.js
  173. +1 −0 test/res.get.js
  174. +16 −0 test/res.json.js
  175. +72 −52 test/res.jsonp.js
  176. +1 −0 test/res.links.js
  177. +5 −6 test/res.locals.js
  178. +293 −12 test/res.location.js
  179. +14 −9 test/res.redirect.js
  180. +1 −0 test/res.render.js
  181. +27 −6 test/res.send.js
  182. +808 −191 test/res.sendFile.js
  183. +1 −0 test/res.sendStatus.js
  184. +1 −0 test/res.set.js
  185. +194 −12 test/res.status.js
  186. +1 −0 test/res.type.js
  187. +1 −0 test/res.vary.js
  188. +1 −1 test/support/env.js
  189. +48 −0 test/support/utils.js
  190. +26 −18 test/utils.js
2 changes: 1 addition & 1 deletion .eslintrc.yml
Original file line number Diff line number Diff line change
@@ -3,6 +3,6 @@ root: true
rules:
eol-last: error
eqeqeq: [error, allow-null]
indent: [error, 2, { SwitchCase: 1 }]
indent: [error, 2, { MemberExpression: "off", SwitchCase: 1 }]
no-trailing-spaces: error
no-unused-vars: [error, { vars: all, args: none, ignoreRestSiblings: true }]
218 changes: 218 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,218 @@
name: ci

on:
- pull_request
- push

jobs:
test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
name:
- Node.js 0.10
- Node.js 0.12
- io.js 1.x
- io.js 2.x
- io.js 3.x
- Node.js 4.x
- Node.js 5.x
- Node.js 6.x
- Node.js 7.x
- Node.js 8.x
- Node.js 9.x
- Node.js 10.x
- Node.js 11.x
- Node.js 12.x
- Node.js 13.x
- Node.js 14.x
- Node.js 15.x
- Node.js 16.x
- Node.js 17.x
- Node.js 18.x
- Node.js 19.x
- Node.js 20.x
- Node.js 21.x

include:
- name: Node.js 0.10
node-version: "0.10"
npm-i: mocha@3.5.3 nyc@10.3.2 supertest@2.0.0

- name: Node.js 0.12
node-version: "0.12"
npm-i: mocha@3.5.3 nyc@10.3.2 supertest@2.0.0

- name: io.js 1.x
node-version: "1.8"
npm-i: mocha@3.5.3 nyc@10.3.2 supertest@2.0.0

- name: io.js 2.x
node-version: "2.5"
npm-i: mocha@3.5.3 nyc@10.3.2 supertest@2.0.0

- name: io.js 3.x
node-version: "3.3"
npm-i: mocha@3.5.3 nyc@10.3.2 supertest@2.0.0

- name: Node.js 4.x
node-version: "4.9"
npm-i: mocha@5.2.0 nyc@11.9.0 supertest@3.4.2

- name: Node.js 5.x
node-version: "5.12"
npm-i: mocha@5.2.0 nyc@11.9.0 supertest@3.4.2

- name: Node.js 6.x
node-version: "6.17"
npm-i: mocha@6.2.2 nyc@14.1.1 supertest@3.4.2

- name: Node.js 7.x
node-version: "7.10"
npm-i: mocha@6.2.2 nyc@14.1.1 supertest@6.1.6

- name: Node.js 8.x
node-version: "8.17"
npm-i: mocha@7.2.0 nyc@14.1.1

- name: Node.js 9.x
node-version: "9.11"
npm-i: mocha@7.2.0 nyc@14.1.1

- name: Node.js 10.x
node-version: "10.24"
npm-i: mocha@8.4.0

- name: Node.js 11.x
node-version: "11.15"
npm-i: mocha@8.4.0

- name: Node.js 12.x
node-version: "12.22"
npm-i: mocha@9.2.2

- name: Node.js 13.x
node-version: "13.14"
npm-i: mocha@9.2.2

- name: Node.js 14.x
node-version: "14.20"

- name: Node.js 15.x
node-version: "15.14"

- name: Node.js 16.x
node-version: "16.20"

- name: Node.js 17.x
node-version: "17.9"

- name: Node.js 18.x
node-version: "18.19"

- name: Node.js 19.x
node-version: "19.9"

- name: Node.js 20.x
node-version: "20.11"

- name: Node.js 21.x
node-version: "21.6"

steps:
- uses: actions/checkout@v4

- name: Install Node.js ${{ matrix.node-version }}
shell: bash -eo pipefail -l {0}
run: |
nvm install --default ${{ matrix.node-version }}
dirname "$(nvm which ${{ matrix.node-version }})" >> "$GITHUB_PATH"
- name: Configure npm
run: |
npm config set loglevel error
if [[ "$(npm config get package-lock)" == "true" ]]; then
npm config set package-lock false
else
npm config set shrinkwrap false
fi
- name: Install npm module(s) ${{ matrix.npm-i }}
run: npm install --save-dev ${{ matrix.npm-i }}
if: matrix.npm-i != ''

- name: Remove non-test dependencies
run: npm rm --silent --save-dev connect-redis

- name: Setup Node.js version-specific dependencies
shell: bash
run: |
# eslint for linting
# - remove on Node.js < 12
if [[ "$(cut -d. -f1 <<< "${{ matrix.node-version }}")" -lt 12 ]]; then
node -pe 'Object.keys(require("./package").devDependencies).join("\n")' | \
grep -E '^eslint(-|$)' | \
sort -r | \
xargs -n1 npm rm --silent --save-dev
fi
- name: Install Node.js dependencies
run: npm install

- name: List environment
id: list_env
shell: bash
run: |
echo "node@$(node -v)"
echo "npm@$(npm -v)"
npm -s ls ||:
(npm -s ls --depth=0 ||:) | awk -F'[ @]' 'NR>1 && $2 { print $2 "=" $3 }' >> "$GITHUB_OUTPUT"
- name: Run tests
shell: bash
run: |
npm run test-ci
cp coverage/lcov.info "coverage/${{ matrix.name }}.lcov"
- name: Lint code
if: steps.list_env.outputs.eslint != ''
run: npm run lint

- name: Collect code coverage
run: |
mv ./coverage "./${{ matrix.name }}"
mkdir ./coverage
mv "./${{ matrix.name }}" "./coverage/${{ matrix.name }}"
- name: Upload code coverage
uses: actions/upload-artifact@v3
with:
name: coverage
path: ./coverage
retention-days: 1

coverage:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install lcov
shell: bash
run: sudo apt-get -y install lcov

- name: Collect coverage reports
uses: actions/download-artifact@v3
with:
name: coverage
path: ./coverage

- name: Merge coverage reports
shell: bash
run: find ./coverage -name lcov.info -exec printf '-a %q\n' {} \; | xargs lcov -o ./coverage/lcov.info

- name: Upload coverage report
uses: coverallsapp/github-action@master
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
20 changes: 4 additions & 16 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,27 +1,15 @@
# OS X
.DS_Store*
Icon?
._*

# Windows
Thumbs.db
ehthumbs.db
Desktop.ini

# Linux
.directory
*~


# npm
node_modules
package-lock.json
*.log
*.gz


# Coveralls
.nyc_output
coverage

# Benchmarking
benchmarks/graphs

# ignore additional files using core.excludesFile
# https://git-scm.com/docs/gitignore
39 changes: 0 additions & 39 deletions .travis.yml

This file was deleted.

92 changes: 92 additions & 0 deletions Charter.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
# Express Charter

## Section 0: Guiding Principles

The Express project is part of the OpenJS Foundation which operates
transparently, openly, collaboratively, and ethically.
Project proposals, timelines, and status must not merely be open, but
also easily visible to outsiders.

## Section 1: Scope

Express is a HTTP web server framework with a simple and expressive API
which is highly aligned with Node.js core. We aim to be the best in
class for writing performant, spec compliant, and powerful web servers
in Node.js. As one of the oldest and most popular web frameworks in
the ecosystem, we have an important place for new users and experts
alike.

### 1.1: In-scope

Express is made of many modules spread between three GitHub Orgs:

- [expressjs](http://github.com/expressjs/): Top level middleware and
libraries
- [pillarjs](http://github.com/pillarjs/): Components which make up
Express but can also be used for other web frameworks
- [jshttp](http://github.com/jshttp/): Low level HTTP libraries

### 1.2: Out-of-Scope

Section Intentionally Left Blank

## Section 2: Relationship with OpenJS Foundation CPC.

Technical leadership for the projects within the OpenJS Foundation is
delegated to the projects through their project charters by the OpenJS
Cross Project Council (CPC). In the case of the Express project, it is
delegated to the Express Technical Committee ("TC").

This Technical Committee is in charge of both the day-to-day operations
of the project, as well as its technical management. This charter can
be amended by the TC requiring at least two approvals and a minimum two
week comment period for other TC members or CPC members to object. Any
changes the CPC wishes to propose will be considered a priority but
will follow the same process.

### 2.1 Other Formal Project Relationships

Section Intentionally Left Blank

## Section 3: Express Governing Body

The Express project is managed by the Technical Committee ("TC").
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.

## Section 4: Roles & Responsibilities

The Express TC manages all aspects of both the technical and community
parts of the project. Members of the TC should attend the regular
meetings when possible, and be available for discussion of time
sensitive or important issues.

### Section 4.1 Project Operations & Management

Section Intentionally Left Blank

### Section 4.2: Decision-making, Voting, and/or Elections

The Express 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.

### Section 4.3: Other Project Roles

Section Intentionally Left Blank

## Section 5: Definitions

Section Intentionally Left Blank
Loading