CARVIEW |
Select Language
HTTP/2 200
date: Wed, 23 Jul 2025 00:36:18 GMT
content-type: text/html; charset=utf-8
cache-control: no-cache
content-security-policy: default-src 'none'; base-uri 'self'; child-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/; connect-src 'self' uploads.github.com www.githubstatus.com collector.github.com raw.githubusercontent.com api.github.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com *.rel.tunnels.api.visualstudio.com wss://*.rel.tunnels.api.visualstudio.com objects-origin.githubusercontent.com copilot-proxy.githubusercontent.com proxy.individual.githubcopilot.com proxy.business.githubcopilot.com proxy.enterprise.githubcopilot.com *.actions.githubusercontent.com wss://*.actions.githubusercontent.com productionresultssa0.blob.core.windows.net/ productionresultssa1.blob.core.windows.net/ productionresultssa2.blob.core.windows.net/ productionresultssa3.blob.core.windows.net/ productionresultssa4.blob.core.windows.net/ productionresultssa5.blob.core.windows.net/ productionresultssa6.blob.core.windows.net/ productionresultssa7.blob.core.windows.net/ productionresultssa8.blob.core.windows.net/ productionresultssa9.blob.core.windows.net/ productionresultssa10.blob.core.windows.net/ productionresultssa11.blob.core.windows.net/ productionresultssa12.blob.core.windows.net/ productionresultssa13.blob.core.windows.net/ productionresultssa14.blob.core.windows.net/ productionresultssa15.blob.core.windows.net/ productionresultssa16.blob.core.windows.net/ productionresultssa17.blob.core.windows.net/ productionresultssa18.blob.core.windows.net/ productionresultssa19.blob.core.windows.net/ github-production-repository-image-32fea6.s3.amazonaws.com github-production-release-asset-2e65be.s3.amazonaws.com insights.github.com wss://alive.github.com api.githubcopilot.com api.individual.githubcopilot.com api.business.githubcopilot.com api.enterprise.githubcopilot.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com copilot-workspace.githubnext.com objects-origin.githubusercontent.com; frame-ancestors 'none'; frame-src viewscreen.githubusercontent.com notebooks.githubusercontent.com; img-src 'self' data: blob: github.githubassets.com media.githubusercontent.com camo.githubusercontent.com identicons.github.com avatars.githubusercontent.com private-avatars.githubusercontent.com github-cloud.s3.amazonaws.com objects.githubusercontent.com release-assets.githubusercontent.com secured-user-images.githubusercontent.com/ user-images.githubusercontent.com/ private-user-images.githubusercontent.com opengraph.githubassets.com copilotprodattachments.blob.core.windows.net/github-production-copilot-attachments/ github-production-user-asset-6210df.s3.amazonaws.com customer-stories-feed.github.com spotlights-feed.github.com objects-origin.githubusercontent.com *.githubusercontent.com; manifest-src 'self'; media-src github.com user-images.githubusercontent.com/ secured-user-images.githubusercontent.com/ private-user-images.githubusercontent.com github-production-user-asset-6210df.s3.amazonaws.com gist.github.com; script-src github.githubassets.com; style-src 'unsafe-inline' github.githubassets.com; upgrade-insecure-requests; worker-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/
referrer-policy: no-referrer-when-downgrade
server-timing: pull_request_layout-fragment;desc="pull_request_layout fragment";dur=388.263327,conversation_content-fragment;desc="conversation_content fragment";dur=565.825709,conversation_sidebar-fragment;desc="conversation_sidebar fragment";dur=319.907307,nginx;desc="NGINX";dur=0.78441,glb;desc="GLB";dur=100.804522
strict-transport-security: max-age=31536000; includeSubdomains; preload
vary: X-PJAX, X-PJAX-Container, Turbo-Visit, Turbo-Frame, X-Requested-With,Accept-Encoding, Accept, X-Requested-With
x-content-type-options: nosniff
x-frame-options: deny
x-voltron-version: fd8fbbc
x-xss-protection: 0
server: github.com
content-encoding: gzip
accept-ranges: bytes
set-cookie: _gh_sess=MCcaAaOJJAcJKtupEcACfwGMst96r9kwQ%2FgCK0DQFUC%2FKhvidO0jnv%2FnfCbLYUeknj3bGrE31EZ5AP3SFJF9vncAUKWPB%2BqQfNnQ58WkB5O%2FURUbd4U8eYymOh92Q5oyivXqHIKCcPayVbYE2pXFRHSkGcYQQ%2BpTp1DVQKqsJTpXvu05ty3vmf14Cq04CGDQX%2FSvFRmRzt%2Fp4FzBnEpiLlYucKyzjW7CGjsxx3Dv0SNE2zsJAOdy40ClubOR74H7cMLCmPixbmwcbxKBK17QkQ%3D%3D--bgZ75vj4DhrLLRi9--rI0g7tWanULE0%2BhFIkFPfw%3D%3D; Path=/; HttpOnly; Secure; SameSite=Lax
set-cookie: _octo=GH1.1.379403133.1753230977; Path=/; Domain=github.com; Expires=Thu, 23 Jul 2026 00:36:17 GMT; Secure; SameSite=Lax
set-cookie: logged_in=no; Path=/; Domain=github.com; Expires=Thu, 23 Jul 2026 00:36:17 GMT; HttpOnly; Secure; SameSite=Lax
x-github-request-id: A308:33F9F4:1F7D89:2C2600:68802E81
Make auto-imports more likely to be valid for the file (including JS) & project settings by andrewbranch Β· Pull Request #32684 Β· microsoft/TypeScript Β· GitHub
andrewbranch
requested review from
orta,
sandersn,
DanielRosenwasser,
weswigham,
rbuckton,
RyanCavanaugh and
sheetalkamat
August 2, 2019 17:48
Skip to content
Navigation Menu
{{ message }}
-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Make auto-imports more likely to be valid for the file (including JS) & project settings #32684
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
sheetalkamat
approved these changes
Aug 2, 2019
orta
approved these changes
Aug 2, 2019
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice work
I'm so excited for this since auto-imports in Node projects always gave me |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
You canβt perform that action at this time.
Fixes #31219
Fixes #29038
Reincarnation of #32150
The Problem
For a given combination of script kind (JS or TS), module target, module interop settings (
esModuleInterop
andallowSyntheticDefaultImports
), and exported symbol that you want to import, there are anywhere between zero and two correct-ish ways to write an import for that exported symbol. Prior to this PR,was always auto-imported as
This is never valid when either of the following are true:
Itβs also potentially undesirable, while not wrong, when all of the following are true:
esModuleInterop
orallowSyntheticDefaultImports
is trueIn this scenario, both
import x = require("./x")
andimport x from "./x"
are valid, and itβs debatable which one should be preferred.The Solution
The No-Brainer Part: Use the Default Import When Itβs The Only Valid Choice
When the module target is es2015+ and
esModuleInterop
orallowSyntheticDefaultImports
is enabled and the importing file is TypeScript, the default import is the only thing that works forexport =
. (When the importing file is JavaScript, the intent is also very likely to have a default import, even thoughconst x = require('./x')
is an option, so this logic applies to JS too.)The JavaScript Part: Use Simple Usage Heuristics
Relying heavily on compiler options to make decisions about what to do in a JavaScript file isnβt a great idea, because many users wonβt have a tsconfig/jsconfig at all, and will just be going with the defaults. Itβs highly likely that, if there are any signs of the ES module system in the file, theyβre working with a bundler that does have ES module support, and we should essentially pretend
esModuleInterop
is turned on and give them the default import.If it doesnβt look like the importing JS file is an ES module, weβll give them
const x = require("./x")
, which we didnβt support at all before this PR.Additionally, UMD imports are affected here, as JavaScript without
esModuleInterop
/allowSyntheticDefaultImports
/es2015+ module target was getting the TypeScript-specificimport x = require("./x")
. Now, if the file looks like an ES module and itβs JavaScript, it gets a namespace import (import * as x from "./x"
), and if it doesnβt look like a module it getsconst x = require("./x")
(although currently, I donβt believe that path ever gets taken since a non-module will be happy with using the UMD export as a global).The Other Part: Use More Sophisticated Heuristics
When the importing file is TypeScript and
esModuleInterop
orallowSyntheticDefaultImports
is enabled and the module target is CommonJS or AMD or UMD, bothimport x = require('./x')
andimport x from './x'
will work. The former is arguably more correct, but the latter is arguably preferable given the compiler options. After listening to differing opinions amongst the team, I decided to ignore all of them, including my own, and listen to the userβs opinion instead. We search for an existing default import thatβs being used to import anexport =
, and if we find one, we give themimport x from './x'
. If we donβt find one, we default toimport x = require('./x')
.The Part I Didnβt Do: JavaScript
require
For ES ModulesOn one hand, if weβre adding support for inserting
const x = require('./x')
for a CommonJS export in JavaScript when we think you may not be able to useimport
, you could argue that we should follow suit and also offerconst { y } = require('./x')
andconst z = require('./z').default
for named and default ESM exports, respectively. On the other hand, you could also argue that those are not a valid way to import ES modules, so weβre offering you the only thing thatβs technically correct. On the other other hand, you could argue that in todayβs ecosystem, modules that TypeScript thinks are ES modules are almost certainly actually CommonJS with interop stuff baked in, sorequire
would work and we should offer it in the name of pragmatism.I wasnβt sure what to do with this, so I left it as-is, which means in a JavaScript file you could end up taking an auto-import that gives you
const x = require('./x')
followed by one that gives youimport { y } from './y'
which is a little odd.