Skip to content

Commit e635bb9

Browse files
authored
Allow --module bundler --moduleResolution commonjs (#62320)
1 parent 261630d commit e635bb9

23 files changed

+181
-241
lines changed

src/compiler/diagnosticMessages.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4661,7 +4661,7 @@
46614661
"category": "Error",
46624662
"code": 5094
46634663
},
4664-
"Option '{0}' can only be used when 'module' is set to 'preserve' or to 'es2015' or later.": {
4664+
"Option '{0}' can only be used when 'module' is set to 'preserve', 'commonjs', or 'es2015' or later.": {
46654665
"category": "Error",
46664666
"code": 5095
46674667
},

src/compiler/program.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4371,8 +4371,8 @@ export function createProgram(_rootNamesOrOptions: readonly string[] | CreatePro
43714371
createDiagnosticForOptionName(Diagnostics.Option_0_can_only_be_used_when_moduleResolution_is_set_to_node16_nodenext_or_bundler, "customConditions");
43724372
}
43734373

4374-
if (moduleResolution === ModuleResolutionKind.Bundler && !emitModuleKindIsNonNodeESM(moduleKind) && moduleKind !== ModuleKind.Preserve) {
4375-
createOptionValueDiagnostic("moduleResolution", Diagnostics.Option_0_can_only_be_used_when_module_is_set_to_preserve_or_to_es2015_or_later, "bundler");
4374+
if (moduleResolution === ModuleResolutionKind.Bundler && !emitModuleKindIsNonNodeESM(moduleKind) && moduleKind !== ModuleKind.Preserve && moduleKind !== ModuleKind.CommonJS) {
4375+
createOptionValueDiagnostic("moduleResolution", Diagnostics.Option_0_can_only_be_used_when_module_is_set_to_preserve_commonjs_or_es2015_or_later, "bundler");
43764376
}
43774377

43784378
if (

tests/baselines/reference/allowImportingTsExtensions(moduleresolution=bundler).errors.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve' or to 'es2015' or later.
21
/c.ts(1,16): error TS2307: Cannot find module './thisfiledoesnotexist.ts' or its corresponding type declarations.
32

43

5-
!!! error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve' or to 'es2015' or later.
64
==== /ts.ts (0 errors) ====
75
export {};
86

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/real-imports.mts(1,19): error TS2307: Cannot find module 'pkg' or its corresponding type declarations.
2+
3+
4+
==== /node_modules/pkg/package.json (0 errors) ====
5+
{
6+
"name": "pkg",
7+
"version": "1.0.0",
8+
"type": "commonjs",
9+
"exports": {
10+
"require": "./index.js"
11+
}
12+
}
13+
14+
==== /node_modules/pkg/index.d.ts (0 errors) ====
15+
export declare const x: number;
16+
17+
==== /package.json (0 errors) ====
18+
{
19+
"": "type module is ignored in --module commonjs",
20+
"type": "module"
21+
}
22+
23+
==== /requires.ts (0 errors) ====
24+
import pkg = require("pkg");
25+
pkg.x;
26+
27+
==== /imports.ts (0 errors) ====
28+
import { x } from "pkg";
29+
x;
30+
31+
==== /real-imports.mts (1 errors) ====
32+
import { x } from "pkg"; // Error
33+
~~~~~
34+
!!! error TS2307: Cannot find module 'pkg' or its corresponding type declarations.
35+
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//// [tests/cases/conformance/moduleResolution/bundler/bundlerCommonJS.ts] ////
2+
3+
//// [package.json]
4+
{
5+
"name": "pkg",
6+
"version": "1.0.0",
7+
"type": "commonjs",
8+
"exports": {
9+
"require": "./index.js"
10+
}
11+
}
12+
13+
//// [index.d.ts]
14+
export declare const x: number;
15+
16+
//// [package.json]
17+
{
18+
"": "type module is ignored in --module commonjs",
19+
"type": "module"
20+
}
21+
22+
//// [requires.ts]
23+
import pkg = require("pkg");
24+
pkg.x;
25+
26+
//// [imports.ts]
27+
import { x } from "pkg";
28+
x;
29+
30+
//// [real-imports.mts]
31+
import { x } from "pkg"; // Error
32+
33+
34+
//// [requires.js]
35+
"use strict";
36+
Object.defineProperty(exports, "__esModule", { value: true });
37+
var pkg = require("pkg");
38+
pkg.x;
39+
//// [imports.js]
40+
"use strict";
41+
Object.defineProperty(exports, "__esModule", { value: true });
42+
var pkg_1 = require("pkg");
43+
pkg_1.x;
44+
//// [real-imports.mjs]
45+
export {};
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
[
2+
"Found 'package.json' at '/node_modules/pkg/package.json'.",
3+
"======== Resolving module 'pkg' from '/requires.ts'. ========",
4+
"Explicitly specified module resolution kind: 'Bundler'.",
5+
"Resolving in CJS mode with conditions 'require', 'types'.",
6+
"Found 'package.json' at '/package.json'.",
7+
"Loading module 'pkg' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.",
8+
"Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.",
9+
"File '/node_modules/pkg/package.json' exists according to earlier cached lookups.",
10+
"Entering conditional exports.",
11+
"Matched 'exports' condition 'require'.",
12+
"Using 'exports' subpath '.' with target './index.js'.",
13+
"File name '/node_modules/pkg/index.js' has a '.js' extension - stripping it.",
14+
"File '/node_modules/pkg/index.ts' does not exist.",
15+
"File '/node_modules/pkg/index.tsx' does not exist.",
16+
"File '/node_modules/pkg/index.d.ts' exists - use it as a name resolution result.",
17+
"'package.json' does not have a 'peerDependencies' field.",
18+
"Resolved under condition 'require'.",
19+
"Exiting conditional exports.",
20+
"Resolving real path for '/node_modules/pkg/index.d.ts', result '/node_modules/pkg/index.d.ts'.",
21+
"======== Module name 'pkg' was successfully resolved to '/node_modules/pkg/index.d.ts' with Package ID 'pkg/[email protected]'. ========",
22+
"======== Resolving module 'pkg' from '/imports.ts'. ========",
23+
"Resolution for module 'pkg' was found in cache from location '/'.",
24+
"======== Module name 'pkg' was successfully resolved to '/node_modules/pkg/index.d.ts' with Package ID 'pkg/[email protected]'. ========",
25+
"======== Resolving module 'pkg' from '/real-imports.mts'. ========",
26+
"Explicitly specified module resolution kind: 'Bundler'.",
27+
"Resolving in CJS mode with conditions 'import', 'types'.",
28+
"File '/package.json' exists according to earlier cached lookups.",
29+
"Loading module 'pkg' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.",
30+
"Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.",
31+
"File '/node_modules/pkg/package.json' exists according to earlier cached lookups.",
32+
"Entering conditional exports.",
33+
"Saw non-matching condition 'require'.",
34+
"Exiting conditional exports.",
35+
"Directory '/node_modules/@types' does not exist, skipping all lookups in it.",
36+
"Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.",
37+
"File '/node_modules/pkg/package.json' exists according to earlier cached lookups.",
38+
"Entering conditional exports.",
39+
"Saw non-matching condition 'require'.",
40+
"Exiting conditional exports.",
41+
"======== Module name 'pkg' was not resolved. ========"
42+
]

tests/baselines/reference/bundlerDirectoryModule(module=node18,moduleresolution=bundler).errors.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve' or to 'es2015' or later.
1+
error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve', 'commonjs', or 'es2015' or later.
22
error TS5109: Option 'moduleResolution' must be set to 'Node16' (or left unspecified) when option 'module' is set to 'Node18'.
33

44

5-
!!! error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve' or to 'es2015' or later.
5+
!!! error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve', 'commonjs', or 'es2015' or later.
66
!!! error TS5109: Option 'moduleResolution' must be set to 'Node16' (or left unspecified) when option 'module' is set to 'Node18'.
77
==== /app/test.ts (0 errors) ====
88
import { test } from '../lib';

tests/baselines/reference/bundlerDirectoryModule(module=node20,moduleresolution=bundler).errors.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve' or to 'es2015' or later.
1+
error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve', 'commonjs', or 'es2015' or later.
22
error TS5109: Option 'moduleResolution' must be set to 'Node16' (or left unspecified) when option 'module' is set to 'Node20'.
33

44

5-
!!! error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve' or to 'es2015' or later.
5+
!!! error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve', 'commonjs', or 'es2015' or later.
66
!!! error TS5109: Option 'moduleResolution' must be set to 'Node16' (or left unspecified) when option 'module' is set to 'Node20'.
77
==== /app/test.ts (0 errors) ====
88
import { test } from '../lib';

tests/baselines/reference/bundlerDirectoryModule(module=nodenext,moduleresolution=bundler).errors.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve' or to 'es2015' or later.
1+
error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve', 'commonjs', or 'es2015' or later.
22
error TS5109: Option 'moduleResolution' must be set to 'NodeNext' (or left unspecified) when option 'module' is set to 'NodeNext'.
33

44

5-
!!! error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve' or to 'es2015' or later.
5+
!!! error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve', 'commonjs', or 'es2015' or later.
66
!!! error TS5109: Option 'moduleResolution' must be set to 'NodeNext' (or left unspecified) when option 'module' is set to 'NodeNext'.
77
==== /app/test.ts (0 errors) ====
88
import { test } from '../lib';

tests/baselines/reference/bundlerOptionsCompat.errors.txt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
1-
/tsconfig.json(4,25): error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve' or to 'es2015' or later.
1+
/tsconfig.json(4,25): error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve', 'commonjs', or 'es2015' or later.
2+
/tsconfig.json(4,25): error TS5109: Option 'moduleResolution' must be set to 'NodeNext' (or left unspecified) when option 'module' is set to 'NodeNext'.
23

34

4-
==== /tsconfig.json (1 errors) ====
5+
==== /tsconfig.json (2 errors) ====
56
{
67
"compilerOptions": {
7-
"module": "commonjs",
8+
"module": "nodenext",
89
"moduleResolution": "bundler",
910
~~~~~~~~~
10-
!!! error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve' or to 'es2015' or later.
11+
!!! error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve', 'commonjs', or 'es2015' or later.
12+
~~~~~~~~~
13+
!!! error TS5109: Option 'moduleResolution' must be set to 'NodeNext' (or left unspecified) when option 'module' is set to 'NodeNext'.
1114
"noEmit": true
1215
}
1316
}

0 commit comments

Comments
 (0)