Simplify extension priorities and move dts to lowest priority - #34713

Closed
Wesley Wigham (weswigham) wants to merge 4 commits into
microsoft:masterfrom
weswigham:extension-priority-revamp
Closed

Simplify extension priorities and move dts to lowest priority#34713
Wesley Wigham (weswigham) wants to merge 4 commits into
microsoft:masterfrom
weswigham:extension-priority-revamp

Conversation

@weswigham

Copy link
Copy Markdown
Member

Fixes#33623

Where there are js (or json) files side-by-side with a declaration file of the same name, we now only load the .js file via wildcard. The declaration file can still be included via other means, but will no longer be implicitly included when allowJs is on. (Consequently, now if you have allowJs and declaration on and are using a wildcard matcher, repeated invocations of the compiler should now find the same set of inputs - at least via wildcard lookup.)

Technically speaking, I also removed all the extension priority groups to simplify extension priority handling - we do not appear to have any test cases this affects, but I do wonder if ranking .ts higher than .tsx is observable - in theory, it's not, since inputs are lexicographically ordered, so we'd always find the .ts before the .tsx before, anyway, so the extension priorities only had the affect of grouping declaration files with .js and .jsx files (which we now no longer wish to do).

@weswigham

Copy link
Copy Markdown
MemberAuthor

cc Ryan Cavanaugh (@RyanCavanaugh) who knows the origin story for the extension priority system and can maybe drop some knowledge as to if it still has good reason to be once .d.ts ranks lower than everything else.

@weswigham

Copy link
Copy Markdown
MemberAuthor

reping Ryan Cavanaugh (@RyanCavanaugh) again I guess

@sandersn

Copy link
Copy Markdown
Member

Sheetal Nandi (@sheetalkamat) probably has opinions too.

@sandersn

Copy link
Copy Markdown
Member

This is one of the hilarious PRs that doesn't load the reviewers list so I assigned both Sheetal Nandi (@sheetalkamat) and Ryan Cavanaugh (@RyanCavanaugh) instead of putting both in the reviewers list.

*/
export const supportedTSExtensions: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Dts];
export const supportedTSExtensionsWithJson: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Dts, Extension.Json];
export const supportedTSExtensionsWithJson: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Json, Extension.Dts];

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This isn't ideal I think...

Consider scenario::

// moduleA.tsimport{x}from"./moduleB";// moduleB.jsexportconstx=10;

When you build first time files in your program with allowJs and emitDeclarationsOnly will be:
moduleA.ts, moduleB.js
Next time they will be
moduleA.ts, moduleB.d.ts and moduleB.js since module resolution prefers up d.ts over .js

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

That's what we do today. This PR fixes that, such that the .d.ts is never preferred if the js is present, assuming allowJs is on.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

What I mean is rootFiles will be moduleA.ts and moduleB.js but final list of files will contain .d.ts since that's what module resolution will resolve to? https://github.com/microsoft/TypeScript/blob/master/src/compiler/moduleNameResolver.ts#L1096

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Hm, yeah, the order we check extensions in module resolution likely needs to match the order wildcards use. I'll look at changing it to use the same source, ideally.

@RyanCavanaugh

Copy link
Copy Markdown
Member

The root cause of .d.ts being lowest priority is that .d.ts can be a build output, and we always want to prefer build inputs to build outputs since otherwise we'd get "stuck" in a state where the developer would have to clean their outputs to get a correct fresh build. The interaction with .json in play now is obviously very subtle and we need to come up with a coherent story about what that means.

I'm pretty nervous about breaking someone's odd build setup (because let's be honest the test coverage in this area is less than great) when the associated issue here doesn't really have customer reports yet. Simplification is good but we can put this on the shelf for the time being and come back to it when we have a more concrete idea of what scenarios are being addressed.

@weswigham

Wesley Wigham (weswigham) commented Mar 10, 2020

Copy link
Copy Markdown
MemberAuthor

The interaction with .json in play now is obviously very subtle and we need to come up with a coherent story about what that means.

Not just json - jsx? with allowJs as well. (Which is actually more of a problem, imo)

@sheetalkamat

Copy link
Copy Markdown
Member

Module resolution, wild card matching are mingled.. when resolving module you want to have .d.ts at higher priority than .js because those have better info especially if those files are from some external source.. say node_modules is simplest case but people have weird module resolution setups where those might not be in node_modules So in my opinion this makes it more complicated and unless we have cleared up rules on when to prefer which extension this is going to be complicated.. I agree with Ryan Cavanaugh (@RyanCavanaugh) that this needs to be addressed when we have sufficient reports of the issue and have concrete plan and matrix of scenarios of expectations.

@sandersn

Copy link
Copy Markdown
Member

This PR hasn't seen any activity for quite a while, so I'm going to close it to keep the number of open PRs manageable. Feel free to open a fresh PR or continue the discussion here.

@microsoftMicrosoft (microsoft) locked as resolved and limited conversation to collaborators Oct 21, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Author: TeamFor Milestone BugPRs that fix a bug with a specific milestone

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

Investigate altering extension priorities for wildcard loading

6 participants

@weswigham@sandersn@RyanCavanaugh@sheetalkamat@DanielRosenwasser@typescript-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Simplify extension priorities and move dts to lowest priority - #34713

Closed
Wesley Wigham (weswigham) wants to merge 4 commits into
microsoft:masterfrom
weswigham:extension-priority-revamp
Closed

Simplify extension priorities and move dts to lowest priority#34713
Wesley Wigham (weswigham) wants to merge 4 commits into
microsoft:masterfrom
weswigham:extension-priority-revamp

Conversation

@weswigham

Copy link
Copy Markdown
Member

Fixes#33623

Where there are js (or json) files side-by-side with a declaration file of the same name, we now only load the .js file via wildcard. The declaration file can still be included via other means, but will no longer be implicitly included when allowJs is on. (Consequently, now if you have allowJs and declaration on and are using a wildcard matcher, repeated invocations of the compiler should now find the same set of inputs - at least via wildcard lookup.)

Technically speaking, I also removed all the extension priority groups to simplify extension priority handling - we do not appear to have any test cases this affects, but I do wonder if ranking .ts higher than .tsx is observable - in theory, it's not, since inputs are lexicographically ordered, so we'd always find the .ts before the .tsx before, anyway, so the extension priorities only had the affect of grouping declaration files with .js and .jsx files (which we now no longer wish to do).

@weswigham

Copy link
Copy Markdown
MemberAuthor

cc Ryan Cavanaugh (@RyanCavanaugh) who knows the origin story for the extension priority system and can maybe drop some knowledge as to if it still has good reason to be once .d.ts ranks lower than everything else.

@weswigham

Copy link
Copy Markdown
MemberAuthor

reping Ryan Cavanaugh (@RyanCavanaugh) again I guess

@sandersn

Copy link
Copy Markdown
Member

Sheetal Nandi (@sheetalkamat) probably has opinions too.

@sandersn

Copy link
Copy Markdown
Member

This is one of the hilarious PRs that doesn't load the reviewers list so I assigned both Sheetal Nandi (@sheetalkamat) and Ryan Cavanaugh (@RyanCavanaugh) instead of putting both in the reviewers list.

*/
export const supportedTSExtensions: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Dts];
export const supportedTSExtensionsWithJson: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Dts, Extension.Json];
export const supportedTSExtensionsWithJson: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Json, Extension.Dts];

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This isn't ideal I think...

Consider scenario::

// moduleA.tsimport{x}from"./moduleB";// moduleB.jsexportconstx=10;

When you build first time files in your program with allowJs and emitDeclarationsOnly will be:
moduleA.ts, moduleB.js
Next time they will be
moduleA.ts, moduleB.d.ts and moduleB.js since module resolution prefers up d.ts over .js

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

That's what we do today. This PR fixes that, such that the .d.ts is never preferred if the js is present, assuming allowJs is on.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

What I mean is rootFiles will be moduleA.ts and moduleB.js but final list of files will contain .d.ts since that's what module resolution will resolve to? https://github.com/microsoft/TypeScript/blob/master/src/compiler/moduleNameResolver.ts#L1096

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Hm, yeah, the order we check extensions in module resolution likely needs to match the order wildcards use. I'll look at changing it to use the same source, ideally.

@RyanCavanaugh

Copy link
Copy Markdown
Member

The root cause of .d.ts being lowest priority is that .d.ts can be a build output, and we always want to prefer build inputs to build outputs since otherwise we'd get "stuck" in a state where the developer would have to clean their outputs to get a correct fresh build. The interaction with .json in play now is obviously very subtle and we need to come up with a coherent story about what that means.

I'm pretty nervous about breaking someone's odd build setup (because let's be honest the test coverage in this area is less than great) when the associated issue here doesn't really have customer reports yet. Simplification is good but we can put this on the shelf for the time being and come back to it when we have a more concrete idea of what scenarios are being addressed.

@weswigham

Wesley Wigham (weswigham) commented Mar 10, 2020

Copy link
Copy Markdown
MemberAuthor

The interaction with .json in play now is obviously very subtle and we need to come up with a coherent story about what that means.

Not just json - jsx? with allowJs as well. (Which is actually more of a problem, imo)

@sheetalkamat

Copy link
Copy Markdown
Member

Module resolution, wild card matching are mingled.. when resolving module you want to have .d.ts at higher priority than .js because those have better info especially if those files are from some external source.. say node_modules is simplest case but people have weird module resolution setups where those might not be in node_modules So in my opinion this makes it more complicated and unless we have cleared up rules on when to prefer which extension this is going to be complicated.. I agree with Ryan Cavanaugh (@RyanCavanaugh) that this needs to be addressed when we have sufficient reports of the issue and have concrete plan and matrix of scenarios of expectations.

@sandersn

Copy link
Copy Markdown
Member

This PR hasn't seen any activity for quite a while, so I'm going to close it to keep the number of open PRs manageable. Feel free to open a fresh PR or continue the discussion here.

@microsoftMicrosoft (microsoft) locked as resolved and limited conversation to collaborators Oct 21, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Author: TeamFor Milestone BugPRs that fix a bug with a specific milestone

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

Investigate altering extension priorities for wildcard loading

6 participants

@weswigham@sandersn@RyanCavanaugh@sheetalkamat@DanielRosenwasser@typescript-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Simplify extension priorities and move dts to lowest priority - #34713

Closed
Wesley Wigham (weswigham) wants to merge 4 commits into
microsoft:masterfrom
weswigham:extension-priority-revamp
Closed

Simplify extension priorities and move dts to lowest priority#34713
Wesley Wigham (weswigham) wants to merge 4 commits into
microsoft:masterfrom
weswigham:extension-priority-revamp

Conversation

@weswigham

Copy link
Copy Markdown
Member

Fixes#33623

Where there are js (or json) files side-by-side with a declaration file of the same name, we now only load the .js file via wildcard. The declaration file can still be included via other means, but will no longer be implicitly included when allowJs is on. (Consequently, now if you have allowJs and declaration on and are using a wildcard matcher, repeated invocations of the compiler should now find the same set of inputs - at least via wildcard lookup.)

Technically speaking, I also removed all the extension priority groups to simplify extension priority handling - we do not appear to have any test cases this affects, but I do wonder if ranking .ts higher than .tsx is observable - in theory, it's not, since inputs are lexicographically ordered, so we'd always find the .ts before the .tsx before, anyway, so the extension priorities only had the affect of grouping declaration files with .js and .jsx files (which we now no longer wish to do).

@weswigham

Copy link
Copy Markdown
MemberAuthor

cc Ryan Cavanaugh (@RyanCavanaugh) who knows the origin story for the extension priority system and can maybe drop some knowledge as to if it still has good reason to be once .d.ts ranks lower than everything else.

@weswigham

Copy link
Copy Markdown
MemberAuthor

reping Ryan Cavanaugh (@RyanCavanaugh) again I guess

@sandersn

Copy link
Copy Markdown
Member

Sheetal Nandi (@sheetalkamat) probably has opinions too.

@sandersn

Copy link
Copy Markdown
Member

This is one of the hilarious PRs that doesn't load the reviewers list so I assigned both Sheetal Nandi (@sheetalkamat) and Ryan Cavanaugh (@RyanCavanaugh) instead of putting both in the reviewers list.

*/
export const supportedTSExtensions: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Dts];
export const supportedTSExtensionsWithJson: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Dts, Extension.Json];
export const supportedTSExtensionsWithJson: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Json, Extension.Dts];

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This isn't ideal I think...

Consider scenario::

// moduleA.tsimport{x}from"./moduleB";// moduleB.jsexportconstx=10;

When you build first time files in your program with allowJs and emitDeclarationsOnly will be:
moduleA.ts, moduleB.js
Next time they will be
moduleA.ts, moduleB.d.ts and moduleB.js since module resolution prefers up d.ts over .js

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

That's what we do today. This PR fixes that, such that the .d.ts is never preferred if the js is present, assuming allowJs is on.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

What I mean is rootFiles will be moduleA.ts and moduleB.js but final list of files will contain .d.ts since that's what module resolution will resolve to? https://github.com/microsoft/TypeScript/blob/master/src/compiler/moduleNameResolver.ts#L1096

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Hm, yeah, the order we check extensions in module resolution likely needs to match the order wildcards use. I'll look at changing it to use the same source, ideally.

@RyanCavanaugh

Copy link
Copy Markdown
Member

The root cause of .d.ts being lowest priority is that .d.ts can be a build output, and we always want to prefer build inputs to build outputs since otherwise we'd get "stuck" in a state where the developer would have to clean their outputs to get a correct fresh build. The interaction with .json in play now is obviously very subtle and we need to come up with a coherent story about what that means.

I'm pretty nervous about breaking someone's odd build setup (because let's be honest the test coverage in this area is less than great) when the associated issue here doesn't really have customer reports yet. Simplification is good but we can put this on the shelf for the time being and come back to it when we have a more concrete idea of what scenarios are being addressed.

@weswigham

Wesley Wigham (weswigham) commented Mar 10, 2020

Copy link
Copy Markdown
MemberAuthor

The interaction with .json in play now is obviously very subtle and we need to come up with a coherent story about what that means.

Not just json - jsx? with allowJs as well. (Which is actually more of a problem, imo)

@sheetalkamat

Copy link
Copy Markdown
Member

Module resolution, wild card matching are mingled.. when resolving module you want to have .d.ts at higher priority than .js because those have better info especially if those files are from some external source.. say node_modules is simplest case but people have weird module resolution setups where those might not be in node_modules So in my opinion this makes it more complicated and unless we have cleared up rules on when to prefer which extension this is going to be complicated.. I agree with Ryan Cavanaugh (@RyanCavanaugh) that this needs to be addressed when we have sufficient reports of the issue and have concrete plan and matrix of scenarios of expectations.

@sandersn

Copy link
Copy Markdown
Member

This PR hasn't seen any activity for quite a while, so I'm going to close it to keep the number of open PRs manageable. Feel free to open a fresh PR or continue the discussion here.

@microsoftMicrosoft (microsoft) locked as resolved and limited conversation to collaborators Oct 21, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Author: TeamFor Milestone BugPRs that fix a bug with a specific milestone

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

Investigate altering extension priorities for wildcard loading

6 participants

@weswigham@sandersn@RyanCavanaugh@sheetalkamat@DanielRosenwasser@typescript-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Simplify extension priorities and move dts to lowest priority - #34713

Closed
Wesley Wigham (weswigham) wants to merge 4 commits into
microsoft:masterfrom
weswigham:extension-priority-revamp
Closed

Simplify extension priorities and move dts to lowest priority#34713
Wesley Wigham (weswigham) wants to merge 4 commits into
microsoft:masterfrom
weswigham:extension-priority-revamp

Conversation

@weswigham

Copy link
Copy Markdown
Member

Fixes#33623

Where there are js (or json) files side-by-side with a declaration file of the same name, we now only load the .js file via wildcard. The declaration file can still be included via other means, but will no longer be implicitly included when allowJs is on. (Consequently, now if you have allowJs and declaration on and are using a wildcard matcher, repeated invocations of the compiler should now find the same set of inputs - at least via wildcard lookup.)

Technically speaking, I also removed all the extension priority groups to simplify extension priority handling - we do not appear to have any test cases this affects, but I do wonder if ranking .ts higher than .tsx is observable - in theory, it's not, since inputs are lexicographically ordered, so we'd always find the .ts before the .tsx before, anyway, so the extension priorities only had the affect of grouping declaration files with .js and .jsx files (which we now no longer wish to do).

@weswigham

Copy link
Copy Markdown
MemberAuthor

cc Ryan Cavanaugh (@RyanCavanaugh) who knows the origin story for the extension priority system and can maybe drop some knowledge as to if it still has good reason to be once .d.ts ranks lower than everything else.

@weswigham

Copy link
Copy Markdown
MemberAuthor

reping Ryan Cavanaugh (@RyanCavanaugh) again I guess

@sandersn

Copy link
Copy Markdown
Member

Sheetal Nandi (@sheetalkamat) probably has opinions too.

@sandersn

Copy link
Copy Markdown
Member

This is one of the hilarious PRs that doesn't load the reviewers list so I assigned both Sheetal Nandi (@sheetalkamat) and Ryan Cavanaugh (@RyanCavanaugh) instead of putting both in the reviewers list.

*/
export const supportedTSExtensions: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Dts];
export const supportedTSExtensionsWithJson: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Dts, Extension.Json];
export const supportedTSExtensionsWithJson: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Json, Extension.Dts];

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This isn't ideal I think...

Consider scenario::

// moduleA.tsimport{x}from"./moduleB";// moduleB.jsexportconstx=10;

When you build first time files in your program with allowJs and emitDeclarationsOnly will be:
moduleA.ts, moduleB.js
Next time they will be
moduleA.ts, moduleB.d.ts and moduleB.js since module resolution prefers up d.ts over .js

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

That's what we do today. This PR fixes that, such that the .d.ts is never preferred if the js is present, assuming allowJs is on.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

What I mean is rootFiles will be moduleA.ts and moduleB.js but final list of files will contain .d.ts since that's what module resolution will resolve to? https://github.com/microsoft/TypeScript/blob/master/src/compiler/moduleNameResolver.ts#L1096

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Hm, yeah, the order we check extensions in module resolution likely needs to match the order wildcards use. I'll look at changing it to use the same source, ideally.

@RyanCavanaugh

Copy link
Copy Markdown
Member

The root cause of .d.ts being lowest priority is that .d.ts can be a build output, and we always want to prefer build inputs to build outputs since otherwise we'd get "stuck" in a state where the developer would have to clean their outputs to get a correct fresh build. The interaction with .json in play now is obviously very subtle and we need to come up with a coherent story about what that means.

