Skip to content

refactor: replace once package with internal implementation #6591

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

Phillip9587
Copy link
Contributor

This PR removes the external once package and replaces it with a modern, internal utility function. The goal is to reduce unnecessary dependencies and simplify the codebase without altering runtime behavior.

  • Removes two dependencies from the dependency tree: once and wrappy
  • Updates server startup logic (e.g., app.listen) to use the new local once function

No functional changes expected — behavior remains consistent with the previous implementation.

🔎 Originally introduced in expressjs/express#3216

@Phillip9587 Phillip9587 marked this pull request as ready for review June 25, 2025 20:32
@Phillip9587 Phillip9587 requested a review from Copilot June 25, 2025 20:33
Copy link

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR removes the external "once" package and "wrappy" from the dependency tree and replaces it with an internal utility function to simplify the codebase.

  • Removed external dependency "once" from package.json
  • Introduced an internal "once" implementation in lib/utils.js
  • Updated lib/application.js to reference the new internal implementation

Reviewed Changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

File Description
package.json Removed the "once" package dependency
lib/utils.js Added a new internal implementation of "once"
lib/application.js Updated the import to use the internal "once" function

Copy link
Member

@bjohansebas bjohansebas left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This has already been tried before, see #6555

@Phillip9587
Copy link
Contributor Author

@bjohansebas I'm sorry I missed the earlier PR. I didn't get a chance to review it before it was closed. I thought we had a policy about leaving PRs open long enough to allow contributors to comment - maybe we can revisit that if needed.

I'd like to respond to a few points raised in #6555:

Removing this dep doesn't achieve anything because it is also used in other libraries that ship with express. We would need to duplicate this code into all of them.

I double-checked all 3 orgs, and as far as I can tell, express is the only package in our ecosystem depending on once. I also ran npm ls once across a few bigger company projects, and express is the only dependency bringing it in.

Thanks for the PR! The change is valid, and the implementation looks fine. That said, I'd stick with the current use of once.
It was added intentionally in #3216 as a minimal, well-scoped alternative to ee-first. I prefer to keep small, purpose-built dependencies like this when they clearly express intent and don’t add meaningful overhead.
Inlining this logic doesn’t materially improve clarity or reduce maintenance cost, so I'd opt to keep it as is.

Totally understand that reasoning. However, once is only used once in the entire repo, and pulling in two external dependencies (once and wrappy) for such a small utility seems unnecessary - especially when the equivalent logic can be clearly expressed inline in modern JavaScript. If this logic were shared across multiple packages or reused in multiple places, I’d agree there’s more justification. But in this case, I believe simplifying it locally is a reasonable tradeoff.

Please don’t close this PR just yet.
I'd really appreciate it if we could keep the discussion open a bit longer to gather more feedback. Let’s keep the conversation respectful and focused on what’s best for the project long-term.

Thanks!

@Phillip9587 Phillip9587 requested a review from ctcpip June 25, 2025 21:20
@ctcpip
Copy link
Member

ctcpip commented Jun 25, 2025

my position on this is unchanged. please see these particular comments:

pulling in two external dependencies (once and wrappy) for such a small utility seems unnecessary

pulling in dependencies is not a bad thing, and eliminating dependencies is not necessarily a good thing

note also that the once library has a test suite, and this PR does not add any unit test coverage. (tests are generally required for PRs). that's not me saying to add tests now -- because I don't think we should land this change anyway. I'm only pointing out that tests are missing

in any case, as I said in the comment linked above, I think that further discussion is better suited for an actual discussion

@ctcpip ctcpip marked this pull request as draft June 25, 2025 21:39
ctcpip

This comment was marked as duplicate.

@bjohansebas
Copy link
Member

I still believe we shouldn't remove this dependency. I know my position isn't reflected in the PR, but I did share it on Slack, where I agreed with Jordan and, in general, with the other members who are opposed to removing this dependency to add it directly here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy