Skip to content

fix(node): scope entrypoint filter to api/ directory only#15954

Merged
smaeda-ks merged 2 commits into
mainfrom
shohei/fix-node-filter
Apr 14, 2026
Merged

fix(node): scope entrypoint filter to api/ directory only#15954
smaeda-ks merged 2 commits into
mainfrom
shohei/fix-node-filter

Conversation

@smaeda-ks

Copy link
Copy Markdown
Member

Summary

  • Fixes a bug introduced in feat(node): filter non-entrypoint Node.js files in /api directory #15873 where VERCEL_NODE_FILTER_ENTRYPOINTS=1 incorrectly filters out root-level platform files like middleware.ts
  • Root cause: isNodeEntrypoint() checks for standard API handler exports (export default, HTTP methods, fetch, module.exports), but root-level platform files use different signatures (e.g., export function middleware()). Files that don't match any pattern are silently dropped.
  • Fix: scope the Node.js entrypoint filter to fileName.startsWith('api/') — the filter was only ever intended for helper files inside api/, and maybeGetApiBuilder() already gates entry to api/ files + root-level platform files at line 443. This avoids needing to enumerate every platform file pattern (middleware, proxy, etc.) as a negation.

What was affected

Any non-Next.js project with VERCEL_NODE_FILTER_ENTRYPOINTS=1 that uses root-level middleware.ts/middleware.js. Next.js projects are unaffected because @vercel/next handles middleware via its own manifest-based pipeline, and root-level middleware is already excluded for Next.js at line 439.

Test plan

  • middleware.ts is preserved when entrypoint filter is active
  • Monorepo workspace: helpers under api/ are correctly filtered
  • Monorepo workspace: middleware is preserved alongside filtered helpers
  • Existing tests pass (entrypoint filtering, env var gating)
  • Prettier and lint pass

🤖 Generated with Claude Code

The Node.js entrypoint filter incorrectly applied to root-level platform
files like middleware.ts, which use different export signatures than API
handlers. Scoping to api/ files only prevents silent middleware removal.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@changeset-bot

changeset-bot Bot commented Apr 14, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: a051f96

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@vercel/fs-detectors Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercel Bot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
vercel Ready Ready Preview, Comment Apr 14, 2026 9:48pm

Request Review

@smaeda-ks smaeda-ks marked this pull request as ready for review April 14, 2026 21:47
@smaeda-ks smaeda-ks requested review from a team and agadzik as code owners April 14, 2026 21:47
@github-actions

Copy link
Copy Markdown
Contributor

📦 CLI Tarball Ready

The Vercel CLI tarball for this PR is now available!

Quick Test

You can test this PR's CLI directly by running:

npx https://vercel-l76bssvpf.vercel.sh/tarballs/vercel.tgz --help

Use in vercel.json

To use this CLI version in your project builds, add to your vercel.json:

{
  "build": {
    "env": {
      "VERCEL_CLI_VERSION": "vercel@https://vercel-l76bssvpf.vercel.sh/tarballs/vercel.tgz"
    }
  }
}

Python Runtime Wheel

A vercel-runtime wheel was also built for this PR.
To use in your Python project builds, also set this environment variable:

VERCEL_RUNTIME_PYTHON="vercel-runtime @ https://vercel-l76bssvpf.vercel.sh/tarballs/vercel_runtime-0.13.0.dev1776203235+a051f96-py3-none-any.whl"

Python Workers Wheel

A vercel-workers wheel was also built for this PR.
To use in your Python project builds, also set this environment variable:

VERCEL_WORKERS_PYTHON="vercel-workers @ https://vercel-l76bssvpf.vercel.sh/tarballs/vercel_workers-0.1.0.dev1776203235+a051f96-py3-none-any.whl"

@github-actions

Copy link
Copy Markdown
Contributor

🧪 Unit Test Strategy

Comparing: c27eedaa051f96 (view diff)

Strategy: Code changed outside of a package - running all unit tests

⚠️ All unit tests will run because global code changes could impact all packages.

Affected packages - 15 (38%)
  1. @vercel/fs-detectors
  2. @vercel/static-build
  3. vercel
  4. @vercel/build-utils
  5. @vercel/client
  6. @vercel/firewall
  7. @vercel/go
  8. @vercel/hydrogen
  9. @vercel/next
  10. @vercel/node
  11. @vercel/python
  12. @vercel/remix-builder
  13. @vercel/ruby
  14. @vercel/rust
  15. examples