I'm pretty nervous about breaking someone's odd build setup (because let's be honest the test coverage in this area is less than great) when the associated issue here doesn't really have customer reports yet. Simplification is good but we can put this on the shelf for the time being and come back to it when we have a more concrete idea of what scenarios are being addressed.

@weswigham

Wesley Wigham (weswigham) commented Mar 10, 2020

Copy link
Copy Markdown
MemberAuthor

The interaction with .json in play now is obviously very subtle and we need to come up with a coherent story about what that means.

Not just json - jsx? with allowJs as well. (Which is actually more of a problem, imo)

@sheetalkamat

Copy link
Copy Markdown
Member

Module resolution, wild card matching are mingled.. when resolving module you want to have .d.ts at higher priority than .js because those have better info especially if those files are from some external source.. say node_modules is simplest case but people have weird module resolution setups where those might not be in node_modules So in my opinion this makes it more complicated and unless we have cleared up rules on when to prefer which extension this is going to be complicated.. I agree with Ryan Cavanaugh (@RyanCavanaugh) that this needs to be addressed when we have sufficient reports of the issue and have concrete plan and matrix of scenarios of expectations.

@sandersn

Copy link
Copy Markdown
Member

This PR hasn't seen any activity for quite a while, so I'm going to close it to keep the number of open PRs manageable. Feel free to open a fresh PR or continue the discussion here.

@microsoftMicrosoft (microsoft) locked as resolved and limited conversation to collaborators Oct 21, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Author: TeamFor Milestone BugPRs that fix a bug with a specific milestone

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

Investigate altering extension priorities for wildcard loading

6 participants

@weswigham@sandersn@RyanCavanaugh@sheetalkamat@DanielRosenwasser@typescript-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Simplify extension priorities and move dts to lowest priority - #34713

Closed
Wesley Wigham (weswigham) wants to merge 4 commits into
microsoft:masterfrom
weswigham:extension-priority-revamp
Closed

Simplify extension priorities and move dts to lowest priority#34713
Wesley Wigham (weswigham) wants to merge 4 commits into
microsoft:masterfrom
weswigham:extension-priority-revamp

Conversation

@weswigham

Copy link
Copy Markdown
Member

Fixes#33623

Where there are js (or json) files side-by-side with a declaration file of the same name, we now only load the .js file via wildcard. The declaration file can still be included via other means, but will no longer be implicitly included when allowJs is on. (Consequently, now if you have allowJs and declaration on and are using a wildcard matcher, repeated invocations of the compiler should now find the same set of inputs - at least via wildcard lookup.)

Technically speaking, I also removed all the extension priority groups to simplify extension priority handling - we do not appear to have any test cases this affects, but I do wonder if ranking .ts higher than .tsx is observable - in theory, it's not, since inputs are lexicographically ordered, so we'd always find the .ts before the .tsx before, anyway, so the extension priorities only had the affect of grouping declaration files with .js and .jsx files (which we now no longer wish to do).

@weswigham

Copy link
Copy Markdown
MemberAuthor

cc Ryan Cavanaugh (@RyanCavanaugh) who knows the origin story for the extension priority system and can maybe drop some knowledge as to if it still has good reason to be once .d.ts ranks lower than everything else.

@weswigham

Copy link
Copy Markdown
MemberAuthor

reping Ryan Cavanaugh (@RyanCavanaugh) again I guess

@sandersn

Copy link
Copy Markdown
Member

Sheetal Nandi (@sheetalkamat) probably has opinions too.

@sandersn

Copy link
Copy Markdown
Member

This is one of the hilarious PRs that doesn't load the reviewers list so I assigned both Sheetal Nandi (@sheetalkamat) and Ryan Cavanaugh (@RyanCavanaugh) instead of putting both in the reviewers list.

*/
export const supportedTSExtensions: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Dts];
export const supportedTSExtensionsWithJson: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Dts, Extension.Json];
export const supportedTSExtensionsWithJson: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Json, Extension.Dts];

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This isn't ideal I think...

Consider scenario::

// moduleA.tsimport{x}from"./moduleB";// moduleB.jsexportconstx=10;

When you build first time files in your program with allowJs and emitDeclarationsOnly will be:
moduleA.ts, moduleB.js
Next time they will be
moduleA.ts, moduleB.d.ts and moduleB.js since module resolution prefers up d.ts over .js

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

That's what we do today. This PR fixes that, such that the .d.ts is never preferred if the js is present, assuming allowJs is on.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

What I mean is rootFiles will be moduleA.ts and moduleB.js but final list of files will contain .d.ts since that's what module resolution will resolve to? https://github.com/microsoft/TypeScript/blob/master/src/compiler/moduleNameResolver.ts#L1096

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Hm, yeah, the order we check extensions in module resolution likely needs to match the order wildcards use. I'll look at changing it to use the same source, ideally.

@RyanCavanaugh

Copy link
Copy Markdown
Member

The root cause of .d.ts being lowest priority is that .d.ts can be a build output, and we always want to prefer build inputs to build outputs since otherwise we'd get "stuck" in a state where the developer would have to clean their outputs to get a correct fresh build. The interaction with .json in play now is obviously very subtle and we need to come up with a coherent story about what that means.

