fix(compiler-sfc): add resolution trying for .mts/.cts files#14402
fix(compiler-sfc): add resolution trying for .mts/.cts files#14402edison1105 merged 6 commits intovuejs:mainfrom
.mts/.cts files#14402Conversation
📝 WalkthroughWalkthroughDetects module type from filename suffix and expands TypeScript resolution candidates: adds Changes
Sequence Diagram(s)(omitted) Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
🧪 Generate unit tests (beta)
No actionable comments were generated in the recent review. 🎉 Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 0
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
packages/compiler-sfc/src/script/resolveType.ts (1)
988-1011:⚠️ Potential issue | 🟠 MajorExtensionless imports won't resolve
.mts/.ctsfiles.When
moduleTypeisu(unknown, as with extensionless imports like./foo), the code skips the.mts/.d.mtsand.cts/.d.ctsresolution branches and goes directly to trying.ts/.tsx/.d.ts. This meansfoo.mtsandfoo.ctswill never be found for extensionless imports, breaking TypeScript's ESM/CJS module-kind-by-extension detection.Add fallback resolution for
.mts/.d.mtsand.cts/.d.ctswhenmoduleType === 'u'(and consider.mtsx/.ctsxJSX variants for consistency with the existing.tsxfallback):🛠️ Proposed fix
return ( tryResolve(filename) || (moduleType === 'm' && (tryResolve(filename + `.mts`) || tryResolve(filename + `.d.mts`))) || (moduleType === 'c' && (tryResolve(filename + `.cts`) || tryResolve(filename + `.d.cts`))) || + (moduleType === 'u' && + (tryResolve(filename + `.mts`) || + tryResolve(filename + `.mtsx`) || + tryResolve(filename + `.d.mts`) || + tryResolve(filename + `.cts`) || + tryResolve(filename + `.ctsx`) || + tryResolve(filename + `.d.cts`))) || tryResolve(filename + `.ts`) || tryResolve(filename + `.tsx`) || tryResolve(filename + `.d.ts`) ||
|
Could you please add a test case? |
Size ReportBundles
Usages
|
|
Test case has been added @edison1105 . |
|
Thanks for the PR. However, there are some issues with the resolution order. For example, when both node -e "
const ts = require('typescript');
const files = {
'/foo.d.ts': 'export type X = number;',
'/foo.d.mts': 'export type X = string;',
};
const host = {
fileExists: (f) => f in files,
readFile: (f) => files[f] || '',
directoryExists: () => true,
getDirectories: () => [],
realpath: (f) => f,
};
const result = ts.resolveModuleName(
'./foo.mjs',
'/test.mts',
{ moduleResolution: ts.ModuleResolutionKind.NodeNext },
host
);
console.log('TS NodeNext resolves ./foo.mjs to:', result.resolvedModule?.resolvedFileName); // foo.d.mts
" |
@vue/compiler-core
@vue/compiler-dom
@vue/compiler-sfc
@vue/compiler-ssr
@vue/reactivity
@vue/runtime-core
@vue/runtime-dom
@vue/server-renderer
@vue/shared
vue
@vue/compat
commit: |
|
/ecosystem-ci run |
|
📝 Ran ecosystem CI: Open
|
Closes vuejs/router#2611
Summary by CodeRabbit
Bug Fixes
Tests