Skip to content

Actually set impliedNodeFormat in more cases #59479

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
merged 1 commit into from
Jul 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 7 additions & 10 deletions src/compiler/program.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1392,16 +1392,13 @@ export function getImpliedNodeFormatForFileWorker(
host: ModuleResolutionHost,
options: CompilerOptions,
) {
switch (getEmitModuleResolutionKind(options)) {
case ModuleResolutionKind.Node16:
case ModuleResolutionKind.NodeNext:
return fileExtensionIsOneOf(fileName, [Extension.Dmts, Extension.Mts, Extension.Mjs]) ? ModuleKind.ESNext :
fileExtensionIsOneOf(fileName, [Extension.Dcts, Extension.Cts, Extension.Cjs]) ? ModuleKind.CommonJS :
fileExtensionIsOneOf(fileName, [Extension.Dts, Extension.Ts, Extension.Tsx, Extension.Js, Extension.Jsx]) ? lookupFromPackageJson() :
undefined; // other extensions, like `json` or `tsbuildinfo`, are set as `undefined` here but they should never be fed through the transformer pipeline
default:
return undefined;
}
const moduleResolution = getEmitModuleResolutionKind(options);
const shouldLookupFromPackageJson = ModuleResolutionKind.Node16 <= moduleResolution && moduleResolution <= ModuleResolutionKind.NodeNext
|| pathContainsNodeModules(fileName);
return fileExtensionIsOneOf(fileName, [Extension.Dmts, Extension.Mts, Extension.Mjs]) ? ModuleKind.ESNext :
Copy link
Member

Choose a reason for hiding this comment

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

Not for this PR but we copy and paste the arrays passed into fileExtensionIsOneOf all over the place; makes me wonder if we'd get a speed boost by lifting these arrays into common variables.

fileExtensionIsOneOf(fileName, [Extension.Dcts, Extension.Cts, Extension.Cjs]) ? ModuleKind.CommonJS :
shouldLookupFromPackageJson && fileExtensionIsOneOf(fileName, [Extension.Dts, Extension.Ts, Extension.Tsx, Extension.Js, Extension.Jsx]) ? lookupFromPackageJson() :
undefined; // other extensions, like `json` or `tsbuildinfo`, are set as `undefined` here but they should never be fed through the transformer pipeline

function lookupFromPackageJson(): Partial<CreateSourceFileOptions> {
const state = getTemporaryModuleResolutionState(packageJsonInfoCache, host, options);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,9 @@
"File '/node_modules/pkg/index.d.ts' exists - use it as a name resolution result.",
"Resolving real path for '/node_modules/pkg/index.d.ts', result '/node_modules/pkg/index.d.ts'.",
"======== Module name 'pkg' was successfully resolved to '/node_modules/pkg/index.d.ts'. ========",
"File '/node_modules/pkg/package.json' does not exist according to earlier cached lookups.",
"File '/node_modules/package.json' does not exist.",
"File '/package.json' does not exist.",
"======== Resolving module '@typescript/lib-es5' from '/packages/main/__lib_node_modules_lookup_lib.es5.d.ts__.ts'. ========",
"Explicitly specified module resolution kind: 'Node10'.",
"Loading module '@typescript/lib-es5' from 'node_modules' folder, target file types: TypeScript, Declaration.",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
[
"Found 'package.json' at '/node_modules/conditions/package.json'.",
"File '/node_modules/conditions/package.json' exists according to earlier cached lookups.",
"======== Resolving module 'conditions' from '/main.ts'. ========",
"Explicitly specified module resolution kind: 'Bundler'.",
"Resolving in CJS mode with conditions 'import', 'types'.",
"File '/package.json' does not exist.",
"Loading module 'conditions' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.",
"Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.",
"Found 'package.json' at '/node_modules/conditions/package.json'.",
"File '/node_modules/conditions/package.json' exists according to earlier cached lookups.",
"Entering conditional exports.",
"Saw non-matching condition 'node'.",
"Matched 'exports' condition 'default'.",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
[
"Found 'package.json' at '/node_modules/conditions/package.json'.",
"File '/node_modules/conditions/package.json' exists according to earlier cached lookups.",
"======== Resolving module 'conditions' from '/main.ts'. ========",
"Explicitly specified module resolution kind: 'Bundler'.",
"Resolving in CJS mode with conditions 'import', 'types'.",
"File '/package.json' does not exist.",
"Loading module 'conditions' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.",
"Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.",
"Found 'package.json' at '/node_modules/conditions/package.json'.",
"File '/node_modules/conditions/package.json' exists according to earlier cached lookups.",
"Entering conditional exports.",
"Saw non-matching condition 'node'.",
"Matched 'exports' condition 'default'.",
Expand Down
3 changes: 2 additions & 1 deletion tests/baselines/reference/bundlerImportESM(module=esnext).js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import { esm } from "./esm.mjs";
//// [esm.mjs]
export var esm = 0;
//// [not-actually-cjs.cjs]
export {};
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//// [still-not-cjs.js]
export {};
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ error TS6504: File '/node_modules/dual/index.cjs' is a JavaScript file. Did you
error TS6504: File '/node_modules/dual/index.js' is a JavaScript file. Did you mean to enable the 'allowJs' option?
The file is in the program because:
Root file specified for compilation
/main.cts(1,15): error TS2305: Module '"dual"' has no exported member 'cjs'.
/main.cts(1,10): error TS2305: Module '"dual"' has no exported member 'esm'.
/main.mts(1,15): error TS2305: Module '"dual"' has no exported member 'cjs'.
/main.ts(1,15): error TS2305: Module '"dual"' has no exported member 'cjs'.

Expand Down Expand Up @@ -54,6 +54,6 @@ error TS6504: File '/node_modules/dual/index.js' is a JavaScript file. Did you m

==== /main.cts (1 errors) ====
import { esm, cjs } from "dual";
~~~
!!! error TS2305: Module '"dual"' has no exported member 'cjs'.
~~~
!!! error TS2305: Module '"dual"' has no exported member 'esm'.

Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,5 @@ export {};
//// [main.mjs]
export {};
//// [main.cjs]
export {};
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
[
"Found 'package.json' at '/node_modules/dual/package.json'.",
"======== Resolving module 'dual' from '/main.ts'. ========",
"Explicitly specified module resolution kind: 'Bundler'.",
"Resolving in CJS mode with conditions 'import', 'types'.",
"File '/package.json' does not exist.",
"Loading module 'dual' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.",
"Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.",
"Found 'package.json' at '/node_modules/dual/package.json'.",
"File '/node_modules/dual/package.json' exists according to earlier cached lookups.",
"Entering conditional exports.",
"Matched 'exports' condition 'import'.",
"Using 'exports' subpath '.' with target './index.js'.",
Expand All @@ -22,8 +23,23 @@
"Resolution for module 'dual' was found in cache from location '/'.",
"======== Module name 'dual' was successfully resolved to '/node_modules/dual/index.d.ts' with Package ID 'dual/index.d.ts@1.0.0'. ========",
"======== Resolving module 'dual' from '/main.cts'. ========",
"Resolution for module 'dual' was found in cache from location '/'.",
"======== Module name 'dual' was successfully resolved to '/node_modules/dual/index.d.ts' with Package ID 'dual/index.d.ts@1.0.0'. ========",
"Explicitly specified module resolution kind: 'Bundler'.",
"Resolving in CJS mode with conditions 'require', 'types'.",
"File '/package.json' does not exist according to earlier cached lookups.",
"Loading module 'dual' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.",
"Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.",
"File '/node_modules/dual/package.json' exists according to earlier cached lookups.",
"Entering conditional exports.",
"Saw non-matching condition 'import'.",
"Matched 'exports' condition 'require'.",
"Using 'exports' subpath '.' with target './index.cjs'.",
"File name '/node_modules/dual/index.cjs' has a '.cjs' extension - stripping it.",
"File '/node_modules/dual/index.cts' does not exist.",
"File '/node_modules/dual/index.d.cts' exists - use it as a name resolution result.",
"Resolved under condition 'require'.",
"Exiting conditional exports.",
"Resolving real path for '/node_modules/dual/index.d.cts', result '/node_modules/dual/index.d.cts'.",
"======== Module name 'dual' was successfully resolved to '/node_modules/dual/index.d.cts' with Package ID 'dual/index.d.cts@1.0.0'. ========",
"======== Resolving module '@typescript/lib-es5' from '/.src/__lib_node_modules_lookup_lib.es5.d.ts__.ts'. ========",
"Explicitly specified module resolution kind: 'Node10'.",
"Loading module '@typescript/lib-es5' from 'node_modules' folder, target file types: TypeScript, Declaration.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ import { esm, cjs } from "dual";

=== /main.cts ===
import { esm, cjs } from "dual";
>esm : number
> : ^^^^^^
>cjs : any
>esm : any
> : ^^^
>cjs : number
> : ^^^^^^

Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ error TS6504: File '/node_modules/dual/index.cjs' is a JavaScript file. Did you
error TS6504: File '/node_modules/dual/index.js' is a JavaScript file. Did you mean to enable the 'allowJs' option?
The file is in the program because:
Root file specified for compilation
/main.cts(1,15): error TS2305: Module '"dual"' has no exported member 'cjs'.
/main.cts(1,10): error TS2305: Module '"dual"' has no exported member 'esm'.
/main.mts(1,15): error TS2305: Module '"dual"' has no exported member 'cjs'.
/main.ts(1,15): error TS2305: Module '"dual"' has no exported member 'cjs'.

Expand Down Expand Up @@ -54,6 +54,6 @@ error TS6504: File '/node_modules/dual/index.js' is a JavaScript file. Did you m

==== /main.cts (1 errors) ====
import { esm, cjs } from "dual";
~~~
!!! error TS2305: Module '"dual"' has no exported member 'cjs'.
~~~
!!! error TS2305: Module '"dual"' has no exported member 'esm'.

Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
[
"Found 'package.json' at '/node_modules/dual/package.json'.",
"======== Resolving module 'dual' from '/main.ts'. ========",
"Explicitly specified module resolution kind: 'Bundler'.",
"Resolving in CJS mode with conditions 'import', 'types'.",
"File '/package.json' does not exist.",
"Loading module 'dual' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.",
"Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.",
"Found 'package.json' at '/node_modules/dual/package.json'.",
"File '/node_modules/dual/package.json' exists according to earlier cached lookups.",
"Entering conditional exports.",
"Matched 'exports' condition 'import'.",
"Using 'exports' subpath '.' with target './index.js'.",
Expand All @@ -22,8 +23,23 @@
"Resolution for module 'dual' was found in cache from location '/'.",
"======== Module name 'dual' was successfully resolved to '/node_modules/dual/index.d.ts' with Package ID 'dual/index.d.ts@1.0.0'. ========",
"======== Resolving module 'dual' from '/main.cts'. ========",
"Resolution for module 'dual' was found in cache from location '/'.",
"======== Module name 'dual' was successfully resolved to '/node_modules/dual/index.d.ts' with Package ID 'dual/index.d.ts@1.0.0'. ========",
"Explicitly specified module resolution kind: 'Bundler'.",
"Resolving in CJS mode with conditions 'require', 'types'.",
"File '/package.json' does not exist according to earlier cached lookups.",
"Loading module 'dual' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.",
"Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.",
"File '/node_modules/dual/package.json' exists according to earlier cached lookups.",
"Entering conditional exports.",
"Saw non-matching condition 'import'.",
"Matched 'exports' condition 'require'.",
"Using 'exports' subpath '.' with target './index.cjs'.",
"File name '/node_modules/dual/index.cjs' has a '.cjs' extension - stripping it.",
"File '/node_modules/dual/index.cts' does not exist.",
"File '/node_modules/dual/index.d.cts' exists - use it as a name resolution result.",
"Resolved under condition 'require'.",
"Exiting conditional exports.",
"Resolving real path for '/node_modules/dual/index.d.cts', result '/node_modules/dual/index.d.cts'.",
"======== Module name 'dual' was successfully resolved to '/node_modules/dual/index.d.cts' with Package ID 'dual/index.d.cts@1.0.0'. ========",
"======== Resolving module '@typescript/lib-es5' from '/.src/__lib_node_modules_lookup_lib.es5.d.ts__.ts'. ========",
"Explicitly specified module resolution kind: 'Node10'.",
"Loading module '@typescript/lib-es5' from 'node_modules' folder, target file types: TypeScript, Declaration.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ import { esm, cjs } from "dual";

=== /main.cts ===
import { esm, cjs } from "dual";
>esm : number
> : ^^^^^^
>cjs : any
>esm : any
> : ^^^
>cjs : number
> : ^^^^^^

4 changes: 4 additions & 0 deletions tests/baselines/reference/cachedModuleResolution1.trace.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
[
"File '/a/b/node_modules/package.json' does not exist.",
"File '/a/b/package.json' does not exist.",
"File '/a/package.json' does not exist.",
"File '/package.json' does not exist.",
"======== Resolving module 'foo' from '/a/b/c/d/e/app.ts'. ========",
"Explicitly specified module resolution kind: 'Node10'.",
"Loading module 'foo' from 'node_modules' folder, target file types: TypeScript, Declaration.",
Expand Down
4 changes: 4 additions & 0 deletions tests/baselines/reference/cachedModuleResolution2.trace.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
[
"File '/a/b/node_modules/package.json' does not exist.",
"File '/a/b/package.json' does not exist.",
"File '/a/package.json' does not exist.",
"File '/package.json' does not exist.",
"======== Resolving module 'foo' from '/a/b/c/lib.ts'. ========",
"Explicitly specified module resolution kind: 'Node10'.",
"Loading module 'foo' from 'node_modules' folder, target file types: TypeScript, Declaration.",
Expand Down
4 changes: 4 additions & 0 deletions tests/baselines/reference/cachedModuleResolution5.trace.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
[
"File '/a/b/node_modules/package.json' does not exist.",
"File '/a/b/package.json' does not exist.",
"File '/a/package.json' does not exist.",
"File '/package.json' does not exist.",
"======== Resolving module 'foo' from '/a/b/c/d/e/app.ts'. ========",
"Explicitly specified module resolution kind: 'Node10'.",
"Loading module 'foo' from 'node_modules' folder, target file types: TypeScript, Declaration.",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
[
"File '/node_modules/dep/dist/package.json' does not exist.",
"Found 'package.json' at '/node_modules/dep/package.json'.",
"======== Resolving module 'dep' from '/index.mts'. ========",
"Explicitly specified module resolution kind: 'Bundler'.",
"Resolving in CJS mode with conditions 'import', 'types'.",
"File '/package.json' does not exist.",
"Loading module 'dep' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.",
"Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.",
"Found 'package.json' at '/node_modules/dep/package.json'.",
"File '/node_modules/dep/package.json' exists according to earlier cached lookups.",
"Entering conditional exports.",
"Matched 'exports' condition 'import'.",
"Using 'exports' subpath '.' with target './dist/index.mjs'.",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
[
"Found 'package.json' at '/node_modules/lodash/package.json'.",
"File '/node_modules/lodash/package.json' exists according to earlier cached lookups.",
"File '/node_modules/lodash/package.json' exists according to earlier cached lookups.",
"======== Resolving module 'lodash' from '/index.ts'. ========",
"Explicitly specified module resolution kind: 'Bundler'.",
"Resolving in CJS mode with conditions 'import', 'types', 'webpack', ' browser'.",
"File '/package.json' does not exist.",
"Loading module 'lodash' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.",
"Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.",
"Found 'package.json' at '/node_modules/lodash/package.json'.",
"File '/node_modules/lodash/package.json' exists according to earlier cached lookups.",
"File '/node_modules/lodash.ts' does not exist.",
"File '/node_modules/lodash.tsx' does not exist.",
"File '/node_modules/lodash.d.ts' does not exist.",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
[
"Found 'package.json' at '/node_modules/lodash/package.json'.",
"File '/node_modules/lodash/package.json' exists according to earlier cached lookups.",
"File '/node_modules/lodash/package.json' exists according to earlier cached lookups.",
"======== Resolving module 'lodash' from '/index.ts'. ========",
"Explicitly specified module resolution kind: 'Bundler'.",
"Resolving in CJS mode with conditions 'import', 'types', 'webpack', ' browser'.",
"File '/package.json' does not exist.",
"Loading module 'lodash' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.",
"Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.",
"Found 'package.json' at '/node_modules/lodash/package.json'.",
"File '/node_modules/lodash/package.json' exists according to earlier cached lookups.",
"Entering conditional exports.",
"Saw non-matching condition 'browser'.",
"Matched 'exports' condition 'webpack'.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
"File '/node_modules/a/index.d.ts' exists - use it as a name resolution result.",
"Resolving real path for '/node_modules/a/index.d.ts', result '/node_modules/a/index.d.ts'.",
"======== Module name 'a' was successfully resolved to '/node_modules/a/index.d.ts'. ========",
"File '/node_modules/foo/package.json' exists according to earlier cached lookups.",
"======== Resolving module './index' from '/node_modules/foo/use.d.ts'. ========",
"Module resolution kind is not specified, using 'Node10'.",
"Loading module as file / folder, candidate module location '/node_modules/foo/index', target file types: TypeScript, Declaration.",
Expand All @@ -32,6 +33,10 @@
"File '/node_modules/foo/index.d.ts' exists - use it as a name resolution result.",
"File '/node_modules/foo/package.json' exists according to earlier cached lookups.",
"======== Module name './index' was successfully resolved to '/node_modules/foo/index.d.ts' with Package ID 'foo/index.d.ts@1.2.3'. ========",
"File '/node_modules/foo/package.json' exists according to earlier cached lookups.",
"File '/node_modules/a/package.json' does not exist according to earlier cached lookups.",
"File '/node_modules/package.json' does not exist.",
"File '/package.json' does not exist.",
"======== Resolving module 'foo' from '/node_modules/a/index.d.ts'. ========",
"Module resolution kind is not specified, using 'Node10'.",
"Loading module 'foo' from 'node_modules' folder, target file types: TypeScript, Declaration.",
Expand All @@ -50,6 +55,7 @@
"'package.json' does not have a 'peerDependencies' field.",
"Resolving real path for '/node_modules/a/node_modules/foo/index.d.ts', result '/node_modules/a/node_modules/foo/index.d.ts'.",
"======== Module name 'foo' was successfully resolved to '/node_modules/a/node_modules/foo/index.d.ts' with Package ID 'foo/index.d.ts@1.2.3'. ========",
"File '/node_modules/a/node_modules/foo/package.json' exists according to earlier cached lookups.",
"======== Resolving module '@typescript/lib-es5' from '/.src/__lib_node_modules_lookup_lib.es5.d.ts__.ts'. ========",
"Explicitly specified module resolution kind: 'Node10'.",
"Loading module '@typescript/lib-es5' from 'node_modules' folder, target file types: TypeScript, Declaration.",
Expand Down
Loading