I'm pretty nervous about breaking someone's odd build setup (because let's be honest the test coverage in this area is less than great) when the associated issue here doesn't really have customer reports yet. Simplification is good but we can put this on the shelf for the time being and come back to it when we have a more concrete idea of what scenarios are being addressed.

@weswigham

Wesley Wigham (weswigham) commented Mar 10, 2020

Copy link
Copy Markdown
MemberAuthor

The interaction with .json in play now is obviously very subtle and we need to come up with a coherent story about what that means.

Not just json - jsx? with allowJs as well. (Which is actually more of a problem, imo)

@sheetalkamat

Copy link
Copy Markdown
Member

Module resolution, wild card matching are mingled.. when resolving module you want to have .d.ts at higher priority than .js because those have better info especially if those files are from some external source.. say node_modules is simplest case but people have weird module resolution setups where those might not be in node_modules So in my opinion this makes it more complicated and unless we have cleared up rules on when to prefer which extension this is going to be complicated.. I agree with Ryan Cavanaugh (@RyanCavanaugh) that this needs to be addressed when we have sufficient reports of the issue and have concrete plan and matrix of scenarios of expectations.

@sandersn

Copy link
Copy Markdown
Member

This PR hasn't seen any activity for quite a while, so I'm going to close it to keep the number of open PRs manageable. Feel free to open a fresh PR or continue the discussion here.

@microsoftMicrosoft (microsoft) locked as resolved and limited conversation to collaborators Oct 21, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Author: TeamFor Milestone BugPRs that fix a bug with a specific milestone

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

Investigate altering extension priorities for wildcard loading

6 participants

@weswigham@sandersn@RyanCavanaugh@sheetalkamat@DanielRosenwasser@typescript-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Simplify extension priorities and move dts to lowest priority - #34713

Closed
Wesley Wigham (weswigham) wants to merge 4 commits into
microsoft:masterfrom
weswigham:extension-priority-revamp
Closed

Simplify extension priorities and move dts to lowest priority#34713
Wesley Wigham (weswigham) wants to merge 4 commits into
microsoft:masterfrom
weswigham:extension-priority-revamp

Conversation

@weswigham

Copy link
Copy Markdown
Member

Fixes#33623

Where there are js (or json) files side-by-side with a declaration file of the same name, we now only load the .js file via wildcard. The declaration file can still be included via other means, but will no longer be implicitly included when allowJs is on. (Consequently, now if you have allowJs and declaration on and are using a wildcard matcher, repeated invocations of the compiler should now find the same set of inputs - at least via wildcard lookup.)

Technically speaking, I also removed all the extension priority groups to simplify extension priority handling - we do not appear to have any test cases this affects, but I do wonder if ranking .ts higher than .tsx is observable - in theory, it's not, since inputs are lexicographically ordered, so we'd always find the .ts before the .tsx before, anyway, so the extension priorities only had the affect of grouping declaration files with .js and .jsx files (which we now no longer wish to do).

@weswigham

Copy link
Copy Markdown
MemberAuthor

cc Ryan Cavanaugh (@RyanCavanaugh) who knows the origin story for the extension priority system and can maybe drop some knowledge as to if it still has good reason to be once .d.ts ranks lower than everything else.

@weswigham

Copy link
Copy Markdown
MemberAuthor

reping Ryan Cavanaugh (@RyanCavanaugh) again I guess

@sandersn

Copy link
Copy Markdown
Member

Sheetal Nandi (@sheetalkamat) probably has opinions too.

@sandersn

Copy link
Copy Markdown
Member

This is one of the hilarious PRs that doesn't load the reviewers list so I assigned both Sheetal Nandi (@sheetalkamat) and Ryan Cavanaugh (@RyanCavanaugh) instead of putting both in the reviewers list.

*/
export const supportedTSExtensions: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Dts];
export const supportedTSExtensionsWithJson: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Dts, Extension.Json];
export const supportedTSExtensionsWithJson: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Json, Extension.Dts];

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This isn't ideal I think...

Consider scenario::

// moduleA.tsimport{x}from"./moduleB";// moduleB.jsexportconstx=10;

When you build first time files in your program with allowJs and emitDeclarationsOnly will be:
moduleA.ts, moduleB.js
Next time they will be
moduleA.ts, moduleB.d.ts and moduleB.js since module resolution prefers up d.ts over .js

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

That's what we do today. This PR fixes that, such that the .d.ts is never preferred if the js is present, assuming allowJs is on.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

What I mean is rootFiles will be moduleA.ts and moduleB.js but final list of files will contain .d.ts since that's what module resolution will resolve to? https://github.com/microsoft/TypeScript/blob/master/src/compiler/moduleNameResolver.ts#L1096

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Hm, yeah, the order we check extensions in module resolution likely needs to match the order wildcards use. I'll look at changing it to use the same source, ideally.

@RyanCavanaugh

Copy link
Copy Markdown
Member

The root cause of .d.ts being lowest priority is that .d.ts can be a build output, and we always want to prefer build inputs to build outputs since otherwise we'd get "stuck" in a state where the developer would have to clean their outputs to get a correct fresh build. The interaction with .json in play now is obviously very subtle and we need to come up with a coherent story about what that means.

