Skip to content

Commit 5e52b28

Browse files
authored
Support require(esm) in --module nodenext (#60761)
1 parent efe07a0 commit 5e52b28

File tree

209 files changed

+3602
-580
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

209 files changed

+3602
-580
lines changed

src/compiler/checker.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4715,7 +4715,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
47154715
if (errorNode && resolvedModule.isExternalLibraryImport && !resolutionExtensionIsTSOrJson(resolvedModule.extension)) {
47164716
errorOnImplicitAnyModule(/*isError*/ false, errorNode, currentSourceFile, mode, resolvedModule, moduleReference);
47174717
}
4718-
if (errorNode && (moduleResolutionKind === ModuleResolutionKind.Node16 || moduleResolutionKind === ModuleResolutionKind.NodeNext)) {
4718+
if (errorNode && (moduleKind === ModuleKind.Node16 || moduleKind === ModuleKind.Node18)) {
47194719
const isSyncImport = (currentSourceFile.impliedNodeFormat === ModuleKind.CommonJS && !findAncestor(location, isImportCall)) || !!findAncestor(location, isImportEqualsDeclaration);
47204720
const overrideHost = findAncestor(location, l => isImportTypeNode(l) || isExportDeclaration(l) || isImportDeclaration(l) || isJSDocImportTag(l));
47214721
// An override clause will take effect for type-only imports and import types, and allows importing the types across formats, regardless of
@@ -48082,6 +48082,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4808248082
);
4808348083
}
4808448084

48085+
if (moduleKind === ModuleKind.NodeNext && !isImportAttributes) {
48086+
return grammarErrorOnFirstToken(node, Diagnostics.Import_assertions_have_been_replaced_by_import_attributes_Use_with_instead_of_asserts);
48087+
}
48088+
4808548089
if (declaration.moduleSpecifier && getEmitSyntaxForModuleSpecifierExpression(declaration.moduleSpecifier) === ModuleKind.CommonJS) {
4808648090
return grammarErrorOnNode(
4808748091
node,

src/compiler/diagnosticMessages.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3980,6 +3980,10 @@
39803980
"category": "Error",
39813981
"code": 2879
39823982
},
3983+
"Import assertions have been replaced by import attributes. Use 'with' instead of 'asserts'.": {
3984+
"category": "Error",
3985+
"code": 2880
3986+
},
39833987

39843988
"Import declaration '{0}' is using private name '{1}'.": {
39853989
"category": "Error",
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve' or to 'es2015' or later.
2+
error TS5109: Option 'moduleResolution' must be set to 'Node16' (or left unspecified) when option 'module' is set to 'Node18'.
3+
4+
5+
!!! error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve' or to 'es2015' or later.
6+
!!! error TS5109: Option 'moduleResolution' must be set to 'Node16' (or left unspecified) when option 'module' is set to 'Node18'.
7+
==== /app/test.ts (0 errors) ====
8+
import { test } from '../lib';
9+
10+
==== /lib/package.json (0 errors) ====
11+
{
12+
"main": "./cjs/index.js"
13+
}
14+
15+
==== /lib/cjs/index.js (0 errors) ====
16+
export function test() {}
17+
18+
==== /lib/cjs/index.d.ts (0 errors) ====
19+
export function test(): void;
20+

tests/baselines/reference/bundlerDirectoryModule(module=node18,moduleresolution=bundler).trace.json

Lines changed: 827 additions & 0 deletions
Large diffs are not rendered by default.

tests/baselines/reference/bundlerDirectoryModule(module=node18,moduleresolution=nodenext).trace.json

Lines changed: 957 additions & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)