Skip to content

Commit f69580f

Browse files
authored
Add --module node18 (#60722)
1 parent 4a18b5c commit f69580f

File tree

463 files changed

+31423
-529
lines changed

Some content is hidden

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

463 files changed

+31423
-529
lines changed

src/compiler/checker.ts

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -882,6 +882,7 @@ import {
882882
ModuleKind,
883883
ModuleResolutionKind,
884884
ModuleSpecifierResolutionHost,
885+
moduleSupportsImportAttributes,
885886
Mutable,
886887
MutableNodeArray,
887888
NamedDeclaration,
@@ -37631,13 +37632,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3763137632
}
3763237633

3763337634
function checkImportMetaProperty(node: MetaProperty) {
37634-
if (moduleKind === ModuleKind.Node16 || moduleKind === ModuleKind.NodeNext) {
37635+
if (ModuleKind.Node16 <= moduleKind && moduleKind <= ModuleKind.NodeNext) {
3763537636
if (getSourceFileOfNode(node).impliedNodeFormat !== ModuleKind.ESNext) {
3763637637
error(node, Diagnostics.The_import_meta_meta_property_is_not_allowed_in_files_which_will_build_into_CommonJS_output);
3763737638
}
3763837639
}
3763937640
else if (moduleKind < ModuleKind.ES2020 && moduleKind !== ModuleKind.System) {
37640-
error(node, Diagnostics.The_import_meta_meta_property_is_only_allowed_when_the_module_option_is_es2020_es2022_esnext_system_node16_or_nodenext);
37641+
error(node, Diagnostics.The_import_meta_meta_property_is_only_allowed_when_the_module_option_is_es2020_es2022_esnext_system_node16_node18_or_nodenext);
3764137642
}
3764237643
const file = getSourceFileOfNode(node);
3764337644
Debug.assert(!!(file.flags & NodeFlags.PossiblyContainsImportMeta), "Containing file is missing import meta node flag.");
@@ -39212,6 +39213,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3921239213
}
3921339214
switch (moduleKind) {
3921439215
case ModuleKind.Node16:
39216+
case ModuleKind.Node18:
3921539217
case ModuleKind.NodeNext:
3921639218
if (sourceFile.impliedNodeFormat === ModuleKind.CommonJS) {
3921739219
span ??= getSpanOfTokenAtPosition(sourceFile, node.pos);
@@ -39232,8 +39234,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3923239234
// fallthrough
3923339235
default:
3923439236
span ??= getSpanOfTokenAtPosition(sourceFile, node.pos);
39235-
const message = isAwaitExpression(node) ? Diagnostics.Top_level_await_expressions_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_node16_nodenext_or_preserve_and_the_target_option_is_set_to_es2017_or_higher :
39236-
Diagnostics.Top_level_await_using_statements_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_node16_nodenext_or_preserve_and_the_target_option_is_set_to_es2017_or_higher;
39237+
const message = isAwaitExpression(node) ? Diagnostics.Top_level_await_expressions_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_node16_node18_nodenext_or_preserve_and_the_target_option_is_set_to_es2017_or_higher :
39238+
Diagnostics.Top_level_await_using_statements_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_node16_node18_nodenext_or_preserve_and_the_target_option_is_set_to_es2017_or_higher;
3923739239
diagnostics.add(createFileDiagnostic(sourceFile, span.start, span.length, message));
3923839240
hasError = true;
3923939241
break;
@@ -48064,16 +48066,22 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4806448066
return; // Other grammar checks do not apply to type-only imports with resolution mode assertions
4806548067
}
4806648068

48067-
const mode = (moduleKind === ModuleKind.NodeNext) && declaration.moduleSpecifier && getEmitSyntaxForModuleSpecifierExpression(declaration.moduleSpecifier);
48068-
if (mode !== ModuleKind.ESNext && moduleKind !== ModuleKind.ESNext && moduleKind !== ModuleKind.Preserve) {
48069-
const message = isImportAttributes
48070-
? moduleKind === ModuleKind.NodeNext
48069+
if (!moduleSupportsImportAttributes(moduleKind)) {
48070+
return grammarErrorOnNode(
48071+
node,
48072+
isImportAttributes
48073+
? Diagnostics.Import_attributes_are_only_supported_when_the_module_option_is_set_to_esnext_node18_nodenext_or_preserve
48074+
: Diagnostics.Import_assertions_are_only_supported_when_the_module_option_is_set_to_esnext_node18_nodenext_or_preserve,
48075+
);
48076+
}
48077+
48078+
if (declaration.moduleSpecifier && getEmitSyntaxForModuleSpecifierExpression(declaration.moduleSpecifier) === ModuleKind.CommonJS) {
48079+
return grammarErrorOnNode(
48080+
node,
48081+
isImportAttributes
4807148082
? Diagnostics.Import_attributes_are_not_allowed_on_statements_that_compile_to_CommonJS_require_calls
48072-
: Diagnostics.Import_attributes_are_only_supported_when_the_module_option_is_set_to_esnext_nodenext_or_preserve
48073-
: moduleKind === ModuleKind.NodeNext
48074-
? Diagnostics.Import_assertions_are_not_allowed_on_statements_that_compile_to_CommonJS_require_calls
48075-
: Diagnostics.Import_assertions_are_only_supported_when_the_module_option_is_set_to_esnext_nodenext_or_preserve;
48076-
return grammarErrorOnNode(node, message);
48083+
: Diagnostics.Import_assertions_are_not_allowed_on_statements_that_compile_to_CommonJS_require_calls,
48084+
);
4807748085
}
4807848086

4807948087
const isTypeOnly = isJSDocImportTag(declaration) || (isImportDeclaration(declaration) ? declaration.importClause?.isTypeOnly : declaration.isTypeOnly);
@@ -48122,7 +48130,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4812248130
}
4812348131
}
4812448132

48125-
if (!importClause.isTypeOnly && moduleKind === ModuleKind.NodeNext && isOnlyImportableAsDefault(node.moduleSpecifier, resolvedModule) && !hasTypeJsonImportAttribute(node)) {
48133+
if (!importClause.isTypeOnly && ModuleKind.Node18 <= moduleKind && moduleKind <= ModuleKind.NodeNext && isOnlyImportableAsDefault(node.moduleSpecifier, resolvedModule) && !hasTypeJsonImportAttribute(node)) {
4812648134
// Import attributes/assertions are not allowed in --module node16, so don't suggest adding one
4812748135
error(node.moduleSpecifier, Diagnostics.Importing_a_JSON_file_into_an_ECMAScript_module_requires_a_type_Colon_json_import_attribute_when_module_is_set_to_0, ModuleKind[moduleKind]);
4812848136
}
@@ -52062,6 +52070,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
5206252070
}
5206352071
switch (moduleKind) {
5206452072
case ModuleKind.Node16:
52073+
case ModuleKind.Node18:
5206552074
case ModuleKind.NodeNext:
5206652075
if (sourceFile.impliedNodeFormat === ModuleKind.CommonJS) {
5206752076
diagnostics.add(
@@ -52080,7 +52089,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
5208052089
// fallthrough
5208152090
default:
5208252091
diagnostics.add(
52083-
createDiagnosticForNode(forInOrOfStatement.awaitModifier, Diagnostics.Top_level_for_await_loops_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_node16_nodenext_or_preserve_and_the_target_option_is_set_to_es2017_or_higher),
52092+
createDiagnosticForNode(forInOrOfStatement.awaitModifier, Diagnostics.Top_level_for_await_loops_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_node16_node18_nodenext_or_preserve_and_the_target_option_is_set_to_es2017_or_higher),
5208452093
);
5208552094
break;
5208652095
}
@@ -52882,21 +52891,21 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
5288252891
}
5288352892

5288452893
if (moduleKind === ModuleKind.ES2015) {
52885-
return grammarErrorOnNode(node, Diagnostics.Dynamic_imports_are_only_supported_when_the_module_flag_is_set_to_es2020_es2022_esnext_commonjs_amd_system_umd_node16_or_nodenext);
52894+
return grammarErrorOnNode(node, Diagnostics.Dynamic_imports_are_only_supported_when_the_module_flag_is_set_to_es2020_es2022_esnext_commonjs_amd_system_umd_node16_node18_or_nodenext);
5288652895
}
5288752896

5288852897
if (node.typeArguments) {
5288952898
return grammarErrorOnNode(node, Diagnostics.This_use_of_import_is_invalid_import_calls_can_be_written_but_they_must_have_parentheses_and_cannot_have_type_arguments);
5289052899
}
5289152900

5289252901
const nodeArguments = node.arguments;
52893-
if (moduleKind !== ModuleKind.ESNext && moduleKind !== ModuleKind.NodeNext && moduleKind !== ModuleKind.Node16 && moduleKind !== ModuleKind.Preserve) {
52902+
if (!(ModuleKind.Node16 <= moduleKind && moduleKind <= ModuleKind.NodeNext) && moduleKind !== ModuleKind.ESNext && moduleKind !== ModuleKind.Preserve) {
5289452903
// We are allowed trailing comma after proposal-import-assertions.
5289552904
checkGrammarForDisallowedTrailingComma(nodeArguments);
5289652905

5289752906
if (nodeArguments.length > 1) {
5289852907
const importAttributesArgument = nodeArguments[1];
52899-
return grammarErrorOnNode(importAttributesArgument, Diagnostics.Dynamic_imports_only_support_a_second_argument_when_the_module_option_is_set_to_esnext_node16_nodenext_or_preserve);
52908+
return grammarErrorOnNode(importAttributesArgument, Diagnostics.Dynamic_imports_only_support_a_second_argument_when_the_module_option_is_set_to_esnext_node16_node18_nodenext_or_preserve);
5290052909
}
5290152910
}
5290252911

src/compiler/commandLineParser.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,7 @@ export const moduleOptionDeclaration: CommandLineOptionOfCustomType = {
600600
es2022: ModuleKind.ES2022,
601601
esnext: ModuleKind.ESNext,
602602
node16: ModuleKind.Node16,
603+
node18: ModuleKind.Node18,
603604
nodenext: ModuleKind.NodeNext,
604605
preserve: ModuleKind.Preserve,
605606
})),

src/compiler/diagnosticMessages.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,11 +1028,11 @@
10281028
"category": "Error",
10291029
"code": 1322
10301030
},
1031-
"Dynamic imports are only supported when the '--module' flag is set to 'es2020', 'es2022', 'esnext', 'commonjs', 'amd', 'system', 'umd', 'node16', or 'nodenext'.": {
1031+
"Dynamic imports are only supported when the '--module' flag is set to 'es2020', 'es2022', 'esnext', 'commonjs', 'amd', 'system', 'umd', 'node16', 'node18', or 'nodenext'.": {
10321032
"category": "Error",
10331033
"code": 1323
10341034
},
1035-
"Dynamic imports only support a second argument when the '--module' option is set to 'esnext', 'node16', 'nodenext', or 'preserve'.": {
1035+
"Dynamic imports only support a second argument when the '--module' option is set to 'esnext', 'node16', 'node18', 'nodenext', or 'preserve'.": {
10361036
"category": "Error",
10371037
"code": 1324
10381038
},
@@ -1100,7 +1100,7 @@
11001100
"category": "Error",
11011101
"code": 1341
11021102
},
1103-
"The 'import.meta' meta-property is only allowed when the '--module' option is 'es2020', 'es2022', 'esnext', 'system', 'node16', or 'nodenext'.": {
1103+
"The 'import.meta' meta-property is only allowed when the '--module' option is 'es2020', 'es2022', 'esnext', 'system', 'node16', 'node18', or 'nodenext'.": {
11041104
"category": "Error",
11051105
"code": 1343
11061106
},
@@ -1220,7 +1220,7 @@
12201220
"category": "Message",
12211221
"code": 1377
12221222
},
1223-
"Top-level 'await' expressions are only allowed when the 'module' option is set to 'es2022', 'esnext', 'system', 'node16', 'nodenext', or 'preserve', and the 'target' option is set to 'es2017' or higher.": {
1223+
"Top-level 'await' expressions are only allowed when the 'module' option is set to 'es2022', 'esnext', 'system', 'node16', 'node18', 'nodenext', or 'preserve', and the 'target' option is set to 'es2017' or higher.": {
12241224
"category": "Error",
12251225
"code": 1378
12261226
},
@@ -1424,7 +1424,7 @@
14241424
"category": "Error",
14251425
"code": 1431
14261426
},
1427-
"Top-level 'for await' loops are only allowed when the 'module' option is set to 'es2022', 'esnext', 'system', 'node16', 'nodenext', or 'preserve', and the 'target' option is set to 'es2017' or higher.": {
1427+
"Top-level 'for await' loops are only allowed when the 'module' option is set to 'es2022', 'esnext', 'system', 'node16', 'node18', 'nodenext', or 'preserve', and the 'target' option is set to 'es2017' or higher.": {
14281428
"category": "Error",
14291429
"code": 1432
14301430
},
@@ -3788,15 +3788,15 @@
37883788
"category": "Error",
37893789
"code": 2820
37903790
},
3791-
"Import assertions are only supported when the '--module' option is set to 'esnext', 'nodenext', or 'preserve'.": {
3791+
"Import assertions are only supported when the '--module' option is set to 'esnext', 'node18', 'nodenext', or 'preserve'.": {
37923792
"category": "Error",
37933793
"code": 2821
37943794
},
37953795
"Import assertions cannot be used with type-only imports or exports.": {
37963796
"category": "Error",
37973797
"code": 2822
37983798
},
3799-
"Import attributes are only supported when the '--module' option is set to 'esnext', 'nodenext', or 'preserve'.": {
3799+
"Import attributes are only supported when the '--module' option is set to 'esnext', 'node18', 'nodenext', or 'preserve'.": {
38003800
"category": "Error",
38013801
"code": 2823
38023802
},
@@ -3876,7 +3876,7 @@
38763876
"category": "Error",
38773877
"code": 2853
38783878
},
3879-
"Top-level 'await using' statements are only allowed when the 'module' option is set to 'es2022', 'esnext', 'system', 'node16', 'nodenext', or 'preserve', and the 'target' option is set to 'es2017' or higher.": {
3879+
"Top-level 'await using' statements are only allowed when the 'module' option is set to 'es2022', 'esnext', 'system', 'node16', 'node18', 'nodenext', or 'preserve', and the 'target' option is set to 'es2017' or higher.": {
38803880
"category": "Error",
38813881
"code": 2854
38823882
},

src/compiler/program.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4539,7 +4539,8 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
45394539
!(ModuleResolutionKind.Node16 <= moduleResolution && moduleResolution <= ModuleResolutionKind.NodeNext)
45404540
) {
45414541
const moduleKindName = ModuleKind[moduleKind];
4542-
createOptionValueDiagnostic("moduleResolution", Diagnostics.Option_moduleResolution_must_be_set_to_0_or_left_unspecified_when_option_module_is_set_to_1, moduleKindName, moduleKindName);
4542+
const moduleResolutionName = ModuleResolutionKind[moduleKindName as any] ? moduleKindName : "Node16";
4543+
createOptionValueDiagnostic("moduleResolution", Diagnostics.Option_moduleResolution_must_be_set_to_0_or_left_unspecified_when_option_module_is_set_to_1, moduleResolutionName, moduleKindName);
45434544
}
45444545
else if (
45454546
ModuleResolutionKind[moduleResolution] &&

src/compiler/transformer.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ function getModuleTransformer(moduleKind: ModuleKind): TransformerFactory<Source
8686
case ModuleKind.ES2020:
8787
case ModuleKind.ES2015:
8888
case ModuleKind.Node16:
89+
case ModuleKind.Node18:
8990
case ModuleKind.NodeNext:
9091
case ModuleKind.CommonJS:
9192
// Wraps `transformModule` and `transformECMAScriptModule` and

src/compiler/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7545,6 +7545,7 @@ export enum ModuleKind {
75457545

75467546
// Node16+ is an amalgam of commonjs (albeit updated) and es2022+, and represents a distinct module system from es2020/esnext
75477547
Node16 = 100,
7548+
Node18 = 101,
75487549
NodeNext = 199,
75497550

75507551
// Emit as written

src/compiler/utilities.ts

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2074,7 +2074,7 @@ export function getNonAugmentationDeclaration(symbol: Symbol): Declaration | und
20742074
}
20752075

20762076
function isCommonJSContainingModuleKind(kind: ModuleKind) {
2077-
return kind === ModuleKind.CommonJS || kind === ModuleKind.Node16 || kind === ModuleKind.NodeNext;
2077+
return kind === ModuleKind.CommonJS || ModuleKind.Node16 <= kind && kind <= ModuleKind.NodeNext;
20782078
}
20792079

20802080
/** @internal */
@@ -8940,6 +8940,7 @@ const _computedOptions = createComputedCompilerOptions({
89408940
const target = compilerOptions.target === ScriptTarget.ES3 ? undefined : compilerOptions.target;
89418941
return target ??
89428942
((compilerOptions.module === ModuleKind.Node16 && ScriptTarget.ES2022) ||
8943+
(compilerOptions.module === ModuleKind.Node18 && ScriptTarget.ES2022) ||
89438944
(compilerOptions.module === ModuleKind.NodeNext && ScriptTarget.ESNext) ||
89448945
ScriptTarget.ES5);
89458946
},
@@ -8962,6 +8963,7 @@ const _computedOptions = createComputedCompilerOptions({
89628963
moduleResolution = ModuleResolutionKind.Node10;
89638964
break;
89648965
case ModuleKind.Node16:
8966+
case ModuleKind.Node18:
89658967
moduleResolution = ModuleResolutionKind.Node16;
89668968
break;
89678969
case ModuleKind.NodeNext:
@@ -8981,9 +8983,13 @@ const _computedOptions = createComputedCompilerOptions({
89818983
moduleDetection: {
89828984
dependencies: ["module", "target"],
89838985
computeValue: (compilerOptions): ModuleDetectionKind => {
8984-
return compilerOptions.moduleDetection ||
8985-
(_computedOptions.module.computeValue(compilerOptions) === ModuleKind.Node16 ||
8986-
_computedOptions.module.computeValue(compilerOptions) === ModuleKind.NodeNext ? ModuleDetectionKind.Force : ModuleDetectionKind.Auto);
8986+
if (compilerOptions.moduleDetection !== undefined) {
8987+
return compilerOptions.moduleDetection;
8988+
}
8989+
const moduleKind = _computedOptions.module.computeValue(compilerOptions);
8990+
return ModuleKind.Node16 <= moduleKind && moduleKind <= ModuleKind.NodeNext
8991+
? ModuleDetectionKind.Force
8992+
: ModuleDetectionKind.Auto;
89878993
},
89888994
},
89898995
isolatedModules: {
@@ -9000,6 +9006,7 @@ const _computedOptions = createComputedCompilerOptions({
90009006
}
90019007
switch (_computedOptions.module.computeValue(compilerOptions)) {
90029008
case ModuleKind.Node16:
9009+
case ModuleKind.Node18:
90039010
case ModuleKind.NodeNext:
90049011
case ModuleKind.Preserve:
90059012
return true;
@@ -9229,6 +9236,16 @@ export function moduleResolutionSupportsPackageJsonExportsAndImports(moduleResol
92299236
|| moduleResolution === ModuleResolutionKind.Bundler;
92309237
}
92319238

9239+
/**
9240+
* @internal
9241+
* The same set of options also support import assertions.
9242+
*/
9243+
export function moduleSupportsImportAttributes(moduleKind: ModuleKind): boolean {
9244+
return ModuleKind.Node18 <= moduleKind && moduleKind <= ModuleKind.NodeNext
9245+
|| moduleKind === ModuleKind.Preserve
9246+
|| moduleKind === ModuleKind.ESNext;
9247+
}
9248+
92329249
/** @internal */
92339250
export type StrictOptionName =
92349251
| "noImplicitAny"

src/server/protocol.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3254,6 +3254,7 @@ export const enum ModuleKind {
32543254
ES2022 = "es2022",
32553255
ESNext = "esnext",
32563256
Node16 = "node16",
3257+
Node18 = "node18",
32573258
NodeNext = "nodenext",
32583259
Preserve = "preserve",
32593260
}

0 commit comments

Comments
 (0)