I'm pretty nervous about breaking someone's odd build setup (because let's be honest the test coverage in this area is less than great) when the associated issue here doesn't really have customer reports yet. Simplification is good but we can put this on the shelf for the time being and come back to it when we have a more concrete idea of what scenarios are being addressed.

@weswigham

Wesley Wigham (weswigham) commented Mar 10, 2020

Copy link
Copy Markdown
MemberAuthor

The interaction with .json in play now is obviously very subtle and we need to come up with a coherent story about what that means.

Not just json - jsx? with allowJs as well. (Which is actually more of a problem, imo)

@sheetalkamat

Copy link
Copy Markdown
Member

Module resolution, wild card matching are mingled.. when resolving module you want to have .d.ts at higher priority than .js because those have better info especially if those files are from some external source.. say node_modules is simplest case but people have weird module resolution setups where those might not be in node_modules So in my opinion this makes it more complicated and unless we have cleared up rules on when to prefer which extension this is going to be complicated.. I agree with Ryan Cavanaugh (@RyanCavanaugh) that this needs to be addressed when we have sufficient reports of the issue and have concrete plan and matrix of scenarios of expectations.

@sandersn

Copy link
Copy Markdown
Member

This PR hasn't seen any activity for quite a while, so I'm going to close it to keep the number of open PRs manageable. Feel free to open a fresh PR or continue the discussion here.

@microsoftMicrosoft (microsoft) locked as resolved and limited conversation to collaborators Oct 21, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Author: TeamFor Milestone BugPRs that fix a bug with a specific milestone

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

Investigate altering extension priorities for wildcard loading

6 participants

@weswigham@sandersn@RyanCavanaugh@sheetalkamat@DanielRosenwasser@typescript-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Simplify extension priorities and move dts to lowest priority - #34713

Closed
Wesley Wigham (weswigham) wants to merge 4 commits into
microsoft:masterfrom
weswigham:extension-priority-revamp
Closed

Simplify extension priorities and move dts to lowest priority#34713
Wesley Wigham (weswigham) wants to merge 4 commits into
microsoft:masterfrom
weswigham:extension-priority-revamp

Conversation

@weswigham

Copy link
Copy Markdown
Member

Fixes#33623

Where there are js (or json) files side-by-side with a declaration file of the same name, we now only load the .js file via wildcard. The declaration file can still be included via other means, but will no longer be implicitly included when allowJs is on. (Consequently, now if you have allowJs and declaration on and are using a wildcard matcher, repeated invocations of the compiler should now find the same set of inputs - at least via wildcard lookup.)

Technically speaking, I also removed all the extension priority groups to simplify extension priority handling - we do not appear to have any test cases this affects, but I do wonder if ranking .ts higher than .tsx is observable - in theory, it's not, since inputs are lexicographically ordered, so we'd always find the .ts before the .tsx before, anyway, so the extension priorities only had the affect of grouping declaration files with .js and .jsx files (which we now no longer wish to do).

@weswigham

Copy link
Copy Markdown
MemberAuthor

cc Ryan Cavanaugh (@RyanCavanaugh) who knows the origin story for the extension priority system and can maybe drop some knowledge as to if it still has good reason to be once .d.ts ranks lower than everything else.

@weswigham

Copy link
Copy Markdown
MemberAuthor

reping Ryan Cavanaugh (@RyanCavanaugh) again I guess

@sandersn

Copy link
Copy Markdown
Member

Sheetal Nandi (@sheetalkamat) probably has opinions too.

@sandersn

Copy link
Copy Markdown
Member

This is one of the hilarious PRs that doesn't load the reviewers list so I assigned both Sheetal Nandi (@sheetalkamat) and Ryan Cavanaugh (@RyanCavanaugh) instead of putting both in the reviewers list.

*/
export const supportedTSExtensions: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Dts];
export const supportedTSExtensionsWithJson: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Dts, Extension.Json];
export const supportedTSExtensionsWithJson: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Json, Extension.Dts];

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This isn't ideal I think...

Consider scenario::

// moduleA.tsimport{x}from"./moduleB";// moduleB.jsexportconstx=10;

When you build first time files in your program with allowJs and emitDeclarationsOnly will be:
moduleA.ts, moduleB.js
Next time they will be
moduleA.ts, moduleB.d.ts and moduleB.js since module resolution prefers up d.ts over .js

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

That's what we do today. This PR fixes that, such that the .d.ts is never preferred if the js is present, assuming allowJs is on.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

What I mean is rootFiles will be moduleA.ts and moduleB.js but final list of files will contain .d.ts since that's what module resolution will resolve to? https://github.com/microsoft/TypeScript/blob/master/src/compiler/moduleNameResolver.ts#L1096

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Hm, yeah, the order we check extensions in module resolution likely needs to match the order wildcards use. I'll look at changing it to use the same source, ideally.

@RyanCavanaugh

Copy link
Copy Markdown
Member

The root cause of .d.ts being lowest priority is that .d.ts can be a build output, and we always want to prefer build inputs to build outputs since otherwise we'd get "stuck" in a state where the developer would have to clean their outputs to get a correct fresh build. The interaction with .json in play now is obviously very subtle and we need to come up with a coherent story about what that means.

