Skip to content

Fix getCodeFrame resolution for watchFolder source files#1710

Open
motiz88 wants to merge 5 commits into
facebook:mainfrom
motiz88:export-D104259454
Open

Fix getCodeFrame resolution for watchFolder source files#1710
motiz88 wants to merge 5 commits into
facebook:mainfrom
motiz88:export-D104259454

Conversation

@motiz88
Copy link
Copy Markdown
Contributor

@motiz88 motiz88 commented May 11, 2026

Summary:
The getCodeFrame helper in the symbolicate handler resolves stack frame file paths against projectRoot only. When source maps use SourcePathsMode.ServerUrl, the file field may be a server-relative URL pathname (e.g. /src/App.js) or a virtual-prefix path (e.g. /[metro-watchFolders]/0/foo.js). These resolve incorrectly against projectRoot.

Here, we check path.isAbsolute(file) first (for SourcePathsMode.Absolute source maps), then try filePathOfUrlDecodedPathname (for virtual-prefix paths), and fall back to the original path.resolve(projectRoot, file).

Changelog: Internal

Reviewed By: huntie

Differential Revision: D104259454

@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label May 11, 2026
@meta-codesync
Copy link
Copy Markdown
Contributor

meta-codesync Bot commented May 11, 2026

@motiz88 has exported this pull request. If you are a Meta employee, you can view the originating Diff in D104259454.