Unaffected packages - 25 (63%)
  1. @vercel-internals/get-package-json
  2. @vercel/backends
  3. @vercel/cervel
  4. @vercel/cli-auth
  5. @vercel/config
  6. @vercel/detect-agent
  7. @vercel/edge
  8. @vercel/elysia
  9. @vercel/error-utils
  10. @vercel/express
  11. @vercel/fastify
  12. @vercel/frameworks
  13. @vercel/functions
  14. @vercel/gatsby-plugin-vercel-builder
  15. @vercel/h3
  16. @vercel/hono
  17. @vercel/koa
  18. @vercel/nestjs
  19. @vercel/oidc
  20. @vercel/oidc-aws-credentials-provider
  21. @vercel/python-analysis
  22. @vercel/redwood
  23. @vercel/related-projects
  24. @vercel/routing-utils
  25. @vercel/static-config

Results

  • Unit tests: All affected packages will run unit tests
  • E2E tests: Running in parallel via E2E Tests workflow
  • Type checks: All affected packages will run type checks

This comment is automatically generated based on the affected testing strategy

@smaeda-ks smaeda-ks enabled auto-merge (squash) April 14, 2026 21:59
@vercel

vercel Bot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Low Risk — Bug fix adding defensive filter scope — restricts entrypoint filtering to api/ directory only.

  • detect-builders.ts: added fileName.startsWith('api/') condition to scope entrypoint filter
  • unit.builds-and-routes-detector.test.ts: added tests for middleware preservation in monorepo workspaces
  • fixtures/: added test fixtures for middleware and monorepo scenarios

Assessed at a051f96.

@smaeda-ks smaeda-ks disabled auto-merge April 14, 2026 22:37
@smaeda-ks smaeda-ks merged commit 0806a28 into main Apr 14, 2026
245 of 247 checks passed
@smaeda-ks smaeda-ks deleted the shohei/fix-node-filter branch April 14, 2026 23:26
gscho pushed a commit that referenced this pull request Apr 15, 2026
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @vercel/build-utils@13.16.0

### Minor Changes