I'm pretty nervous about breaking someone's odd build setup (because let's be honest the test coverage in this area is less than great) when the associated issue here doesn't really have customer reports yet. Simplification is good but we can put this on the shelf for the time being and come back to it when we have a more concrete idea of what scenarios are being addressed.

@weswigham

Wesley Wigham (weswigham) commented Mar 10, 2020

Copy link
Copy Markdown
MemberAuthor

The interaction with .json in play now is obviously very subtle and we need to come up with a coherent story about what that means.

Not just json - jsx? with allowJs as well. (Which is actually more of a problem, imo)

@sheetalkamat

Copy link
Copy Markdown
Member

Module resolution, wild card matching are mingled.. when resolving module you want to have .d.ts at higher priority than .js because those have better info especially if those files are from some external source.. say node_modules is simplest case but people have weird module resolution setups where those might not be in node_modules So in my opinion this makes it more complicated and unless we have cleared up rules on when to prefer which extension this is going to be complicated.. I agree with Ryan Cavanaugh (@RyanCavanaugh) that this needs to be addressed when we have sufficient reports of the issue and have concrete plan and matrix of scenarios of expectations.

@sandersn

Copy link
Copy Markdown
Member

This PR hasn't seen any activity for quite a while, so I'm going to close it to keep the number of open PRs manageable. Feel free to open a fresh PR or continue the discussion here.

@microsoftMicrosoft (microsoft) locked as resolved and limited conversation to collaborators Oct 21, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Author: TeamFor Milestone BugPRs that fix a bug with a specific milestone

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

Investigate altering extension priorities for wildcard loading

6 participants

@weswigham@sandersn@RyanCavanaugh@sheetalkamat@DanielRosenwasser@typescript-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Simplify extension priorities and move dts to lowest priority - #34713

Closed
Wesley Wigham (weswigham) wants to merge 4 commits into
microsoft:masterfrom
weswigham:extension-priority-revamp
Closed

Simplify extension priorities and move dts to lowest priority#34713
Wesley Wigham (weswigham) wants to merge 4 commits into
microsoft:masterfrom
weswigham:extension-priority-revamp

Conversation

@weswigham

Copy link
Copy Markdown
Member

Fixes#33623

Where there are js (or json) files side-by-side with a declaration file of the same name, we now only load the .js file via wildcard. The declaration file can still be included via other means, but will no longer be implicitly included when allowJs is on. (Consequently, now if you have allowJs and declaration on and are using a wildcard matcher, repeated invocations of the compiler should now find the same set of inputs - at least via wildcard lookup.)

Technically speaking, I also removed all the extension priority groups to simplify extension priority handling - we do not appear to have any test cases this affects, but I do wonder if ranking .ts higher than .tsx is observable - in theory, it's not, since inputs are lexicographically ordered, so we'd always find the .ts before the .tsx before, anyway, so the extension priorities only had the affect of grouping declaration files with .js and .jsx files (which we now no longer wish to do).

@weswigham

Copy link
Copy Markdown
MemberAuthor

cc Ryan Cavanaugh (@RyanCavanaugh) who knows the origin story for the extension priority system and can maybe drop some knowledge as to if it still has good reason to be once .d.ts ranks lower than everything else.

@weswigham

Copy link
Copy Markdown
MemberAuthor

reping Ryan Cavanaugh (@RyanCavanaugh) again I guess

@sandersn

Copy link
Copy Markdown
Member

Sheetal Nandi (@sheetalkamat) probably has opinions too.

@sandersn

Copy link
Copy Markdown
Member

This is one of the hilarious PRs that doesn't load the reviewers list so I assigned both Sheetal Nandi (@sheetalkamat) and Ryan Cavanaugh (@RyanCavanaugh) instead of putting both in the reviewers list.

*/
export const supportedTSExtensions: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Dts];
export const supportedTSExtensionsWithJson: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Dts, Extension.Json];
export const supportedTSExtensionsWithJson: readonly Extension[] = [Extension.Ts, Extension.Tsx, Extension.Json, Extension.Dts];

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This isn't ideal I think...

Consider scenario::

// moduleA.tsimport{x}from"./moduleB";// moduleB.jsexportconstx=10;

When you build first time files in your program with allowJs and emitDeclarationsOnly will be:
moduleA.ts, moduleB.js
Next time they will be
moduleA.ts, moduleB.d.ts and moduleB.js since module resolution prefers up d.ts over .js

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

That's what we do today. This PR fixes that, such that the .d.ts is never preferred if the js is present, assuming allowJs is on.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

What I mean is rootFiles will be moduleA.ts and moduleB.js but final list of files will contain .d.ts since that's what module resolution will resolve to? https://github.com/microsoft/TypeScript/blob/master/src/compiler/moduleNameResolver.ts#L1096

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Hm, yeah, the order we check extensions in module resolution likely needs to match the order wildcards use. I'll look at changing it to use the same source, ideally.

@RyanCavanaugh

Copy link
Copy Markdown
Member

The root cause of .d.ts being lowest priority is that .d.ts can be a build output, and we always want to prefer build inputs to build outputs since otherwise we'd get "stuck" in a state where the developer would have to clean their outputs to get a correct fresh build. The interaction with .json in play now is obviously very subtle and we need to come up with a coherent story about what that means.

I'm pretty nervous about breaking someone's odd build setup (because let's be honest the test coverage in this area is less than great) when the associated issue here doesn't really have customer reports yet. Simplification is good but we can put this on the shelf for the time being and come back to it when we have a more concrete idea of what scenarios are being addressed.

@weswigham

Wesley Wigham (weswigham) commented Mar 10, 2020

Copy link
Copy Markdown
MemberAuthor

The interaction with .json in play now is obviously very subtle and we need to come up with a coherent story about what that means.

Not just json - jsx? with allowJs as well. (Which is actually more of a problem, imo)

@sheetalkamat

Copy link
Copy Markdown
Member

Module resolution, wild card matching are mingled.. when resolving module you want to have .d.ts at higher priority than .js because those have better info especially if those files are from some external source.. say node_modules is simplest case but people have weird module resolution setups where those might not be in node_modules So in my opinion this makes it more complicated and unless we have cleared up rules on when to prefer which extension this is going to be complicated.. I agree with Ryan Cavanaugh (@RyanCavanaugh) that this needs to be addressed when we have sufficient reports of the issue and have concrete plan and matrix of scenarios of expectations.

@sandersn

Copy link
Copy Markdown
Member

This PR hasn't seen any activity for quite a while, so I'm going to close it to keep the number of open PRs manageable. Feel free to open a fresh PR or continue the discussion here.

@microsoftMicrosoft (microsoft) locked as resolved and limited conversation to collaborators Oct 21, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Author: TeamFor Milestone BugPRs that fix a bug with a specific milestone

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

Investigate altering extension priorities for wildcard loading

6 participants

@weswigham@sandersn@RyanCavanaugh@sheetalkamat@DanielRosenwasser@typescript-bot