[Wasm][Gradle] Enable asyncWebAssembly and topLevelAwait in webpack.

Needed for new async module ESM launchers.

Merge-request: KT-MR-5738
Merged-by: Svyatoslav Kuzmich <svyatoslav.kuzmich@jetbrains.com>
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt
index c393e83..e0c80c9 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt
@@ -18,6 +18,7 @@
 import org.gradle.deployment.internal.DeploymentRegistry
 import org.gradle.process.internal.ExecHandle
 import org.gradle.process.internal.ExecHandleFactory
+import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
 import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
 import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
 import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.archivesName
@@ -28,6 +29,7 @@
 import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
 import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig.Mode
 import org.jetbrains.kotlin.gradle.testing.internal.reportsDir
+import org.jetbrains.kotlin.gradle.utils.getValue
 import org.jetbrains.kotlin.gradle.utils.injected
 import org.jetbrains.kotlin.gradle.utils.property
 import java.io.File
@@ -218,6 +220,10 @@
     private val webpackConfigAppliers: MutableList<(KotlinWebpackConfig) -> Unit> =
         mutableListOf()
 
+    private val platformType by project.provider {
+        compilation.platformType
+    }
+
     private fun createRunner(): KotlinWebpackRunner {
         val config = KotlinWebpackConfig(
             mode = mode,
@@ -236,6 +242,13 @@
             webpackMajorVersion = webpackMajorVersion
         )
 
+        if (platformType == KotlinPlatformType.wasm) {
+            config.experiments += listOf(
+                "asyncWebAssembly",
+                "topLevelAwait"
+            )
+        }
+
         webpackConfigAppliers
             .forEach { it(config) }
 
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpackConfig.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpackConfig.kt
index f70cc4b..4a57f57 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpackConfig.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpackConfig.kt
@@ -48,6 +48,8 @@
     @Input
     @Optional
     var devServer: DevServer? = null,
+    @Input
+    var experiments: MutableSet<String> = mutableSetOf(),
     @Nested
     var cssSupport: KotlinWebpackCssSupport = KotlinWebpackCssSupport(),
     @Input
@@ -207,6 +209,7 @@
             appendErrorPlugin()
             appendFromConfigDir()
             appendEvaluatedFileReport()
+            appendExperiments()
 
             if (export) {
                 //language=JavaScript 1.8
@@ -277,6 +280,16 @@
         appendLine()
     }
 
+    private fun Appendable.appendExperiments() {
+        if (experiments.isEmpty()) return
+
+        appendLine("config.experiments = {")
+        for (experiment in experiments.sorted()) {
+            appendLine("    $experiment: true,")
+        }
+        appendLine("}")
+    }
+
     private fun Appendable.appendSourceMaps() {
         if (!sourceMaps) return