- Add shared deserialization and build-result collection utilities.
([#15961](#15961))

- Add root to experimentalServices to set a service's working directory.
([#15929](#15929))

- Add a new flag to vercel deploy to let users deploy to hive
([#15892](#15892))

## vercel@51.3.0

### Minor Changes

- Add `vercel alerts inspect` to fetch a single alert group by id with
linked project, explicit `--project`, or `--all` scope.
([#15850](#15850))

- Add root to experimentalServices to set a service's working directory.
([#15929](#15929))

- Add a new flag to vercel deploy to let users deploy to hive
([#15892](#15892))

### Patch Changes

- Return 3xx responses directly in `client.fetch()` when `redirect:
'manual'` is passed, instead of entering the error/retry path.
([#15953](#15953))

- Add JSON feature flag support to the CLI so flags can be created,
updated, listed, inspected, and set with JSON variant values just like
existing boolean, string, and number kinds.
([#15741](#15741))

This aligns the CLI with the recent API and dashboard changes for `json`
flags, including parsing raw JSON inputs and preserving structured
values in output.

- Display case-insensitive feature flag rule comparisons correctly in
the CLI. ([#15743](#15743))

- Updated dependencies
\[[`86d1f5b3cbd520af2632d4a3d6a1f24557448c0e`](86d1f5b),
[`1056be976b6ba9b42cc1e2ffe895d255ab6c9850`](1056be9),
[`c27eedaa1b0e3f6e3770b578f62e5463d82f06e0`](c27eeda)]:
    -   @vercel/build-utils@13.16.0
    -   @vercel/python@6.32.0
    -   @vercel/backends@0.0.61
    -   @vercel/elysia@0.1.64
    -   @vercel/express@0.1.74
    -   @vercel/fastify@0.1.67
    -   @vercel/go@3.5.0
    -   @vercel/h3@0.1.73
    -   @vercel/hono@0.2.67
    -   @vercel/hydrogen@1.3.6
    -   @vercel/koa@0.1.47
    -   @vercel/nestjs@0.2.68
    -   @vercel/next@4.16.7
    -   @vercel/node@5.7.6
    -   @vercel/redwood@2.4.12
    -   @vercel/remix-builder@5.7.2
    -   @vercel/ruby@2.3.2
    -   @vercel/rust@1.1.0
    -   @vercel/static-build@2.9.14

## @vercel/config@0.2.0

### Minor Changes

- Add root to experimentalServices to set a service's working directory.
([#15929](#15929))

## @vercel/fs-detectors@5.17.0

### Minor Changes

- Add root to experimentalServices to set a service's working directory.
([#15929](#15929))

### Patch Changes

- fix(node): scope entrypoint filter to `api/` directory only
([#15954](#15954))

- Add actix framework preset
([#15752](#15752))

- Updated dependencies
\[[`86d1f5b3cbd520af2632d4a3d6a1f24557448c0e`](86d1f5b),
[`1056be976b6ba9b42cc1e2ffe895d255ab6c9850`](1056be9),
[`620c42ffa6d335c9a6e3e57a1e81c522696b7c2c`](620c42f),
[`c27eedaa1b0e3f6e3770b578f62e5463d82f06e0`](c27eeda)]:
    -   @vercel/build-utils@13.16.0
    -   @vercel/frameworks@3.24.1

## @vercel/python@6.32.0

### Minor Changes

- Add a new flag to vercel deploy to let users deploy to hive
([#15892](#15892))

## @vercel/backends@0.0.61

### Patch Changes

- Updated dependencies
\[[`86d1f5b3cbd520af2632d4a3d6a1f24557448c0e`](86d1f5b),
[`1056be976b6ba9b42cc1e2ffe895d255ab6c9850`](1056be9),
[`c27eedaa1b0e3f6e3770b578f62e5463d82f06e0`](c27eeda)]:
    -   @vercel/build-utils@13.16.0

## @vercel/cervel@0.0.48

### Patch Changes

-   Updated dependencies \[]:
    -   @vercel/backends@0.0.61

## @vercel/client@17.3.3

### Patch Changes

- Updated dependencies
\[[`86d1f5b3cbd520af2632d4a3d6a1f24557448c0e`](86d1f5b),
[`1056be976b6ba9b42cc1e2ffe895d255ab6c9850`](1056be9),
[`c27eedaa1b0e3f6e3770b578f62e5463d82f06e0`](c27eeda)]:
    -   @vercel/build-utils@13.16.0

## @vercel/elysia@0.1.64

### Patch Changes

-   Updated dependencies \[]:
    -   @vercel/node@5.7.6

## @vercel/express@0.1.74

### Patch Changes

-   Updated dependencies \[]:
    -   @vercel/node@5.7.6
    -   @vercel/cervel@0.0.48

## @vercel/fastify@0.1.67

### Patch Changes

-   Updated dependencies \[]:
    -   @vercel/node@5.7.6

## @vercel/frameworks@3.24.1

### Patch Changes

- Add actix framework preset
([#15752](#15752))

## @vercel/gatsby-plugin-vercel-builder@2.1.14

### Patch Changes

- Updated dependencies
\[[`86d1f5b3cbd520af2632d4a3d6a1f24557448c0e`](86d1f5b),
[`1056be976b6ba9b42cc1e2ffe895d255ab6c9850`](1056be9),
[`c27eedaa1b0e3f6e3770b578f62e5463d82f06e0`](c27eeda)]:
    -   @vercel/build-utils@13.16.0

## @vercel/h3@0.1.73

### Patch Changes

-   Updated dependencies \[]:
    -   @vercel/node@5.7.6

## @vercel/hono@0.2.67

### Patch Changes

-   Updated dependencies \[]:
    -   @vercel/node@5.7.6

## @vercel/koa@0.1.47

### Patch Changes

-   Updated dependencies \[]:
    -   @vercel/node@5.7.6

## @vercel/nestjs@0.2.68

### Patch Changes

-   Updated dependencies \[]:
    -   @vercel/node@5.7.6

## @vercel/node@5.7.6

### Patch Changes

- Updated dependencies
\[[`86d1f5b3cbd520af2632d4a3d6a1f24557448c0e`](86d1f5b),
[`1056be976b6ba9b42cc1e2ffe895d255ab6c9850`](1056be9),
[`c27eedaa1b0e3f6e3770b578f62e5463d82f06e0`](c27eeda)]:
    -   @vercel/build-utils@13.16.0

## @vercel/static-build@2.9.14

### Patch Changes

-   Updated dependencies \[]:
    -   @vercel/gatsby-plugin-vercel-builder@2.1.14

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
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.

2 participants