diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 146bbc540b006..2ca07e30f287b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -51097,6 +51097,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { // fallthrough case ModuleKind.ES2022: case ModuleKind.ESNext: + case ModuleKind.Preserve: case ModuleKind.System: if (languageVersion >= ScriptTarget.ES2017) { break; diff --git a/tests/baselines/reference/modulePreserveTopLevelAwait1(target=es2016).errors.txt b/tests/baselines/reference/modulePreserveTopLevelAwait1(target=es2016).errors.txt new file mode 100644 index 0000000000000..2e1dbfa53b9c9 --- /dev/null +++ b/tests/baselines/reference/modulePreserveTopLevelAwait1(target=es2016).errors.txt @@ -0,0 +1,14 @@ +modulePreserveTopLevelAwait1.ts(1,5): error TS1432: 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. +modulePreserveTopLevelAwait1.ts(2,1): error TS1378: 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. + + +==== modulePreserveTopLevelAwait1.ts (2 errors) ==== + for await (const x of []) {} + ~~~~~ +!!! error TS1432: 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. + await Promise.resolve(); + ~~~~~ +!!! error TS1378: 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. + + export {}; + \ No newline at end of file diff --git a/tests/baselines/reference/modulePreserveTopLevelAwait1(target=es2016).symbols b/tests/baselines/reference/modulePreserveTopLevelAwait1(target=es2016).symbols new file mode 100644 index 0000000000000..e34950bb8432c --- /dev/null +++ b/tests/baselines/reference/modulePreserveTopLevelAwait1(target=es2016).symbols @@ -0,0 +1,13 @@ +//// [tests/cases/compiler/modulePreserveTopLevelAwait1.ts] //// + +=== modulePreserveTopLevelAwait1.ts === +for await (const x of []) {} +>x : Symbol(x, Decl(modulePreserveTopLevelAwait1.ts, 0, 16)) + +await Promise.resolve(); +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) + +export {}; + diff --git a/tests/baselines/reference/modulePreserveTopLevelAwait1(target=es2016).types b/tests/baselines/reference/modulePreserveTopLevelAwait1(target=es2016).types new file mode 100644 index 0000000000000..ad0f7ca92f387 --- /dev/null +++ b/tests/baselines/reference/modulePreserveTopLevelAwait1(target=es2016).types @@ -0,0 +1,23 @@ +//// [tests/cases/compiler/modulePreserveTopLevelAwait1.ts] //// + +=== modulePreserveTopLevelAwait1.ts === +for await (const x of []) {} +>x : any +> : ^^^ +>[] : undefined[] +> : ^^^^^^^^^^^ + +await Promise.resolve(); +>await Promise.resolve() : void +> : ^^^^ +>Promise.resolve() : Promise +> : ^^^^^^^^^^^^^ +>Promise.resolve : { (): Promise; (value: T): Promise>; (value: T | PromiseLike): Promise>; } +> : ^^^^^^ ^^^ ^^ ^^ ^^^ ^^^ ^^ ^^ ^^^ ^^^ +>Promise : PromiseConstructor +> : ^^^^^^^^^^^^^^^^^^ +>resolve : { (): Promise; (value: T): Promise>; (value: T | PromiseLike): Promise>; } +> : ^^^^^^ ^^^ ^^ ^^ ^^^ ^^^ ^^ ^^ ^^^ ^^^ + +export {}; + diff --git a/tests/baselines/reference/modulePreserveTopLevelAwait1(target=esnext).symbols b/tests/baselines/reference/modulePreserveTopLevelAwait1(target=esnext).symbols new file mode 100644 index 0000000000000..f85c12370b472 --- /dev/null +++ b/tests/baselines/reference/modulePreserveTopLevelAwait1(target=esnext).symbols @@ -0,0 +1,13 @@ +//// [tests/cases/compiler/modulePreserveTopLevelAwait1.ts] //// + +=== modulePreserveTopLevelAwait1.ts === +for await (const x of []) {} +>x : Symbol(x, Decl(modulePreserveTopLevelAwait1.ts, 0, 16)) + +await Promise.resolve(); +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) + +export {}; + diff --git a/tests/baselines/reference/modulePreserveTopLevelAwait1(target=esnext).types b/tests/baselines/reference/modulePreserveTopLevelAwait1(target=esnext).types new file mode 100644 index 0000000000000..16729eb060358 --- /dev/null +++ b/tests/baselines/reference/modulePreserveTopLevelAwait1(target=esnext).types @@ -0,0 +1,22 @@ +//// [tests/cases/compiler/modulePreserveTopLevelAwait1.ts] //// + +=== modulePreserveTopLevelAwait1.ts === +for await (const x of []) {} +>x : any +>[] : undefined[] +> : ^^^^^^^^^^^ + +await Promise.resolve(); +>await Promise.resolve() : void +> : ^^^^ +>Promise.resolve() : Promise +> : ^^^^^^^^^^^^^ +>Promise.resolve : { (): Promise; (value: T): Promise>; (value: T | PromiseLike): Promise>; } +> : ^^^^^^ ^^^ ^^ ^^ ^^^ ^^^ ^^ ^^ ^^^ ^^^ +>Promise : PromiseConstructor +> : ^^^^^^^^^^^^^^^^^^ +>resolve : { (): Promise; (value: T): Promise>; (value: T | PromiseLike): Promise>; } +> : ^^^^^^ ^^^ ^^ ^^ ^^^ ^^^ ^^ ^^ ^^^ ^^^ + +export {}; + diff --git a/tests/cases/compiler/modulePreserveTopLevelAwait1.ts b/tests/cases/compiler/modulePreserveTopLevelAwait1.ts new file mode 100644 index 0000000000000..16da28db4a006 --- /dev/null +++ b/tests/cases/compiler/modulePreserveTopLevelAwait1.ts @@ -0,0 +1,8 @@ +// @module: preserve +// @target: es2016, esnext +// @noEmit: true + +for await (const x of []) {} +await Promise.resolve(); + +export {};