Title: Subpath imports (#) fail on Windows when package.json path >= 260 chars (MAX_PATH) · Issue #62043 · nodejs/node · GitHub
Open Graph Title: Subpath imports (#) fail on Windows when package.json path >= 260 chars (MAX_PATH) · Issue #62043 · nodejs/node
X Title: Subpath imports (#) fail on Windows when package.json path >= 260 chars (MAX_PATH) · Issue #62043 · nodejs/node
Description: Version v24.12.0 Platform Microsoft Windows NT 10.0.26200.0 x64 Subsystem No response What steps will reproduce the bug? I ran into this while running pnpm dev in a project with a deep node_modules path: TypeError: Package import specifi...
Open Graph Description: Version v24.12.0 Platform Microsoft Windows NT 10.0.26200.0 x64 Subsystem No response What steps will reproduce the bug? I ran into this while running pnpm dev in a project with a deep node_modules...
X Description: Version v24.12.0 Platform Microsoft Windows NT 10.0.26200.0 x64 Subsystem No response What steps will reproduce the bug? I ran into this while running pnpm dev in a project with a deep node_modules...
Opengraph URL: https://github.com/nodejs/node/issues/62043
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Subpath imports (#) fail on Windows when package.json path \u003e= 260 chars (MAX_PATH)","articleBody":"### Version\n\nv24.12.0\n\n### Platform\n\n```text\nMicrosoft Windows NT 10.0.26200.0 x64\n```\n\n### Subsystem\n\n_No response_\n\n### What steps will reproduce the bug?\n\nI ran into this while running `pnpm dev` in a project with a deep `node_modules` path:\n\n```\nTypeError: Package import specifier \"#module-sync-enabled\" is not defined imported from\nC:\\Users\\...\\node_modules\\.pnpm\\@react-router+dev@7.13.0_...\\@react-router\\dev\\module-sync-enabled\\index.mjs\n```\n\nMinimal repro — save as `test.mjs` and run with `node test.mjs` on Windows (with `LongPathsEnabled`):\n\n```mjs\nimport fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\n// \\\\?\\ prefix bypasses MAX_PATH limit for Win32 file APIs\nconst lp = (p) =\u003e \"\\\\\\\\?\\\\\" + p;\nconst ok = (fn) =\u003e {\n\ttry { fn(); return \"OK\"; }\n\tcatch (e) { console.error(e); return \"FAIL\"; }\n};\n\nconst MAX = 259; // MAX_PATH (260) minus null terminator\nconst cwd = process.cwd();\nconst fixedLen = cwd.length + 2 + \"package.json\".length;\nconst results = {};\n\nfor (const target of [MAX, MAX + 1]) {\n\tconst dir = path.join(cwd, \"a\".repeat(target - fixedLen));\n\tconst dep = path.join(dir, \"node_modules\", \"dep\");\n\n\tfs.mkdirSync(lp(dep), { recursive: true });\n\tfs.writeFileSync(\n\t\tlp(path.join(dir, \"package.json\")),\n\t\tJSON.stringify({ imports: { \"#foo\": \"./foo.mjs\" } }),\n\t);\n\tfs.writeFileSync(lp(path.join(dir, \"foo.mjs\")), \"export default 1\\n\");\n\tfs.writeFileSync(\n\t\tlp(path.join(dep, \"package.json\")),\n\t\tJSON.stringify({ name: \"dep\", exports: { \".\": \"./index.mjs\" } }),\n\t);\n\tfs.writeFileSync(lp(path.join(dep, \"index.mjs\")), \"export default 1\\n\");\n\n\tconst { resolve } = createRequire(path.join(dir, \"_.mjs\"));\n\tresults[`${target} chars`] = {\n\t\t\"fs.access\": ok(() =\u003e fs.accessSync(lp(path.join(dir, \"package.json\")))),\n\t\t'resolve(\"dep\")': ok(() =\u003e resolve(\"dep\")),\n\t\t'resolve(\"#foo\")': ok(() =\u003e resolve(\"#foo\")),\n\t};\n\n\tfs.rmSync(lp(dir), { recursive: true, force: true });\n}\n\nconsole.table(results);\n```\n\n### How often does it reproduce? Is there a required condition?\n\nAlways reproduces when the package.json path is \u003e= 260 characters. Requires Windows with `LongPathsEnabled` set (so that other file operations work fine past MAX_PATH).\n\nCommon with deeply nested `node_modules` (e.g. pnpm `.pnpm` layout + tools that create deep directories like `.claude/worktrees`).\n\n### What is the expected behavior? Why is that the expected behavior?\n\nAll three operations should succeed at both path lengths:\n\n```\n┌───────────┬───────────┬────────────────┬─────────────────┐\n│ (index) │ fs.access │ resolve(\"dep\") │ resolve(\"#foo\") │\n├───────────┼───────────┼────────────────┼─────────────────┤\n│ 259 chars │ 'OK' │ 'OK' │ 'OK' │\n│ 260 chars │ 'OK' │ 'OK' │ 'OK' │\n└───────────┴───────────┴────────────────┴─────────────────┘\n```\n\n`LongPathsEnabled` is set and both `fs` operations and subpath exports (which also resolve through package.json) work fine past MAX_PATH.\n\n### What do you see instead?\n\n```\n┌───────────┬───────────┬────────────────┬─────────────────┐\n│ (index) │ fs.access │ resolve(\"dep\") │ resolve(\"#foo\") │\n├───────────┼───────────┼────────────────┼─────────────────┤\n│ 259 chars │ 'OK' │ 'OK' │ 'OK' │\n│ 260 chars │ 'OK' │ 'OK' │ 'FAIL' │\n└───────────┴───────────┴────────────────┴─────────────────┘\n```\n\n```\nTypeError [ERR_PACKAGE_IMPORT_NOT_DEFINED]: Package import specifier \"#foo\" is not defined imported from ...\\_.mjs\n```\n\nOnly subpath imports (#) fail. I suspect `GetPackageScopeConfig` in `src/node_modules.cc` is missing the `ToNamespacedPath` call that was added to other functions in #53294 (later refactored into `NormalizePath` in #60425).\n\n### Additional information\n\n_No response_","author":{"url":"https://github.com/wonu","@type":"Person","name":"wonu"},"datePublished":"2026-02-28T17:09:03.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/62043/node/issues/62043"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:91f4bc68-67b9-3ffe-d8c7-2c0fa8fee8ce |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | E59E:1FB069:486470:621A58:6A4C2F98 |
| html-safe-nonce | 7f86b4efadfb40dd21e5881389a4c456d1bda71873a934ccc83c457483c5f2b5 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFNTlFOjFGQjA2OTo0ODY0NzA6NjIxQTU4OjZBNEMyRjk4IiwidmlzaXRvcl9pZCI6IjQ1NjEzMjI3ODI3MjYzMDM2NDAiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | ad0ea5f65afe20c6bc9404b71b1daeaae590edb1f3ebb8e836e41fe1842c104a |
| hovercard-subject-tag | issue:4005007701 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/nodejs/node/62043/issue_layout |
| twitter:image | https://opengraph.githubassets.com/4b7ed929b5f87d6d307039ecb97cac19c35998846547ab0ac5156c8bb18f2d1b/nodejs/node/issues/62043 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/4b7ed929b5f87d6d307039ecb97cac19c35998846547ab0ac5156c8bb18f2d1b/nodejs/node/issues/62043 |
| og:image:alt | Version v24.12.0 Platform Microsoft Windows NT 10.0.26200.0 x64 Subsystem No response What steps will reproduce the bug? I ran into this while running pnpm dev in a project with a deep node_modules... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | wonu |
| hostname | github.com |
| expected-hostname | github.com |
| None | 1b6b16d04026f131a36d57e3b01d0f4d26a51800edf48bf5ed0256e0ac905511 |
| turbo-cache-control | no-preview |
| go-import | github.com/nodejs/node git https://github.com/nodejs/node.git |
| octolytics-dimension-user_id | 9950313 |
| octolytics-dimension-user_login | nodejs |
| octolytics-dimension-repository_id | 27193779 |
| octolytics-dimension-repository_nwo | nodejs/node |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 27193779 |
| octolytics-dimension-repository_network_root_nwo | nodejs/node |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 9ee13484b32cf23e15fde191da4c9aa47d41201c |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width