@meta-codesync meta-codesync Bot changed the title Fix getCodeFrame resolution for watchFolder source files Fix getCodeFrame resolution for watchFolder source files (#1710) May 11, 2026
@motiz88 motiz88 force-pushed the export-D104259454 branch from 63bbf56 to 2c7e8e7 Compare May 11, 2026 13:22
motiz88 added a commit to motiz88/metro that referenced this pull request May 11, 2026
Summary:

The `getCodeFrame` helper in the symbolicate handler resolves stack frame file paths against `projectRoot` only. When source maps use `SourcePathsMode.ServerUrl`, the `file` field may be a server-relative URL pathname (e.g. `/src/App.js`) or a virtual-prefix path (e.g. `/[metro-watchFolders]/0/foo.js`). These resolve incorrectly against `projectRoot`.

Here, we check `path.isAbsolute(file)` first (for `SourcePathsMode.Absolute` source maps), then try `filePathOfUrlDecodedPathname` (for virtual-prefix paths), and fall back to the original `path.resolve(projectRoot, file)`.

Changelog: Internal

Differential Revision: D104259454
motiz88 added a commit to motiz88/metro that referenced this pull request May 11, 2026
Summary:

The `getCodeFrame` helper in the symbolicate handler resolves stack frame file paths against `projectRoot` only. When source maps use `SourcePathsMode.ServerUrl`, the `file` field may be a server-relative URL pathname (e.g. `/src/App.js`) or a virtual-prefix path (e.g. `/[metro-watchFolders]/0/foo.js`). These resolve incorrectly against `projectRoot`.

Here, we check `path.isAbsolute(file)` first (for `SourcePathsMode.Absolute` source maps), then try `filePathOfUrlDecodedPathname` (for virtual-prefix paths), and fall back to the original `path.resolve(projectRoot, file)`.

Changelog: Internal

Reviewed By: huntie

Differential Revision: D104259454
@motiz88 motiz88 force-pushed the export-D104259454 branch from 2c7e8e7 to e89294f Compare May 11, 2026 13:32
motiz88 added a commit to motiz88/metro that referenced this pull request May 11, 2026
Summary:

The `getCodeFrame` helper in the symbolicate handler resolves stack frame file paths against `projectRoot` only. When source maps use `SourcePathsMode.ServerUrl`, the `file` field may be a server-relative URL pathname (e.g. `/src/App.js`) or a virtual-prefix path (e.g. `/[metro-watchFolders]/0/foo.js`). These resolve incorrectly against `projectRoot`.

Here, we check `path.isAbsolute(file)` first (for `SourcePathsMode.Absolute` source maps), then try `filePathOfUrlDecodedPathname` (for virtual-prefix paths), and fall back to the original `path.resolve(projectRoot, file)`.

Changelog: Internal

Reviewed By: huntie

Differential Revision: D104259454
@motiz88 motiz88 force-pushed the export-D104259454 branch from e89294f to 1d1bcb0 Compare May 11, 2026 14:12
@meta-codesync meta-codesync Bot changed the title Fix getCodeFrame resolution for watchFolder source files (#1710) Fix getCodeFrame resolution for watchFolder source files May 11, 2026
@motiz88 motiz88 force-pushed the export-D104259454 branch from 1d1bcb0 to f3b20fc Compare May 11, 2026 15:17
motiz88 added 5 commits May 11, 2026 08:32
Summary:
Adds integration tests for `[metro-project]` and `[metro-watchFolders]` virtual URL prefixes: bundle requests, out-of-bounds index 404, and asset serving.

Removes Server unit tests that tested private methods (`_resolveWatchFolderPrefix`, `_getEntryPointAbsolutePath`) directly. The behaviours they covered are now tested end-to-end by the new integration tests and will also be covered by `ProjectRouteMap` unit tests in the next diff.

All tests pass without any production code changes.

Reviewed By: huntie

Differential Revision: D104259281
…acebook#1707)

Summary:

Extracts a `ProjectRouteMap` class from `Server`, centralising the `[metro-watchFolders]` and `[metro-project]` virtual prefix resolution previously spread across `_resolveWatchFolderPrefix`, `_sourceRequestRoutingMap`, and `_getModuleSourceUrl`.

`ProjectRouteMap` provides:
- `filePathOfUrlDecodedPathname`: resolves `[metro-project]/...` and `[metro-watchFolders]/N/...` prefixed pathnames to absolute file paths. Returns null for non-prefixed paths or invalid indices.
- `urlPathnameOfFilePath`: maps an absolute file path to the corresponding prefixed URL pathname.

Server now delegates to `ProjectRouteMap` from `_resolveRelativePath`, `_getEntryPointAbsolutePath`, `_getModuleSourceUrl`, and source file serving.

No behavioural change is intended here, but this does incidentally fix a Windows bug that was affecting the original implementation.

Changelog:

* **[Fix]:** Fix `/[metro-project]/` and `/[metro-watchFolders]/` bundle serving on Windows.

Reviewed By: huntie

Differential Revision: D104223068
Summary:
D102004228 added `[metro-project]`/`[metro-watchFolders]` virtual URL pathname resolution to `_getEntryPointAbsolutePath`, but this method doesn't take URL pathnames - it takes actual filesystem paths (ultimately from Metro's API / CLI).

The fix removes virtual prefix resolution from `_getEntryPointAbsolutePath`, making it a plain `path.resolve(serverRootDir, entryFile)` call, consistent with `buildGraph` which already treats the entry file as a plain disk path.

Changelog:

* **[Fix]:** Remove erroneous `[metro-project]` and `[metro-watchFolders]` resolution from API and CLI

Reviewed By: huntie

Differential Revision: D104415558
Summary:
D102004228 added support for serving bundles from `Server` with the handling `[metro-watchFolders]/<N>/...` or `[metro-project]/...` virtual URL prefixes, but did not add the same support in `HmrServer`.

Here, `HmrServer` constructs its own `ProjectRouteMap` to match `Server`'s behaviour exactly.

Changelog:

* **[Fix]:** Prevent HMR crash on `[metro-watchFolders]` or `[metro-project]` URLs

Reviewed By: huntie

Differential Revision: D104223071
Summary:
The `getCodeFrame` helper in the symbolicate handler resolves stack frame file paths against `projectRoot` only. When source maps use `SourcePathsMode.ServerUrl`, the `file` field may be a server-relative URL pathname (e.g. `/src/App.js`) or a virtual-prefix path (e.g. `/[metro-watchFolders]/0/foo.js`). These resolve incorrectly against `projectRoot`.

Here, we check `path.isAbsolute(file)` first (for `SourcePathsMode.Absolute` source maps), then try `filePathOfUrlDecodedPathname` (for virtual-prefix paths), and fall back to the original `path.resolve(projectRoot, file)`.

Changelog: Internal

Reviewed By: huntie

Differential Revision: D104259454
@motiz88 motiz88 force-pushed the export-D104259454 branch from f3b20fc to 29e3d73 Compare May 11, 2026 15:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. fb-exported meta-exported

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant