diff --git a/.github/ISSUE_TEMPLATE/meeting.md b/.github/ISSUE_TEMPLATE/meeting.md index 7ad4ad1..527876c 100644 --- a/.github/ISSUE_TEMPLATE/meeting.md +++ b/.github/ISSUE_TEMPLATE/meeting.md @@ -2,9 +2,13 @@ 'America/Los_Angeles', 'America/Denver', 'America/Chicago', + 'America/Bogota', 'America/New_York', + 'UTC', 'Europe/London', - 'Europe/Amsterdam', + 'Europe/Madrid', + 'Europe/Paris', + 'Europe/Warsaw', 'Europe/Moscow', 'Asia/Kolkata', 'Asia/Shanghai', diff --git a/.github/workflows/meetings.yml b/.github/workflows/meetings.yml index 13be25d..319450c 100644 --- a/.github/workflows/meetings.yml +++ b/.github/workflows/meetings.yml @@ -38,8 +38,8 @@ jobs: orgs: expressjs,pillarjs,jshttp agendaLabel: 'top priority' meetingLabels: 'meeting' - # Wednesday 1 PM America/Chicago with a period of 2 weeks (P2W) - schedules: '2025-08-13T13:00:00.0[America/Chicago]/P2W' + # Wednesday 3 PM America/Chicago with a period of 2 weeks (P2W) + schedules: '2025-08-13T15:00:00.0[America/Chicago]/P2W' createWithin: 'P1W' meetingLink: 'https://zoom-lfx.platform.linuxfoundation.org/meeting/95258037175?password=07aad89d-ff43-45df-9b28-f437e167a0b9' issueTemplate: 'meeting.md' diff --git a/README.md b/README.md index d904f66..1bf99e2 100644 --- a/README.md +++ b/README.md @@ -15,3 +15,17 @@ of nature. Current meeting schedule: Wednesdays 23:30 UTC Recordings of past meetings are available on the [Express Youtube Channel](https://www.youtube.com/channel/UCYjxjAeH6TRik9Iwy5nXw7g/videos). + +### RFC vs ADR — The Real Difference + +An **RFC** is a *collaboration tool*: its purpose is to surface a problem, +explore solutions, gather feedback, and drive alignment. +It is iterative, often long-form, and meant for broad input. +An RFC does **not** imply a decision — it is a decision-making *process*. + +An **ADR** is a *recording tool*: its purpose is to capture a decision +that has already been made, including context, trade-offs, and consequences. +It is concise, stable, and part of the architectural history of a system. +An ADR does **not** create alignment — it preserves it. + +In essence: **RFC = how we decide**, **ADR = what we decided and why**. diff --git a/docs/GOVERNANCE.md b/docs/GOVERNANCE.md index 819f76d..538ac01 100644 --- a/docs/GOVERNANCE.md +++ b/docs/GOVERNANCE.md @@ -61,7 +61,7 @@ compromise among committers be the default resolution mechanism. ## Becoming a Triager Anyone can become a triager! Read more about the process of being a triager in -[the triage process document](Triager-Guide.md). +[the triage process document](contributing/triager-guide.md). Currently, any existing [organization member](https://github.com/orgs/expressjs/people) can nominate a new triager. If you are interested in becoming a triager, our best advice is to actively participate @@ -156,6 +156,26 @@ The list can be found at [https://github.com/expressjs/discussions/blob/HEAD/doc The list can be found at [https://github.com/expressjs/discussions/blob/HEAD/docs/contributing/captains_and_committers.md#current-initiative-captains](https://github.com/expressjs/discussions/blob/HEAD/docs/contributing/captains_and_committers.md#current-initiative-captains) +## Inactivity and Emeritus Policy for Any Role + +To support the health and continuity of the project, all individuals holding a role within the community (such as Triager, Committer, WG member, Project Captain, or TC member) are encouraged to maintain active participation. + +Inactivity is defined as the absence of meaningful involvement in the project—such as contributions, code reviews, triage, meeting attendance, or discussion participation—for a continuous period of 6 months. + +### Exceptions + +Anyone may request a temporary leave from active participation due to personal or professional reasons. In such cases, the individual should inform the relevant team or the Technical Committee (TC). During this time, the inactivity policy is paused, and the individual will not be flagged as inactive. + +### Inactivity Process + +* If someone is deemed inactive, the individual may be transitioned to an emeritus role that reflects their past contributions. A best effort will be made to inform them that this has occurred. They may request to be reinstated when they are ready to be active again. +* The emeritus status helps preserve a clear record of contributors who have meaningfully shaped the project over time. + +### Accountability + +* The Technical Committee (TC) and the respective captains of each package/team are responsible for assessing activity levels and enacting this policy fairly and transparently, in coordination with other relevant teams. +* In case of disagreement, the situation can be discussed and resolved by consensus within the TC or appropriate team. + ## Developer's Certificate of Origin 1.1 ```text diff --git a/docs/adr/323-esm-support.md b/docs/adr/323-esm-support.md new file mode 100644 index 0000000..6c7c53f --- /dev/null +++ b/docs/adr/323-esm-support.md @@ -0,0 +1,92 @@ +# ADR: ESM exports + +## Status + +Accepted + +## Submitters + +- @kjugi +- @wesleytodd +- @ctcpip + +## Decision Owners + +- @expressjs/express-tc + +## Context + +The document's objective is to gather all notable comments and thoughts in one place and track potential changes in this topic. We have noticed that it is repeated frequently in many issues from the community and we need to take action. + +We have acknowledged the need and discussion around it touched on multiple scenarios. Including: + +- rethinking the process and exposing both options (ESM and CommonJS) for all libraries +- expose both options (ESM and CommonJS) for selected libraries +- maintaining status quo as the main target is on the server + +**Why do we need this decision?** +We aimed to consolidate the Technical Committee's (TC) opinion on this topic. It is important to emphasize that Express is an HTTP framework specifically designed for Node.js. Additionally, some of our libraries are being utilized by the community in other environments. + +**What problem does it solve or avoid?** +Ambiguity and uncertainty for the community, alongside clear guidance for repository maintainers and contributors. + +**Are there any existing issues/discussions/pull requests related to this?** + +- +- +- +- + +## Decision + +Holistically, as a project/team, we will not make a dedicated effort to export our libraries in the ESM format. + +This applies to all [expressjs](https://github.com/expressjs), [pillarjs](https://github.com/pillarjs), or [jshttp](https://github.com/jshttp) packages. + +**However, repo captains, as the primary maintainers of packages, retain autonomy and discretion of whether or not they choose to support ESM exports directly.** + +### What will be done? + +Future issues and PRs regarding ESM exports may be closed with a link to this document. + +## Rationale + +During the [working session](https://github.com/expressjs/discussions/issues/320), we had an in-depth discussion about this topic. + +This decision is motivated by the lack of resources to maintain such an effort in the long term. It is also worth noting that Express was specifically designed to run with Node.js. + +At present, our libraries function seamlessly in Node.js, supporting both CommonJS and ESM. Transitioning to support additional scenarios, such as direct ESM exports, would require significant changes to our CI systems and additional maintenance overhead. + +While the JavaScript ecosystem has increasingly moved toward ESM due to its compatibility with browsers, enhanced tree-shaking capabilities (coming from bundler tools), and support for dynamic imports, there are still complexities and challenges associated with ESM. + +Adopting ESM for our libraries would require a significant investment of time and resources to ensure proper implementation and long-term maintenance. While it is not impossible to achieve, it represents a considerable effort. Moreover, the majority of our users already utilize our libraries in their projects, relying on bundlers to handle the necessary transformations without issues. + +- **Alternatives Considered:** + - Add ESM export to our libraries. CommonJS format is accepted by bundlers. +- **Why is this decision the best option?** + - Time and energy can be shifted to other topics. + +## Consequences + +- **Positive Impact**: It does not require supporting another set of tools and major release. +- **Negative Impact**: + - No guarantee the packages work in browser environments. + - Potential community library fork (to make it ESM-friendly) might lack security updates over time + - OSS library authors that use our packages in ESM native libs might suffer from a lack of support +- **Mitigations**: Package maintainers may decide to expose both CJS and ESM + +## References + +Support for commonjs imports in ESM code is available in the node. Described in docs: + +- + +Support for ESM modules imports in commonjs is available in recent LTS Node.js versions. Docs: + +- + +## Changelog + +Track changes or updates to this ADR over time. Include the date, author, and a brief description of each change. + +- **[2025-01-15] - [2026-04-01]**: [@kjugi, @ctcpip, @wesleytodd] - initial doc diff --git a/docs/contributing/captains_and_committers.md b/docs/contributing/captains_and_committers.md index 1594c68..45739f2 100644 --- a/docs/contributing/captains_and_committers.md +++ b/docs/contributing/captains_and_committers.md @@ -3,26 +3,25 @@ - [`expressjs/badgeboard`](https://github.com/expressjs/badgeboard): @wesleytodd - [`expressjs/basic-auth-connect`](https://github.com/expressjs/basic-auth-connect): @ulisesGascon - [`expressjs/body-parser`](https://github.com/expressjs/body-parser): - - Captains: @wesleytodd, @jonchurch, @ulisesGascon + - Captains: @jonchurch, @ulisesGascon - Committers: @Phillip9587 -- [`expressjs/codemod`](https://github.com/expressjs/codemod): @bjohansebas (npm: `@bsebas`), @kjugi (npm: `@filip.kudla`) +- [`expressjs/codemod`](https://github.com/expressjs/codemod): + - captains: @bjohansebas, @kjugi + - committers: @AugustinMauroy - [`expressjs/compression`](https://github.com/expressjs/compression): - captains: @UlisesGascon - committers: @bjohansebas -- [`expressjs/connect-multiparty`](https://github.com/expressjs/connect-multiparty): @ulisesGascon - [`expressjs/cookie-parser`](https://github.com/expressjs/cookie-parser): @wesleytodd, @UlisesGascon - [`expressjs/cookie-session`](https://github.com/expressjs/cookie-session): @ulisesGascon - [`expressjs/cors`](https://github.com/expressjs/cors): @jonchurch, @ulisesGascon - [`expressjs/discussions`](https://github.com/expressjs/discussions): @wesleytodd - [`expressjs/errorhandler`](https://github.com/expressjs/errorhandler): @ulisesGascon -- [`expressjs/express-paginate`](https://github.com/expressjs/express-paginate): @ulisesGascon - [`expressjs/express`](https://github.com/expressjs/express): - captains: @wesleytodd, @ulisesGascon - committers: @bjohansebas, @Phillip9587 - [`expressjs/expressjs.com`](https://github.com/expressjs/expressjs.com): - captains: @crandmck, @jonchurch, @bjohansebas - - committers: @carlosstenzel, @chrisdel101 -- [`expressjs/flash`](https://github.com/expressjs/flash): @ulisesGascon + - committers: @carlosstenzel @ShubhamOulkar - [`expressjs/generator`](https://github.com/expressjs/generator): @wesleytodd - [`expressjs/method-override`](https://github.com/expressjs/method-override): @ulisesGascon - [`expressjs/morgan`](https://github.com/expressjs/morgan): @jonchurch, @ulisesGascon @@ -72,6 +71,9 @@ - committers: @Phillip9587 - [`pillarjs/hbs`](https://github.com/pillarjs/hbs): @ulisesGascon - [`pillarjs/multiparty`](https://github.com/pillarjs/multiparty): @blakeembrey +- [`pillarjs/iconv-lite`](https://github.com/pillarjs/iconv-lite): + - Captains: @ashtuchkin, @bjohansebas + - Committers: @Phillip9587 - [`pillarjs/parseurl`](https://github.com/pillarjs/parseurl): @blakeembrey - [`pillarjs/path-to-regexp`](https://github.com/pillarjs/path-to-regexp): @blakeembrey - [`pillarjs/request`](https://github.com/pillarjs/request): @wesleytodd @@ -82,4 +84,28 @@ ## Current Initiative Captains -- Triage team [ref](https://github.com/expressjs/discussions/issues/227): @UlisesGascon +- [Triage team](https://github.com/expressjs/discussions/issues/227): @UlisesGascon, @bjohansebas +- [Security WG](https://github.com/expressjs/security-wg): @UlisesGascon +- [Perf WG](https://github.com/expressjs/perf-wg): @wesleytodd +- [Typescript WG](https://github.com/expressjs/typescript-wg): @jonchurch, @bjohansebas +- Archived repos and deprecated packages: @UlisesGascon + +## Accounts details + +- @ashtuchkin (npm: [~ashtuchkin](https://www.npmjs.com/~ashtuchkin)) +- @bjohansebas (npm: [~bsebas](https://www.npmjs.com/~bsebas)) +- @blakeembrey (npm: [~blakeembrey](https://www.npmjs.com/~blakeembrey)) +- @crandmck (npm: [~crandmck](https://www.npmjs.com/~crandmck)) +- @ctcpip (npm: [~ctcpip](https://www.npmjs.com/~ctcpip)) +- @jonchurch (npm: [~jonchurch](https://www.npmjs.com/~jonchurch)) +- @kjugi (npm: [~filip.kudla](https://www.npmjs.com/~filip.kudla)) +- @LinusU (npm: [~linusu](https://www.npmjs.com/~linusu)) +- @seplu (npm: [~sheplu](https://www.npmjs.com/~sheplu)) +- @ulisesGascon (npm: [~ulisesgascon](https://www.npmjs.com/~ulisesgascon)) +- @wesleytodd (npm: [~wesleytodd](https://www.npmjs.com/~wesleytodd)) + +## Emeritus Members + +- [`expressjs/expressjs.com`](https://github.com/expressjs/expressjs.com): + - triage: @juliogarciape @inigomarquinez + - committers: @chrisdel101 diff --git a/docs/contributing/release-process.md b/docs/contributing/release-process.md index 2063533..87dd20b 100644 --- a/docs/contributing/release-process.md +++ b/docs/contributing/release-process.md @@ -2,25 +2,25 @@ 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 . +Committee (TC) to create, promote and sign official release builds for any +package governed by Express. ## Who can make releases? -Release authorization is given by the Express TC. Once authorized, an individual -must have the following access permissions: +According to project governance, only package Captains or members of the Technical +Committee (TC) are permitted to make releases. Captains have the freedom to make releases +for their own package whenever necessary, while TC members may make releases for any package +as needed. ### 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). +The person making the release must be either the package captain or a member of the TC in +order to have sufficient permissions to do the work. ### 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 +package on npmjs.com so they are able to publish the release (see Step 6). ## How to publish a release diff --git a/docs/rfc/0000-template.md b/docs/rfc/0000-template.md new file mode 100644 index 0000000..7daabe5 --- /dev/null +++ b/docs/rfc/0000-template.md @@ -0,0 +1,35 @@ +# {{TITLE: a human-readable title for this RFC!}} + +## Summary + +{{A concise, one-paragraph description of the change.}} + +## Motivation + +{{Why are we doing this? What pain points does this resolve? What use cases does it support? What is the expected outcome? Use real, concrete examples to make your case!}} + +## Detailed Explanation + +{{Describe the expected changes in detail, }} + +## Rationale and Alternatives + +{{Discuss 2-3 different alternative solutions that were considered. This is required, even if it seems like a stretch. Then explain why this is the best choice out of available ones.}} + +## Implementation + +{{Give a high-level overview of implementation requirements and concerns. Be specific about areas of code that need to change, and what their potential effects are. Discuss which repositories and sub-components will be affected, and what its overall code effect might be.}} + +{{THIS SECTION IS REQUIRED FOR RATIFICATION -- you can skip it if you don't know the technical details when first submitting the proposal, but it must be there before it's accepted}} + +## Prior Art + +{{This section is optional if there are no actual prior examples in other tools}} + +{{Discuss existing examples of this change in other tools, and how they've addressed various concerns discussed above, and what the effect of those decisions has been}} + +## Unresolved Questions and Bikeshedding + +{{Write about any arbitrary decisions that need to be made (syntax, colors, formatting, minor UX decisions), and any questions for the proposal that have not been answered.}} + +{{THIS SECTION SHOULD BE REMOVED BEFORE RATIFICATION}}