[K/JS] Introduce new @JsImport API for JS interop
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt
index 940cfac..5f6fb56 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt
@@ -5660,6 +5660,54 @@
             token,
         )
     }
+    add(FirJsErrors.JS_IMPORT_PROHIBITED_ON_VAR) { firDiagnostic ->
+        JsImportProhibitedOnVarImpl(
+            firDiagnostic as KtPsiDiagnostic,
+            token,
+        )
+    }
+    add(FirJsErrors.JS_IMPORT_PROHIBITED_ON_NON_NATIVE) { firDiagnostic ->
+        JsImportProhibitedOnNonNativeImpl(
+            firDiagnostic as KtPsiDiagnostic,
+            token,
+        )
+    }
+    add(FirJsErrors.NESTED_JS_IMPORT_PROHIBITED) { firDiagnostic ->
+        NestedJsImportProhibitedImpl(
+            firDiagnostic as KtPsiDiagnostic,
+            token,
+        )
+    }
+    add(FirJsErrors.JS_IMPORT_DEFAULT_AND_NAMED) { firDiagnostic ->
+        JsImportDefaultAndNamedImpl(
+            firDiagnostic as KtPsiDiagnostic,
+            token,
+        )
+    }
+    add(FirJsErrors.JS_IMPORT_OPTION_WITHOUT_JS_IMPORT) { firDiagnostic ->
+        JsImportOptionWithoutJsImportImpl(
+            firDiagnostic as KtPsiDiagnostic,
+            token,
+        )
+    }
+    add(FirJsErrors.JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION) { firDiagnostic ->
+        JsImportNamespaceOnNonObjectDeclarationImpl(
+            firDiagnostic as KtPsiDiagnostic,
+            token,
+        )
+    }
+    add(FirJsErrors.JS_IMPORT_NAMESPACE_WITH_FILE_JS_IMPORT) { firDiagnostic ->
+        JsImportNamespaceWithFileJsImportImpl(
+            firDiagnostic as KtPsiDiagnostic,
+            token,
+        )
+    }
+    add(FirJsErrors.JS_IMPORT_AND_JS_MODULE_MIX) { firDiagnostic ->
+        JsImportAndJsModuleMixImpl(
+            firDiagnostic as KtPsiDiagnostic,
+            token,
+        )
+    }
     add(FirJsErrors.OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS) { firDiagnostic ->
         OverridingExternalFunWithOptionalParamsImpl(
             firDiagnostic as KtPsiDiagnostic,
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt
index df0e024..fc9b407 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt
@@ -3941,6 +3941,38 @@
         override val diagnosticClass get() = ImplementingFunctionInterface::class
     }
 
+    interface JsImportProhibitedOnVar : KtFirDiagnostic<KtElement> {
+        override val diagnosticClass get() = JsImportProhibitedOnVar::class
+    }
+
+    interface JsImportProhibitedOnNonNative : KtFirDiagnostic<KtElement> {
+        override val diagnosticClass get() = JsImportProhibitedOnNonNative::class
+    }
+
+    interface NestedJsImportProhibited : KtFirDiagnostic<KtElement> {
+        override val diagnosticClass get() = NestedJsImportProhibited::class
+    }
+
+    interface JsImportDefaultAndNamed : KtFirDiagnostic<KtElement> {
+        override val diagnosticClass get() = JsImportDefaultAndNamed::class
+    }
+
+    interface JsImportOptionWithoutJsImport : KtFirDiagnostic<KtElement> {
+        override val diagnosticClass get() = JsImportOptionWithoutJsImport::class
+    }
+
+    interface JsImportNamespaceOnNonObjectDeclaration : KtFirDiagnostic<KtElement> {
+        override val diagnosticClass get() = JsImportNamespaceOnNonObjectDeclaration::class
+    }
+
+    interface JsImportNamespaceWithFileJsImport : KtFirDiagnostic<KtElement> {
+        override val diagnosticClass get() = JsImportNamespaceWithFileJsImport::class
+    }
+
+    interface JsImportAndJsModuleMix : KtFirDiagnostic<KtElement> {
+        override val diagnosticClass get() = JsImportAndJsModuleMix::class
+    }
+
     interface OverridingExternalFunWithOptionalParams : KtFirDiagnostic<KtElement> {
         override val diagnosticClass get() = OverridingExternalFunWithOptionalParams::class
     }
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt
index bebc863..96a5bee 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt
@@ -4757,6 +4757,46 @@
     token: KtLifetimeToken,
 ) : KtAbstractFirDiagnostic<KtClassOrObject>(firDiagnostic, token), KtFirDiagnostic.ImplementingFunctionInterface
 
+internal class JsImportProhibitedOnVarImpl(
+    firDiagnostic: KtPsiDiagnostic,
+    token: KtLifetimeToken,
+) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.JsImportProhibitedOnVar
+
+internal class JsImportProhibitedOnNonNativeImpl(
+    firDiagnostic: KtPsiDiagnostic,
+    token: KtLifetimeToken,
+) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.JsImportProhibitedOnNonNative
+
+internal class NestedJsImportProhibitedImpl(
+    firDiagnostic: KtPsiDiagnostic,
+    token: KtLifetimeToken,
+) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.NestedJsImportProhibited
+
+internal class JsImportDefaultAndNamedImpl(
+    firDiagnostic: KtPsiDiagnostic,
+    token: KtLifetimeToken,
+) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.JsImportDefaultAndNamed
+
+internal class JsImportOptionWithoutJsImportImpl(
+    firDiagnostic: KtPsiDiagnostic,
+    token: KtLifetimeToken,
+) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.JsImportOptionWithoutJsImport
+
+internal class JsImportNamespaceOnNonObjectDeclarationImpl(
+    firDiagnostic: KtPsiDiagnostic,
+    token: KtLifetimeToken,
+) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.JsImportNamespaceOnNonObjectDeclaration
+
+internal class JsImportNamespaceWithFileJsImportImpl(
+    firDiagnostic: KtPsiDiagnostic,
+    token: KtLifetimeToken,
+) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.JsImportNamespaceWithFileJsImport
+
+internal class JsImportAndJsModuleMixImpl(
+    firDiagnostic: KtPsiDiagnostic,
+    token: KtLifetimeToken,
+) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.JsImportAndJsModuleMix
+
 internal class OverridingExternalFunWithOptionalParamsImpl(
     firDiagnostic: KtPsiDiagnostic,
     token: KtLifetimeToken,
diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJsDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJsDiagnosticsList.kt
index 04844d0..a2e7767 100644
--- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJsDiagnosticsList.kt
+++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJsDiagnosticsList.kt
@@ -78,6 +78,19 @@
         val IMPLEMENTING_FUNCTION_INTERFACE by error<KtClassOrObject>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
     }
 
+    val IMPORT by object : DiagnosticGroup("JsImport") {
+        val JS_IMPORT_PROHIBITED_ON_VAR by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
+        val JS_IMPORT_PROHIBITED_ON_NON_NATIVE by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
+        val NESTED_JS_IMPORT_PROHIBITED by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
+
+        val JS_IMPORT_DEFAULT_AND_NAMED by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
+        val JS_IMPORT_OPTION_WITHOUT_JS_IMPORT by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
+        val JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
+        val JS_IMPORT_NAMESPACE_WITH_FILE_JS_IMPORT by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
+
+        val JS_IMPORT_AND_JS_MODULE_MIX by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
+    }
+
     val EXTERNAL by object : DiagnosticGroup("External") {
         val OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
         val OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS_WITH_FAKE by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) {
diff --git a/compiler/fir/checkers/checkers.js/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrors.kt b/compiler/fir/checkers/checkers.js/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrors.kt
index c863bae..411fa47 100644
--- a/compiler/fir/checkers/checkers.js/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrors.kt
+++ b/compiler/fir/checkers/checkers.js/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrors.kt
@@ -60,6 +60,16 @@
     // Fun Interfaces
     val IMPLEMENTING_FUNCTION_INTERFACE: KtDiagnosticFactory0 by error0<KtClassOrObject>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
 
+    // JsImport
+    val JS_IMPORT_PROHIBITED_ON_VAR: KtDiagnosticFactory0 by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
+    val JS_IMPORT_PROHIBITED_ON_NON_NATIVE: KtDiagnosticFactory0 by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
+    val NESTED_JS_IMPORT_PROHIBITED: KtDiagnosticFactory0 by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
+    val JS_IMPORT_DEFAULT_AND_NAMED: KtDiagnosticFactory0 by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
+    val JS_IMPORT_OPTION_WITHOUT_JS_IMPORT: KtDiagnosticFactory0 by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
+    val JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION: KtDiagnosticFactory0 by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
+    val JS_IMPORT_NAMESPACE_WITH_FILE_JS_IMPORT: KtDiagnosticFactory0 by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
+    val JS_IMPORT_AND_JS_MODULE_MIX: KtDiagnosticFactory0 by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
+
     // External
     val OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS: KtDiagnosticFactory0 by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
     val OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS_WITH_FAKE: KtDiagnosticFactory1<FirNamedFunctionSymbol> by error1<KtElement, FirNamedFunctionSymbol>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
diff --git a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/JsDeclarationCheckers.kt b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/JsDeclarationCheckers.kt
index ef9d44d..2f43a51 100644
--- a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/JsDeclarationCheckers.kt
+++ b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/JsDeclarationCheckers.kt
@@ -19,6 +19,8 @@
     override val basicDeclarationCheckers: Set<FirBasicDeclarationChecker>
         get() = setOf(
             FirJsModuleChecker,
+            FirJsImportChecker,
+            FirJsImportOptionsChecker,
             FirJsRuntimeAnnotationChecker,
             FirJsExternalChecker,
             FirJsExternalFileChecker,
diff --git a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsImportChecker.kt b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsImportChecker.kt
new file mode 100644
index 0000000..6cfc7778
--- /dev/null
+++ b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsImportChecker.kt
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.fir.analysis.js.checkers.declaration
+
+import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
+import org.jetbrains.kotlin.diagnostics.reportOn
+import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
+import org.jetbrains.kotlin.fir.analysis.checkers.closestNonLocalWith
+import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
+import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirBasicDeclarationChecker
+import org.jetbrains.kotlin.fir.analysis.checkers.isTopLevel
+import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors
+import org.jetbrains.kotlin.fir.analysis.js.checkers.isNativeObject
+import org.jetbrains.kotlin.fir.declarations.*
+import org.jetbrains.kotlin.fir.resolve.fqName
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsImport
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsModule
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsNonModule
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsQualifier
+
+object FirJsImportChecker : FirBasicDeclarationChecker(MppCheckerKind.Common) {
+    private val annotationsForbiddenToUseWithJsImport = setOf(
+        JsModule.asSingleFqName(),
+        JsNonModule.asSingleFqName(),
+        JsQualifier.asSingleFqName()
+    )
+
+    override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
+        if (!declaration.hasAnnotation(JsImport, context.session)) return
+
+        if (declaration is FirProperty && declaration.isVar) {
+            reporter.reportOn(declaration.source, FirJsErrors.JS_IMPORT_PROHIBITED_ON_VAR, context)
+        }
+
+        val closestNonLocal = context.closestNonLocalWith(declaration)?.symbol ?: return
+
+        if (!closestNonLocal.isNativeObject(context)) {
+            reporter.reportOn(declaration.source, FirJsErrors.JS_IMPORT_PROHIBITED_ON_NON_NATIVE, context)
+        }
+
+        if (context.isTopLevel && context.containingFile?.hasAnnotation(JsImport, context.session) == true) {
+            reporter.reportOn(declaration.source, FirJsErrors.NESTED_JS_IMPORT_PROHIBITED, context)
+        }
+
+        if (
+            declaration.hasAnnotation(JsModule, context.session) ||
+            context.containingFile?.annotations?.any { it.fqName(context.session) in annotationsForbiddenToUseWithJsImport } == true
+        ) {
+            reporter.reportOn(declaration.source, FirJsErrors.JS_IMPORT_AND_JS_MODULE_MIX, context)
+        }
+    }
+}
diff --git a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsImportOptionsChecker.kt b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsImportOptionsChecker.kt
new file mode 100644
index 0000000..1ff9801
--- /dev/null
+++ b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsImportOptionsChecker.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.fir.analysis.js.checkers.declaration
+
+import org.jetbrains.kotlin.descriptors.isObject
+import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
+import org.jetbrains.kotlin.diagnostics.reportOn
+import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
+import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
+import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirBasicDeclarationChecker
+import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors
+import org.jetbrains.kotlin.fir.declarations.*
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsImport
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsImportName
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsImportDefault
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsImportNamespace
+
+object FirJsImportOptionsChecker : FirBasicDeclarationChecker(MppCheckerKind.Common) {
+    override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
+        val hasJsImportName = declaration.hasAnnotation(JsImportName, context.session)
+        val hasJsImportDefault = declaration.hasAnnotation(JsImportDefault, context.session)
+        val hasJsImportNamespace = declaration.hasAnnotation(JsImportNamespace, context.session)
+
+        if (!hasJsImportName && !hasJsImportDefault && !hasJsImportNamespace) return
+
+        val thereIsMixOfOptions = listOf(hasJsImportName, hasJsImportDefault, hasJsImportNamespace).count { it } > 1
+        if (thereIsMixOfOptions) {
+            reporter.reportOn(declaration.source, FirJsErrors.JS_IMPORT_DEFAULT_AND_NAMED, context)
+        }
+
+        if (hasJsImportNamespace && (declaration !is FirClass || !declaration.classKind.isObject)) {
+            reporter.reportOn(declaration.source, FirJsErrors.JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION, context)
+        }
+
+        val hasJsImport = declaration.hasAnnotation(JsImport, context.session)
+
+        if (!hasJsImport && context.containingFile?.hasAnnotation(JsImport, context.session) != true) {
+            reporter.reportOn(declaration.source, FirJsErrors.JS_IMPORT_OPTION_WITHOUT_JS_IMPORT, context)
+            return
+        }
+
+        if (hasJsImportNamespace && !hasJsImport) {
+            reporter.reportOn(declaration.source, FirJsErrors.JS_IMPORT_NAMESPACE_WITH_FILE_JS_IMPORT, context)
+        }
+    }
+}
diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt
index 6595e51..0535db7 100644
--- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt
+++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt
@@ -636,6 +636,14 @@
     "SUBCLASS_CANT_CALL_COMPANION_PROTECTED_NON_STATIC",
     "JAVA_SAM_INTERFACE_CONSTRUCTOR_REFERENCE",
     "IMPLEMENTING_FUNCTION_INTERFACE",
+    "JS_IMPORT_PROHIBITED_ON_VAR",
+    "JS_IMPORT_PROHIBITED_ON_NON_NATIVE",
+    "NESTED_JS_IMPORT_PROHIBITED",
+    "JS_IMPORT_DEFAULT_AND_NAMED",
+    "JS_IMPORT_OPTION_WITHOUT_JS_IMPORT",
+    "JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION",
+    "JS_IMPORT_NAMESPACE_WITH_FILE_JS_IMPORT",
+    "JS_IMPORT_AND_JS_MODULE_MIX",
     "OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS",
     "OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS_WITH_FAKE",
     "CALL_TO_DEFINED_EXTERNALLY_FROM_NON_EXTERNAL_DECLARATION",
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsNameLinkingNamer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsNameLinkingNamer.kt
index 0a7d345..a4b9e34 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsNameLinkingNamer.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsNameLinkingNamer.kt
@@ -14,7 +14,9 @@
 import org.jetbrains.kotlin.ir.util.*
 import org.jetbrains.kotlin.js.backend.ast.*
 import org.jetbrains.kotlin.js.backend.ast.metadata.constant
+import org.jetbrains.kotlin.name.Name
 import org.jetbrains.kotlin.utils.DFS
+import org.jetbrains.kotlin.utils.addToStdlib.runIf
 import org.jetbrains.kotlin.utils.addToStdlib.safeAs
 
 class JsNameLinkingNamer(
@@ -39,9 +41,9 @@
 
     override fun getNameForStaticDeclaration(declaration: IrDeclarationWithName): JsName {
         if (declaration.isEffectivelyExternal()) {
-            val jsModule: String? = declaration.getJsModule()
+            val jsModule: String? = declaration.getJsImport() ?: declaration.getJsModule()
             val maybeParentFile: IrFile? = declaration.parent as? IrFile
-            val fileJsModule: String? = maybeParentFile?.getJsModule()
+            val fileJsModule: String? = maybeParentFile?.getJsImport() ?: maybeParentFile?.getJsModule()
             val jsQualifier: List<JsName>? = maybeParentFile?.getJsQualifier()?.split('.')?.map { JsName(it, false) }
 
             return when {
@@ -80,25 +82,55 @@
     }
 
     private fun IrDeclarationWithName.generateImportForDeclarationWithJsModule(jsModule: String): JsName {
-        val nameString = if (isJsNonModule()) {
-            getJsNameOrKotlinName().asString()
+        val hasJsImport = getJsImport() != null
+        val importName = getJsImportName()?.toJsName(temporary = false)
+        val isDefaultImport = hasJsImportDefault()
+        val isNamespaceImport = hasJsImportNamespace()
+
+        val declarationName = getJsNameOrKotlinName()
+        val nameString = if (isJsNonModule() || hasJsImport) {
+            declarationName.identifier
         } else {
             val parent = fqNameWhenAvailable!!.parent()
-            parent.child(getJsNameOrKotlinName()).asString()
+            parent.child(declarationName).asString()
         }
         val name = JsName(sanitizeName(nameString), true)
         val nameRef = name.makeRef()
 
         if (isEsModules) {
             val importSubject = when {
+                hasJsImport -> when {
+                    isNamespaceImport -> JsImport.Target.All(nameRef)
+                    isDefaultImport -> JsImport.Target.Default(nameRef)
+                    else -> JsImport.Target.Elements(
+                        mutableListOf(
+                            JsImport.Element(importName ?: JsName(nameString, false), nameRef)
+                        )
+                    )
+                }
                 this is IrClass && isObject -> JsImport.Target.All(nameRef)
                 else -> JsImport.Target.Default(nameRef)
             }
             imports[this] = JsImport(jsModule, importSubject)
             nameMap[this] = name
+        } else if (hasJsImport) {
+            if (isNamespaceImport || isDefaultImport) {
+                importedModules += JsImportedModule(jsModule, name, null)
+                return name
+            }
+
+            val moduleName = JsName(sanitizeName("\$module\$$jsModule"), true)
+            importedModules += JsImportedModule(jsModule, moduleName, null)
+            nameMap[this] = name
+
+            imports[this] = jsElementAccess(
+                importName?.ident ?: nameString,
+                moduleName.makeRef()
+            ).putIntoVariableWitName(name)
         } else {
             importedModules += JsImportedModule(jsModule, name, nameRef)
         }
+
         return name
     }
 
@@ -108,11 +140,21 @@
     ): JsName {
         if (this in nameMap) return getName()
 
+        val importName = getJsImportName()?.toJsName(temporary = false)
+        val isDefaultImport = hasJsImportDefault()
         val declarationStableName = getJsNameOrKotlinName().identifier
 
         if (isEsModules) {
-            val importedName = jsQualifier?.firstOrNull() ?: declarationStableName.toJsName(temporary = false)
-            val importStatement = JsImport(fileJsModule, JsImport.Element(importedName))
+            val usedDeclarationName = jsQualifier?.firstOrNull() ?: declarationStableName.toJsName(temporary = importName != null)
+
+            val importElement = when {
+                isDefaultImport -> JsImport.Target.Default(usedDeclarationName.makeRef())
+                importName != null -> JsImport.Target.Elements(mutableListOf(JsImport.Element(importName, usedDeclarationName.makeRef())))
+                else -> JsImport.Target.Elements(mutableListOf(JsImport.Element(usedDeclarationName)))
+            }
+
+            val importStatement = JsImport(fileJsModule, importElement)
+
             imports[this] = when (val qualifiedReference = jsQualifier?.makeRef()) {
                 null -> importStatement
                 else -> JsCompositeBlock(
@@ -126,12 +168,20 @@
             }
 
         } else {
+            if (isDefaultImport) {
+                val declarationName = declarationStableName.toJsName()
+                importedModules += JsImportedModule(fileJsModule, declarationName, null)
+                return declarationName
+            }
             val moduleName = JsName(sanitizeName("\$module\$$fileJsModule"), true)
             importedModules += JsImportedModule(fileJsModule, moduleName, null)
             val qualifiedReference =
                 if (jsQualifier == null) moduleName.makeRef() else (listOf(moduleName) + jsQualifier).makeRef()
             imports[this] =
-                jsElementAccess(declarationStableName, qualifiedReference).putIntoVariableWitName(declarationStableName.toJsName())
+                jsElementAccess(
+                    importName?.ident ?: declarationStableName,
+                    qualifiedReference
+                ).putIntoVariableWitName(declarationStableName.toJsName())
         }
 
         return getName()
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/AnnotationUtils.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/AnnotationUtils.kt
index 15d8591..6b27004 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/AnnotationUtils.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/AnnotationUtils.kt
@@ -17,6 +17,10 @@
 
 object JsAnnotations {
     val jsModuleFqn = FqName("kotlin.js.JsModule")
+    val jsImportFqn = FqName("kotlin.js.JsImport")
+    val jsImportNameFqn = FqName("kotlin.js.JsImport.Name")
+    val jsImportDefaultFqn = FqName("kotlin.js.JsImport.Default")
+    val jsImportNamespaceFqn = FqName("kotlin.js.JsImport.Namespace")
     val jsNonModuleFqn = FqName("kotlin.js.JsNonModule")
     val jsNameFqn = FqName("kotlin.js.JsName")
     val jsFileNameFqn = FqName("kotlin.js.JsFileName")
@@ -43,6 +47,18 @@
 fun IrAnnotationContainer.getJsModule(): String? =
     getAnnotation(JsAnnotations.jsModuleFqn)?.getSingleConstStringArgument()
 
+fun IrAnnotationContainer.getJsImport(): String? =
+    getAnnotation(JsAnnotations.jsImportFqn)?.getSingleConstStringArgument()
+
+fun IrAnnotationContainer.getJsImportName(): String? =
+    getAnnotation(JsAnnotations.jsImportNameFqn)?.getSingleConstStringArgument()
+
+fun IrAnnotationContainer.hasJsImportDefault(): Boolean =
+    hasAnnotation(JsAnnotations.jsImportDefaultFqn)
+
+fun IrAnnotationContainer.hasJsImportNamespace(): Boolean =
+    hasAnnotation(JsAnnotations.jsImportNamespaceFqn)
+
 fun IrAnnotationContainer.isJsNonModule(): Boolean =
     hasAnnotation(JsAnnotations.jsNonModuleFqn)
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt
index 83fdef8..374fa17 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt
@@ -376,7 +376,8 @@
         ?: (parent as IrDeclaration).getPackageFragment()
 }
 
-fun IrConstructorCall.isAnnotation(name: FqName) = symbol.owner.parentAsClass.fqNameWhenAvailable == name
+fun IrConstructorCall.isAnnotation(name: FqName) =
+    symbol.owner.parentAsClass.hasEqualFqName(name)
 
 fun IrAnnotationContainer.getAnnotation(name: FqName): IrConstructorCall? =
     annotations.find { it.isAnnotation(name) }
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/jsImportOptionsWithoutJsImport.kt b/compiler/testData/diagnostics/testsWithJsStdLib/import/jsImportOptionsWithoutJsImport.kt
new file mode 100644
index 0000000..4ccf4d6
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/jsImportOptionsWithoutJsImport.kt
@@ -0,0 +1,11 @@
+// FIR_IDENTICAL
+package foo
+
+<!JS_IMPORT_OPTION_WITHOUT_JS_IMPORT!>@JsImport.Name("Foo")
+external fun foo()<!>
+
+@JsImport.Default
+external class <!JS_IMPORT_OPTION_WITHOUT_JS_IMPORT!>Bar<!>
+
+@JsImport.Namespace
+external <!JS_IMPORT_OPTION_WITHOUT_JS_IMPORT!>object Correct<!>
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/jsVarProhibited.kt b/compiler/testData/diagnostics/testsWithJsStdLib/import/jsVarProhibited.kt
new file mode 100644
index 0000000..fd54349
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/jsVarProhibited.kt
@@ -0,0 +1,10 @@
+// FIR_IDENTICAL
+package foo
+
+<!JS_IMPORT_PROHIBITED_ON_VAR!>@JsImport("bar")
+external var bar: Int<!> = definedExternally
+
+typealias JsI = JsImport
+
+<!JS_IMPORT_PROHIBITED_ON_VAR!>@JsI("bar")
+external var bar2: Int<!> = definedExternally
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/jsVarProhibited.txt b/compiler/testData/diagnostics/testsWithJsStdLib/import/jsVarProhibited.txt
new file mode 100644
index 0000000..ad2846b
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/jsVarProhibited.txt
@@ -0,0 +1,7 @@
+package
+
+package foo {
+    @kotlin.js.JsImport(from = "bar") public external var bar: kotlin.Int
+    @foo.JsI /* = kotlin.js.JsImport */(from = "bar") public external var bar2: kotlin.Int
+    public typealias JsI = kotlin.js.JsImport
+}
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsModule.kt b/compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsModule.kt
new file mode 100644
index 0000000..a8dc825
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsModule.kt
@@ -0,0 +1,7 @@
+// FIR_IDENTICAL
+package foo
+
+<!JS_IMPORT_AND_JS_MODULE_MIX!>@JsImport("A")
+@JsModule("A")
+@JsImport.Default
+external fun foo(): String<!>
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsQualifier.kt b/compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsQualifier.kt
new file mode 100644
index 0000000..d314c52
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsQualifier.kt
@@ -0,0 +1,7 @@
+// FIR_IDENTICAL
+@file:JsQualifier("a.b.c")
+package foo
+
+<!JS_IMPORT_AND_JS_MODULE_MIX!>@JsImport("A")
+@JsImport.Default
+external fun foo(): String<!>
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/multipleJsImportOptions.kt b/compiler/testData/diagnostics/testsWithJsStdLib/import/multipleJsImportOptions.kt
new file mode 100644
index 0000000..4e28e4a
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/multipleJsImportOptions.kt
@@ -0,0 +1,23 @@
+// FIR_IDENTICAL
+package foo
+
+<!JS_IMPORT_DEFAULT_AND_NAMED!>@JsImport("A")
+@JsImport.Default
+@JsImport.Name("Foo")
+external fun foo(): String<!>
+
+<!JS_IMPORT_DEFAULT_AND_NAMED, JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION!>@JsImport("A")
+@JsImport.Default
+<!WRONG_ANNOTATION_TARGET!>@JsImport.Namespace<!>
+external fun bar(): String<!>
+
+<!JS_IMPORT_DEFAULT_AND_NAMED, JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION!>@JsImport("A")
+<!WRONG_ANNOTATION_TARGET!>@JsImport.Namespace<!>
+@JsImport.Name("Foo")
+external fun baz(): String<!>
+
+<!JS_IMPORT_DEFAULT_AND_NAMED, JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION!>@JsImport("A")
+@JsImport.Default
+<!WRONG_ANNOTATION_TARGET!>@JsImport.Namespace<!>
+@JsImport.Name("Foo")
+external fun boo(): String<!>
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/namespaceInsideFileJsImport.kt b/compiler/testData/diagnostics/testsWithJsStdLib/import/namespaceInsideFileJsImport.kt
new file mode 100644
index 0000000..4165fc4
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/namespaceInsideFileJsImport.kt
@@ -0,0 +1,6 @@
+// FIR_IDENTICAL
+@file:JsImport("A")
+package foo
+
+@JsImport.Namespace
+external <!JS_IMPORT_NAMESPACE_WITH_FILE_JS_IMPORT!>object Correct<!>
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/nestedProhibited.kt b/compiler/testData/diagnostics/testsWithJsStdLib/import/nestedProhibited.kt
new file mode 100644
index 0000000..9f05109
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/nestedProhibited.kt
@@ -0,0 +1,17 @@
+// FIR_IDENTICAL
+@file:JsImport("foo")
+package foo
+
+@JsImport("A")
+external class <!NESTED_JS_IMPORT_PROHIBITED!>A<!> {
+    class Nested
+}
+
+@JsImport("B")
+external <!NESTED_JS_IMPORT_PROHIBITED!>object B<!>
+
+<!NESTED_JS_IMPORT_PROHIBITED!>@JsImport("foo")
+external fun foo(): Int<!>
+
+<!NESTED_JS_IMPORT_PROHIBITED!>@JsImport("bar")
+external val bar: Int<!>
\ No newline at end of file
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/nestedProhibited.txt b/compiler/testData/diagnostics/testsWithJsStdLib/import/nestedProhibited.txt
new file mode 100644
index 0000000..01303e9
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/nestedProhibited.txt
@@ -0,0 +1,27 @@
+package
+
+package foo {
+    @kotlin.js.JsImport(from = "bar") public external val bar: kotlin.Int
+    @kotlin.js.JsImport(from = "foo") public external fun foo(): kotlin.Int
+
+    @kotlin.js.JsImport(from = "A") public final external class A {
+        public constructor A()
+        public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
+        public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
+        public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
+
+        public final class Nested {
+            public constructor Nested()
+            public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
+            public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
+            public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
+        }
+    }
+
+    @kotlin.js.JsImport(from = "B") public external object B {
+        private constructor B()
+        public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
+        public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
+        public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
+    }
+}
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/nonObjectNamespace.kt b/compiler/testData/diagnostics/testsWithJsStdLib/import/nonObjectNamespace.kt
new file mode 100644
index 0000000..6ab5774
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/nonObjectNamespace.kt
@@ -0,0 +1,22 @@
+// FIR_IDENTICAL
+package foo
+
+<!JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION!>@JsImport("A")
+<!WRONG_ANNOTATION_TARGET!>@JsImport.Namespace<!>
+external fun foo()<!>
+
+@JsImport("A")
+@JsImport.Namespace
+external class <!JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION!>Bar<!>
+
+<!JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION!>@JsImport("A")
+<!WRONG_ANNOTATION_TARGET!>@JsImport.Namespace<!>
+external val test: String<!>
+
+@JsImport("A")
+@JsImport.Namespace
+external interface <!JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION!>Foo<!>
+
+@JsImport("A")
+@JsImport.Namespace
+external object Correct
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/prohibitedOnNonNative.kt b/compiler/testData/diagnostics/testsWithJsStdLib/import/prohibitedOnNonNative.kt
new file mode 100644
index 0000000..08c46ec
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/prohibitedOnNonNative.kt
@@ -0,0 +1,17 @@
+// FIR_IDENTICAL
+package foo
+
+@JsImport("A")
+class <!JS_IMPORT_PROHIBITED_ON_NON_NATIVE!>A<!>
+
+@JsImport("B")
+<!JS_IMPORT_PROHIBITED_ON_NON_NATIVE!>object B<!>
+
+<!JS_IMPORT_PROHIBITED_ON_NON_NATIVE!>@JsImport("foo")
+fun foo()<!> = 23
+
+<!JS_IMPORT_PROHIBITED_ON_NON_NATIVE!>@JsImport("bar")
+val bar<!> = 42
+
+<!JS_IMPORT_PROHIBITED_ON_NON_NATIVE!>@JsImport("baz")
+val baz<!> = 99
diff --git a/core/compiler.common.js/src/org/jetbrains/kotlin/name/JsStandardClassIds.kt b/core/compiler.common.js/src/org/jetbrains/kotlin/name/JsStandardClassIds.kt
index 72b00ba..9ea6ab1 100644
--- a/core/compiler.common.js/src/org/jetbrains/kotlin/name/JsStandardClassIds.kt
+++ b/core/compiler.common.js/src/org/jetbrains/kotlin/name/JsStandardClassIds.kt
@@ -42,6 +42,18 @@
         val JsExport = "JsExport".jsId()
 
         @JvmField
+        val JsImport = "JsImport".jsId()
+
+        @JvmField
+        val JsImportName = JsImport.createNestedClassId(Name.identifier("Name"))
+
+        @JvmField
+        val JsImportDefault = JsImport.createNestedClassId(Name.identifier("Default"))
+
+        @JvmField
+        val JsImportNamespace = JsImport.createNestedClassId(Name.identifier("Namespace"))
+
+        @JvmField
         val JsExternalInheritorsOnly = "JsExternalInheritorsOnly".jsId()
 
         @JvmField
diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt
index e8709bd..e785925 100644
--- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt
+++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt
@@ -22,6 +22,7 @@
     additionalDeclarationCheckers = listOf(
         NativeInvokeChecker(), NativeGetterChecker(), NativeSetterChecker(),
         JsNameChecker, JsModuleChecker, JsExternalFileChecker,
+        JsImportChecker, JsImportOptionsChecker,
         JsInheritanceChecker, JsMultipleInheritanceChecker,
         JsExternalInheritorOnlyChecker,
         JsRuntimeAnnotationChecker,
diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java
index 5af2dea..22f0de1 100644
--- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java
+++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java
@@ -58,6 +58,18 @@
     DiagnosticFactory0<KtElement> JS_MODULE_PROHIBITED_ON_VAR = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
     DiagnosticFactory0<KtElement> JS_MODULE_PROHIBITED_ON_NON_NATIVE = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
     DiagnosticFactory0<KtElement> NESTED_JS_MODULE_PROHIBITED = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
+
+    DiagnosticFactory0<KtElement> JS_IMPORT_PROHIBITED_ON_VAR = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
+    DiagnosticFactory0<KtElement> JS_IMPORT_PROHIBITED_ON_NON_NATIVE = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
+    DiagnosticFactory0<KtElement> NESTED_JS_IMPORT_PROHIBITED = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
+
+    DiagnosticFactory0<KtElement> JS_IMPORT_DEFAULT_AND_NAMED = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
+    DiagnosticFactory0<KtElement> JS_IMPORT_OPTION_WITHOUT_JS_IMPORT = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
+    DiagnosticFactory0<KtElement> JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
+    DiagnosticFactory0<KtElement> JS_IMPORT_NAMESPACE_WITH_FILE_JS_IMPORT = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
+
+    DiagnosticFactory0<KtElement> JS_IMPORT_AND_JS_MODULE_MIX = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
+
     DiagnosticFactory1<PsiElement, DeclarationDescriptor> CALL_TO_JS_MODULE_WITHOUT_MODULE_SYSTEM =
             DiagnosticFactory1.create(ERROR, DEFAULT);
     DiagnosticFactory1<PsiElement, DeclarationDescriptor> CALL_TO_JS_NON_MODULE_WITH_MODULE_SYSTEM =
diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsImportChecker.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsImportChecker.kt
new file mode 100644
index 0000000..7586183
--- /dev/null
+++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsImportChecker.kt
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2010-2016 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jetbrains.kotlin.js.resolve.diagnostics
+
+import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
+import org.jetbrains.kotlin.descriptors.PropertyDescriptor
+import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsModule
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsNonModule
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsQualifier
+import org.jetbrains.kotlin.psi.KtDeclaration
+import org.jetbrains.kotlin.resolve.DescriptorUtils
+import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext
+import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker
+
+object JsImportChecker : DeclarationChecker {
+    private val annotationsForbiddenToUseWithJsImport = setOf(
+        JsModule.asSingleFqName(),
+        JsNonModule.asSingleFqName(),
+        JsQualifier.asSingleFqName()
+    )
+
+    override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) {
+        val trace = context.trace
+
+        if (AnnotationsUtils.getImportSource(descriptor) == null) return
+
+        if (descriptor is PropertyDescriptor && descriptor.isVar) {
+            trace.report(ErrorsJs.JS_IMPORT_PROHIBITED_ON_VAR.on(declaration))
+        }
+
+        if (!AnnotationsUtils.isNativeObject(descriptor)) {
+            trace.report(ErrorsJs.JS_IMPORT_PROHIBITED_ON_NON_NATIVE.on(declaration))
+        }
+
+        if (DescriptorUtils.isTopLevelDeclaration(descriptor) && AnnotationsUtils.getFileImportSource(trace.bindingContext, descriptor) != null) {
+            trace.report(ErrorsJs.NESTED_JS_IMPORT_PROHIBITED.on(declaration))
+        }
+
+        if (
+            AnnotationsUtils.getModuleName(descriptor) != null ||
+            AnnotationsUtils.getContainingFileAnnotations(context.trace.bindingContext, descriptor)
+                .any { it.fqName in annotationsForbiddenToUseWithJsImport }
+        ) {
+            trace.report(ErrorsJs.JS_IMPORT_AND_JS_MODULE_MIX.on(declaration))
+        }
+    }
+}
diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsImportOptionsChecker.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsImportOptionsChecker.kt
new file mode 100644
index 0000000..657cacb
--- /dev/null
+++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsImportOptionsChecker.kt
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2010-2016 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jetbrains.kotlin.js.resolve.diagnostics
+
+import org.jetbrains.kotlin.descriptors.ClassDescriptor
+import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
+import org.jetbrains.kotlin.descriptors.isObject
+import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsImport
+import org.jetbrains.kotlin.psi.KtDeclaration
+import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker
+import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext
+
+object JsImportOptionsChecker : DeclarationChecker {
+    override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) {
+        val trace = context.trace
+
+        val jsImportName = AnnotationsUtils.getImportName(descriptor)
+        val hasJsImportDefault = AnnotationsUtils.hasImportDefault(descriptor)
+        val hasJsImportNamespace = AnnotationsUtils.hasImportNamespace(descriptor)
+
+        if (jsImportName == null && !hasJsImportDefault && !hasJsImportNamespace) return
+
+        val thereIsMixOfOptions = listOf(jsImportName != null, hasJsImportDefault, hasJsImportNamespace).count { it } > 1
+        if (thereIsMixOfOptions) {
+            trace.report(ErrorsJs.JS_IMPORT_DEFAULT_AND_NAMED.on(declaration))
+        }
+
+        if (hasJsImportNamespace && (descriptor !is ClassDescriptor || !descriptor.kind.isObject)) {
+            trace.report(ErrorsJs.JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION.on(declaration))
+        }
+
+        val hasJsImport = AnnotationsUtils.getImportSource(descriptor) != null
+
+        if (!hasJsImport && !AnnotationsUtils.getContainingFileAnnotations(context.trace.bindingContext, descriptor)
+                .any { JsImport.asSingleFqName() == it.fqName }
+        ) {
+            trace.report(ErrorsJs.JS_IMPORT_OPTION_WITHOUT_JS_IMPORT.on(declaration))
+            return
+        }
+
+        if (hasJsImportNamespace && !hasJsImport) {
+            trace.report(ErrorsJs.JS_IMPORT_NAMESPACE_WITH_FILE_JS_IMPORT.on(declaration))
+        }
+    }
+}
diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/translate/utils/AnnotationsUtils.java b/js/js.frontend/src/org/jetbrains/kotlin/js/translate/utils/AnnotationsUtils.java
index 344fc36..94ae8ac 100644
--- a/js/js.frontend/src/org/jetbrains/kotlin/js/translate/utils/AnnotationsUtils.java
+++ b/js/js.frontend/src/org/jetbrains/kotlin/js/translate/utils/AnnotationsUtils.java
@@ -42,6 +42,10 @@
 public final class AnnotationsUtils {
     private static final FqName JS_NAME = Annotations.JsName.asSingleFqName();
     private static final FqName JS_EXPORT = Annotations.JsExport.asSingleFqName();
+    private static final FqName JS_IMPORT = Annotations.JsImport.asSingleFqName();
+    private static final FqName JS_IMPORT_NAME = Annotations.JsImportName.asSingleFqName();
+    private static final FqName JS_IMPORT_DEFAULT = Annotations.JsImportDefault.asSingleFqName();
+    private static final FqName JS_IMPORT_NAMESPACE = Annotations.JsImportNamespace.asSingleFqName();
     private static final FqName JS_EXPORT_IGNORE = Annotations.JsExportIgnore.asSingleFqName();
     private static final FqName JS_MODULE_ANNOTATION = Annotations.JsModule.asSingleFqName();
     private static final FqName JS_NON_MODULE_ANNOTATION = Annotations.JsNonModule.asSingleFqName();
@@ -233,11 +237,38 @@
     }
 
     @Nullable
+    public static String getImportSource(@NotNull DeclarationDescriptor declaration) {
+        AnnotationDescriptor annotation = declaration.getAnnotations().findAnnotation(JS_IMPORT);
+        return annotation != null ? extractSingleStringArgument(annotation) : null;
+    }
+
+    @Nullable
+    public static String getImportName(@NotNull DeclarationDescriptor declaration) {
+        AnnotationDescriptor annotation = declaration.getAnnotations().findAnnotation(JS_IMPORT_NAME);
+        return annotation != null ? extractSingleStringArgument(annotation) : null;
+    }
+
+    @Nullable
+    public static boolean hasImportDefault(@NotNull DeclarationDescriptor declaration) {
+        return declaration.getAnnotations().findAnnotation(JS_IMPORT_DEFAULT) != null;
+    }
+
+    @Nullable
+    public static boolean hasImportNamespace(@NotNull DeclarationDescriptor declaration) {
+        return declaration.getAnnotations().findAnnotation(JS_IMPORT_NAMESPACE) != null;
+    }
+
+    @Nullable
     public static String getFileModuleName(@NotNull BindingContext bindingContext, @NotNull DeclarationDescriptor declaration) {
         return getSingleStringAnnotationArgument(bindingContext, declaration, JS_MODULE_ANNOTATION);
     }
 
     @Nullable
+    public static String getFileImportSource(@NotNull BindingContext bindingContext, @NotNull DeclarationDescriptor declaration) {
+        return getSingleStringAnnotationArgument(bindingContext, declaration, JS_IMPORT);
+    }
+
+    @Nullable
     public static String getFileQualifier(@NotNull BindingContext bindingContext, @NotNull DeclarationDescriptor declaration) {
         return getSingleStringAnnotationArgument(bindingContext, declaration, JS_QUALIFIER_ANNOTATION);
     }
diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsIrPathReplacer.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsIrPathReplacer.kt
index 44fed99..c4f3404 100644
--- a/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsIrPathReplacer.kt
+++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsIrPathReplacer.kt
@@ -24,7 +24,7 @@
 private const val PATH_TO_ROOT_TOKEN = "@PATH_TO_ROOT"
 
 class JsIrPathReplacer(testServices: TestServices) : DeclarationTransformer {
-    private val replacements = testServices.collectReplacementsMap()
+    private val replacements = testServices.collectReplacementMap()
 
     override fun lower(irFile: IrFile) {
         super.lower(irFile)
@@ -38,7 +38,7 @@
     }
 
     private fun IrAnnotationContainer.replaceJsModulePath() {
-        val jsModuleAnnotation = getAnnotation(JsAnnotations.jsModuleFqn) ?: return
+        val jsModuleAnnotation = getAnnotation(JsAnnotations.jsImportFqn) ?: getAnnotation(JsAnnotations.jsModuleFqn) ?: return
 
         @Suppress("UNCHECKED_CAST")
         val stringLiteral = jsModuleAnnotation.getValueArgument(0) as IrConst<String>
@@ -51,7 +51,7 @@
         return IrConstImpl.string(startOffset, endOffset, type, replacements[value] ?: return null)
     }
 
-    private fun TestServices.collectReplacementsMap(): Map<String, String> {
+    private fun TestServices.collectReplacementMap(): Map<String, String> {
         return moduleStructure.modules.asSequence()
             .map { module -> module to module.files.filter { it.isJsFile || it.isMjsFile } }
             .filter { (_, files) -> files.isNotEmpty() }
diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsES6BoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsES6BoxTestGenerated.java
index 9804efc..2b933b2 100644
--- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsES6BoxTestGenerated.java
+++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsES6BoxTestGenerated.java
@@ -2631,6 +2631,360 @@
     }
 
     @Nested
+    @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport")
+    @TestDataPath("$PROJECT_ROOT")
+    public class JsFileImport {
+      @Test
+      public void testAllFilesPresentInJsFileImport() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/default")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Default {
+        @Test
+        public void testAllFilesPresentInDefault() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalClassWithDefaults.kt")
+        public void testExternalClassWithDefaults() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.kt");
+        }
+
+        @Test
+        @TestMetadata("externalConstructor.kt")
+        public void testExternalConstructor() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/named")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Named {
+        @Test
+        public void testAllFilesPresentInNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalClassWithDefaults.kt")
+        public void testExternalClassWithDefaults() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.kt");
+        }
+
+        @Test
+        @TestMetadata("externalConstructor.kt")
+        public void testExternalConstructor() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/plainNamed")
+      @TestDataPath("$PROJECT_ROOT")
+      public class PlainNamed {
+        @Test
+        public void testAllFilesPresentInPlainNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+        }
+
+        @Test
+        @TestMetadata("externalClassNameClash.kt")
+        public void testExternalClassNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalClassNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackage.kt")
+        public void testExternalPackage() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackageInDifferentFile.kt")
+        public void testExternalPackageInDifferentFile() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+        }
+
+        @Test
+        @TestMetadata("interfaces.kt")
+        public void testInterfaces() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.kt");
+        }
+
+        @Test
+        @TestMetadata("interfacesWithCompanion.kt")
+        public void testInterfacesWithCompanion() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.kt");
+        }
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/esModules/jsImport")
+    @TestDataPath("$PROJECT_ROOT")
+    public class JsImport {
+      @Test
+      public void testAllFilesPresentInJsImport() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/default")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Default {
+        @Test
+        public void testAllFilesPresentInDefault() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalClassWithDefaults.kt")
+        public void testExternalClassWithDefaults() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.kt");
+        }
+
+        @Test
+        @TestMetadata("externalConstructor.kt")
+        public void testExternalConstructor() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/named")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Named {
+        @Test
+        public void testAllFilesPresentInNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalClassWithDefaults.kt")
+        public void testExternalClassWithDefaults() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.kt");
+        }
+
+        @Test
+        @TestMetadata("externalConstructor.kt")
+        public void testExternalConstructor() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/namespaced")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Namespaced {
+        @Test
+        public void testAllFilesPresentInNamespaced() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("jsExternalInheritorsOnly.kt")
+        public void testJsExternalInheritorsOnly() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/plainNamed")
+      @TestDataPath("$PROJECT_ROOT")
+      public class PlainNamed {
+        @Test
+        public void testAllFilesPresentInPlainNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+        }
+
+        @Test
+        @TestMetadata("externalClassNameClash.kt")
+        public void testExternalClassNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalClassNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackage.kt")
+        public void testExternalPackage() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackageInDifferentFile.kt")
+        public void testExternalPackageInDifferentFile() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+        }
+
+        @Test
+        @TestMetadata("interfaces.kt")
+        public void testInterfaces() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.kt");
+        }
+
+        @Test
+        @TestMetadata("interfacesWithCompanion.kt")
+        public void testInterfacesWithCompanion() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.kt");
+        }
+      }
+    }
+
+    @Nested
     @TestMetadata("js/js.translator/testData/box/esModules/jsModule")
     @TestDataPath("$PROJECT_ROOT")
     public class JsModule {
@@ -7562,6 +7916,360 @@
   }
 
   @Nested
+  @TestMetadata("js/js.translator/testData/box/jsFileImport")
+  @TestDataPath("$PROJECT_ROOT")
+  public class JsFileImport {
+    @Test
+    public void testAllFilesPresentInJsFileImport() {
+      KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsFileImport/default")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Default {
+      @Test
+      public void testAllFilesPresentInDefault() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+      }
+
+      @Test
+      @TestMetadata("externalClass.kt")
+      public void testExternalClass() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalClass.kt");
+      }
+
+      @Test
+      @TestMetadata("externalClassWithDefaults.kt")
+      public void testExternalClassWithDefaults() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.kt");
+      }
+
+      @Test
+      @TestMetadata("externalConstructor.kt")
+      public void testExternalConstructor() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalConstructor.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunction.kt")
+      public void testExternalFunction() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalFunction.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunctionNameClash.kt")
+      public void testExternalFunctionNameClash() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("externalProperty.kt")
+      public void testExternalProperty() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalProperty.kt");
+      }
+
+      @Test
+      @TestMetadata("topLevelVarargFun.kt")
+      public void testTopLevelVarargFun() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsFileImport/named")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Named {
+      @Test
+      public void testAllFilesPresentInNamed() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+      }
+
+      @Test
+      @TestMetadata("externalClass.kt")
+      public void testExternalClass() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalClass.kt");
+      }
+
+      @Test
+      @TestMetadata("externalClassWithDefaults.kt")
+      public void testExternalClassWithDefaults() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.kt");
+      }
+
+      @Test
+      @TestMetadata("externalConstructor.kt")
+      public void testExternalConstructor() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalConstructor.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunction.kt")
+      public void testExternalFunction() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalFunction.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunctionNameClash.kt")
+      public void testExternalFunctionNameClash() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("externalProperty.kt")
+      public void testExternalProperty() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalProperty.kt");
+      }
+
+      @Test
+      @TestMetadata("topLevelVarargFun.kt")
+      public void testTopLevelVarargFun() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsFileImport/plainNamed")
+    @TestDataPath("$PROJECT_ROOT")
+    public class PlainNamed {
+      @Test
+      public void testAllFilesPresentInPlainNamed() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+      }
+
+      @Test
+      @TestMetadata("externalClassNameClash.kt")
+      public void testExternalClassNameClash() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalClassNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalPackage.kt")
+      public void testExternalPackage() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.kt");
+      }
+
+      @Test
+      @TestMetadata("externalPackageInDifferentFile.kt")
+      public void testExternalPackageInDifferentFile() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+      }
+
+      @Test
+      @TestMetadata("interfaces.kt")
+      public void testInterfaces() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.kt");
+      }
+
+      @Test
+      @TestMetadata("interfacesWithCompanion.kt")
+      public void testInterfacesWithCompanion() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.kt");
+      }
+    }
+  }
+
+  @Nested
+  @TestMetadata("js/js.translator/testData/box/jsImport")
+  @TestDataPath("$PROJECT_ROOT")
+  public class JsImport {
+    @Test
+    public void testAllFilesPresentInJsImport() {
+      KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsImport/default")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Default {
+      @Test
+      public void testAllFilesPresentInDefault() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+      }
+
+      @Test
+      @TestMetadata("externalClass.kt")
+      public void testExternalClass() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalClass.kt");
+      }
+
+      @Test
+      @TestMetadata("externalClassWithDefaults.kt")
+      public void testExternalClassWithDefaults() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.kt");
+      }
+
+      @Test
+      @TestMetadata("externalConstructor.kt")
+      public void testExternalConstructor() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalConstructor.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunction.kt")
+      public void testExternalFunction() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalFunction.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunctionNameClash.kt")
+      public void testExternalFunctionNameClash() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("externalProperty.kt")
+      public void testExternalProperty() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalProperty.kt");
+      }
+
+      @Test
+      @TestMetadata("topLevelVarargFun.kt")
+      public void testTopLevelVarargFun() {
+        runTest("js/js.translator/testData/box/jsImport/default/topLevelVarargFun.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsImport/named")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Named {
+      @Test
+      public void testAllFilesPresentInNamed() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+      }
+
+      @Test
+      @TestMetadata("externalClass.kt")
+      public void testExternalClass() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalClass.kt");
+      }
+
+      @Test
+      @TestMetadata("externalClassWithDefaults.kt")
+      public void testExternalClassWithDefaults() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.kt");
+      }
+
+      @Test
+      @TestMetadata("externalConstructor.kt")
+      public void testExternalConstructor() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalConstructor.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunction.kt")
+      public void testExternalFunction() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalFunction.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunctionNameClash.kt")
+      public void testExternalFunctionNameClash() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("externalProperty.kt")
+      public void testExternalProperty() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalProperty.kt");
+      }
+
+      @Test
+      @TestMetadata("topLevelVarargFun.kt")
+      public void testTopLevelVarargFun() {
+        runTest("js/js.translator/testData/box/jsImport/named/topLevelVarargFun.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsImport/namespaced")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Namespaced {
+      @Test
+      public void testAllFilesPresentInNamespaced() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsImport/namespaced/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("jsExternalInheritorsOnly.kt")
+      public void testJsExternalInheritorsOnly() {
+        runTest("js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsImport/plainNamed")
+    @TestDataPath("$PROJECT_ROOT")
+    public class PlainNamed {
+      @Test
+      public void testAllFilesPresentInPlainNamed() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+      }
+
+      @Test
+      @TestMetadata("externalClassNameClash.kt")
+      public void testExternalClassNameClash() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/externalClassNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalPackage.kt")
+      public void testExternalPackage() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/externalPackage.kt");
+      }
+
+      @Test
+      @TestMetadata("externalPackageInDifferentFile.kt")
+      public void testExternalPackageInDifferentFile() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+      }
+
+      @Test
+      @TestMetadata("interfaces.kt")
+      public void testInterfaces() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/interfaces.kt");
+      }
+
+      @Test
+      @TestMetadata("interfacesWithCompanion.kt")
+      public void testInterfacesWithCompanion() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.kt");
+      }
+    }
+  }
+
+  @Nested
   @TestMetadata("js/js.translator/testData/box/jsModule")
   @TestDataPath("$PROJECT_ROOT")
   public class JsModule {
diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsBoxTestGenerated.java
index f0d3d34..75ed97b 100644
--- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsBoxTestGenerated.java
+++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsBoxTestGenerated.java
@@ -2525,6 +2525,360 @@
     }
 
     @Nested
+    @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport")
+    @TestDataPath("$PROJECT_ROOT")
+    public class JsFileImport {
+      @Test
+      public void testAllFilesPresentInJsFileImport() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/default")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Default {
+        @Test
+        public void testAllFilesPresentInDefault() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalClassWithDefaults.kt")
+        public void testExternalClassWithDefaults() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.kt");
+        }
+
+        @Test
+        @TestMetadata("externalConstructor.kt")
+        public void testExternalConstructor() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/named")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Named {
+        @Test
+        public void testAllFilesPresentInNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalClassWithDefaults.kt")
+        public void testExternalClassWithDefaults() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.kt");
+        }
+
+        @Test
+        @TestMetadata("externalConstructor.kt")
+        public void testExternalConstructor() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/plainNamed")
+      @TestDataPath("$PROJECT_ROOT")
+      public class PlainNamed {
+        @Test
+        public void testAllFilesPresentInPlainNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+        }
+
+        @Test
+        @TestMetadata("externalClassNameClash.kt")
+        public void testExternalClassNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalClassNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackage.kt")
+        public void testExternalPackage() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackageInDifferentFile.kt")
+        public void testExternalPackageInDifferentFile() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+        }
+
+        @Test
+        @TestMetadata("interfaces.kt")
+        public void testInterfaces() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.kt");
+        }
+
+        @Test
+        @TestMetadata("interfacesWithCompanion.kt")
+        public void testInterfacesWithCompanion() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.kt");
+        }
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/esModules/jsImport")
+    @TestDataPath("$PROJECT_ROOT")
+    public class JsImport {
+      @Test
+      public void testAllFilesPresentInJsImport() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/default")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Default {
+        @Test
+        public void testAllFilesPresentInDefault() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalClassWithDefaults.kt")
+        public void testExternalClassWithDefaults() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.kt");
+        }
+
+        @Test
+        @TestMetadata("externalConstructor.kt")
+        public void testExternalConstructor() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/named")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Named {
+        @Test
+        public void testAllFilesPresentInNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalClassWithDefaults.kt")
+        public void testExternalClassWithDefaults() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.kt");
+        }
+
+        @Test
+        @TestMetadata("externalConstructor.kt")
+        public void testExternalConstructor() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/namespaced")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Namespaced {
+        @Test
+        public void testAllFilesPresentInNamespaced() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("jsExternalInheritorsOnly.kt")
+        public void testJsExternalInheritorsOnly() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/plainNamed")
+      @TestDataPath("$PROJECT_ROOT")
+      public class PlainNamed {
+        @Test
+        public void testAllFilesPresentInPlainNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+        }
+
+        @Test
+        @TestMetadata("externalClassNameClash.kt")
+        public void testExternalClassNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalClassNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackage.kt")
+        public void testExternalPackage() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackageInDifferentFile.kt")
+        public void testExternalPackageInDifferentFile() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+        }
+
+        @Test
+        @TestMetadata("interfaces.kt")
+        public void testInterfaces() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.kt");
+        }
+
+        @Test
+        @TestMetadata("interfacesWithCompanion.kt")
+        public void testInterfacesWithCompanion() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.kt");
+        }
+      }
+    }
+
+    @Nested
     @TestMetadata("js/js.translator/testData/box/esModules/jsModule")
     @TestDataPath("$PROJECT_ROOT")
     public class JsModule {
@@ -7456,6 +7810,360 @@
   }
 
   @Nested
+  @TestMetadata("js/js.translator/testData/box/jsFileImport")
+  @TestDataPath("$PROJECT_ROOT")
+  public class JsFileImport {
+    @Test
+    public void testAllFilesPresentInJsFileImport() {
+      KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsFileImport/default")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Default {
+      @Test
+      public void testAllFilesPresentInDefault() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Test
+      @TestMetadata("externalClass.kt")
+      public void testExternalClass() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalClass.kt");
+      }
+
+      @Test
+      @TestMetadata("externalClassWithDefaults.kt")
+      public void testExternalClassWithDefaults() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.kt");
+      }
+
+      @Test
+      @TestMetadata("externalConstructor.kt")
+      public void testExternalConstructor() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalConstructor.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunction.kt")
+      public void testExternalFunction() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalFunction.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunctionNameClash.kt")
+      public void testExternalFunctionNameClash() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("externalProperty.kt")
+      public void testExternalProperty() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalProperty.kt");
+      }
+
+      @Test
+      @TestMetadata("topLevelVarargFun.kt")
+      public void testTopLevelVarargFun() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsFileImport/named")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Named {
+      @Test
+      public void testAllFilesPresentInNamed() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Test
+      @TestMetadata("externalClass.kt")
+      public void testExternalClass() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalClass.kt");
+      }
+
+      @Test
+      @TestMetadata("externalClassWithDefaults.kt")
+      public void testExternalClassWithDefaults() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.kt");
+      }
+
+      @Test
+      @TestMetadata("externalConstructor.kt")
+      public void testExternalConstructor() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalConstructor.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunction.kt")
+      public void testExternalFunction() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalFunction.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunctionNameClash.kt")
+      public void testExternalFunctionNameClash() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("externalProperty.kt")
+      public void testExternalProperty() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalProperty.kt");
+      }
+
+      @Test
+      @TestMetadata("topLevelVarargFun.kt")
+      public void testTopLevelVarargFun() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsFileImport/plainNamed")
+    @TestDataPath("$PROJECT_ROOT")
+    public class PlainNamed {
+      @Test
+      public void testAllFilesPresentInPlainNamed() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Test
+      @TestMetadata("externalClassNameClash.kt")
+      public void testExternalClassNameClash() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalClassNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalPackage.kt")
+      public void testExternalPackage() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.kt");
+      }
+
+      @Test
+      @TestMetadata("externalPackageInDifferentFile.kt")
+      public void testExternalPackageInDifferentFile() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+      }
+
+      @Test
+      @TestMetadata("interfaces.kt")
+      public void testInterfaces() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.kt");
+      }
+
+      @Test
+      @TestMetadata("interfacesWithCompanion.kt")
+      public void testInterfacesWithCompanion() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.kt");
+      }
+    }
+  }
+
+  @Nested
+  @TestMetadata("js/js.translator/testData/box/jsImport")
+  @TestDataPath("$PROJECT_ROOT")
+  public class JsImport {
+    @Test
+    public void testAllFilesPresentInJsImport() {
+      KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsImport/default")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Default {
+      @Test
+      public void testAllFilesPresentInDefault() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Test
+      @TestMetadata("externalClass.kt")
+      public void testExternalClass() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalClass.kt");
+      }
+
+      @Test
+      @TestMetadata("externalClassWithDefaults.kt")
+      public void testExternalClassWithDefaults() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.kt");
+      }
+
+      @Test
+      @TestMetadata("externalConstructor.kt")
+      public void testExternalConstructor() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalConstructor.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunction.kt")
+      public void testExternalFunction() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalFunction.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunctionNameClash.kt")
+      public void testExternalFunctionNameClash() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("externalProperty.kt")
+      public void testExternalProperty() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalProperty.kt");
+      }
+
+      @Test
+      @TestMetadata("topLevelVarargFun.kt")
+      public void testTopLevelVarargFun() {
+        runTest("js/js.translator/testData/box/jsImport/default/topLevelVarargFun.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsImport/named")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Named {
+      @Test
+      public void testAllFilesPresentInNamed() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Test
+      @TestMetadata("externalClass.kt")
+      public void testExternalClass() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalClass.kt");
+      }
+
+      @Test
+      @TestMetadata("externalClassWithDefaults.kt")
+      public void testExternalClassWithDefaults() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.kt");
+      }
+
+      @Test
+      @TestMetadata("externalConstructor.kt")
+      public void testExternalConstructor() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalConstructor.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunction.kt")
+      public void testExternalFunction() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalFunction.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunctionNameClash.kt")
+      public void testExternalFunctionNameClash() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("externalProperty.kt")
+      public void testExternalProperty() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalProperty.kt");
+      }
+
+      @Test
+      @TestMetadata("topLevelVarargFun.kt")
+      public void testTopLevelVarargFun() {
+        runTest("js/js.translator/testData/box/jsImport/named/topLevelVarargFun.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsImport/namespaced")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Namespaced {
+      @Test
+      public void testAllFilesPresentInNamespaced() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsImport/namespaced/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("jsExternalInheritorsOnly.kt")
+      public void testJsExternalInheritorsOnly() {
+        runTest("js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsImport/plainNamed")
+    @TestDataPath("$PROJECT_ROOT")
+    public class PlainNamed {
+      @Test
+      public void testAllFilesPresentInPlainNamed() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Test
+      @TestMetadata("externalClassNameClash.kt")
+      public void testExternalClassNameClash() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/externalClassNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalPackage.kt")
+      public void testExternalPackage() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/externalPackage.kt");
+      }
+
+      @Test
+      @TestMetadata("externalPackageInDifferentFile.kt")
+      public void testExternalPackageInDifferentFile() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+      }
+
+      @Test
+      @TestMetadata("interfaces.kt")
+      public void testInterfaces() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/interfaces.kt");
+      }
+
+      @Test
+      @TestMetadata("interfacesWithCompanion.kt")
+      public void testInterfacesWithCompanion() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.kt");
+      }
+    }
+  }
+
+  @Nested
   @TestMetadata("js/js.translator/testData/box/jsModule")
   @TestDataPath("$PROJECT_ROOT")
   public class JsModule {
diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsOldFrontendDiagnosticsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsOldFrontendDiagnosticsTestGenerated.java
index 9e18285..5745eca 100644
--- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsOldFrontendDiagnosticsTestGenerated.java
+++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsOldFrontendDiagnosticsTestGenerated.java
@@ -542,6 +542,70 @@
   }
 
   @Nested
+  @TestMetadata("compiler/testData/diagnostics/testsWithJsStdLib/import")
+  @TestDataPath("$PROJECT_ROOT")
+  public class Import {
+    @Test
+    public void testAllFilesPresentInImport() {
+      KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithJsStdLib/import"), Pattern.compile("^([^_](.+))\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), TargetBackend.JS_IR, true);
+    }
+
+    @Test
+    @TestMetadata("jsImportOptionsWithoutJsImport.kt")
+    public void testJsImportOptionsWithoutJsImport() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/jsImportOptionsWithoutJsImport.kt");
+    }
+
+    @Test
+    @TestMetadata("jsVarProhibited.kt")
+    public void testJsVarProhibited() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/jsVarProhibited.kt");
+    }
+
+    @Test
+    @TestMetadata("mixedJsImportAndJsModule.kt")
+    public void testMixedJsImportAndJsModule() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsModule.kt");
+    }
+
+    @Test
+    @TestMetadata("mixedJsImportAndJsQualifier.kt")
+    public void testMixedJsImportAndJsQualifier() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsQualifier.kt");
+    }
+
+    @Test
+    @TestMetadata("multipleJsImportOptions.kt")
+    public void testMultipleJsImportOptions() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/multipleJsImportOptions.kt");
+    }
+
+    @Test
+    @TestMetadata("namespaceInsideFileJsImport.kt")
+    public void testNamespaceInsideFileJsImport() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/namespaceInsideFileJsImport.kt");
+    }
+
+    @Test
+    @TestMetadata("nestedProhibited.kt")
+    public void testNestedProhibited() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/nestedProhibited.kt");
+    }
+
+    @Test
+    @TestMetadata("nonObjectNamespace.kt")
+    public void testNonObjectNamespace() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/nonObjectNamespace.kt");
+    }
+
+    @Test
+    @TestMetadata("prohibitedOnNonNative.kt")
+    public void testProhibitedOnNonNative() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/prohibitedOnNonNative.kt");
+    }
+  }
+
+  @Nested
   @TestMetadata("compiler/testData/diagnostics/testsWithJsStdLib/inline")
   @TestDataPath("$PROJECT_ROOT")
   public class Inline {
diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsBoxTestGenerated.java
index 75c3de0..3996726 100644
--- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsBoxTestGenerated.java
+++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsBoxTestGenerated.java
@@ -2525,6 +2525,360 @@
     }
 
     @Nested
+    @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport")
+    @TestDataPath("$PROJECT_ROOT")
+    public class JsFileImport {
+      @Test
+      public void testAllFilesPresentInJsFileImport() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/default")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Default {
+        @Test
+        public void testAllFilesPresentInDefault() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalClassWithDefaults.kt")
+        public void testExternalClassWithDefaults() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.kt");
+        }
+
+        @Test
+        @TestMetadata("externalConstructor.kt")
+        public void testExternalConstructor() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/named")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Named {
+        @Test
+        public void testAllFilesPresentInNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalClassWithDefaults.kt")
+        public void testExternalClassWithDefaults() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.kt");
+        }
+
+        @Test
+        @TestMetadata("externalConstructor.kt")
+        public void testExternalConstructor() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/plainNamed")
+      @TestDataPath("$PROJECT_ROOT")
+      public class PlainNamed {
+        @Test
+        public void testAllFilesPresentInPlainNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+        }
+
+        @Test
+        @TestMetadata("externalClassNameClash.kt")
+        public void testExternalClassNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalClassNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackage.kt")
+        public void testExternalPackage() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackageInDifferentFile.kt")
+        public void testExternalPackageInDifferentFile() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+        }
+
+        @Test
+        @TestMetadata("interfaces.kt")
+        public void testInterfaces() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.kt");
+        }
+
+        @Test
+        @TestMetadata("interfacesWithCompanion.kt")
+        public void testInterfacesWithCompanion() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.kt");
+        }
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/esModules/jsImport")
+    @TestDataPath("$PROJECT_ROOT")
+    public class JsImport {
+      @Test
+      public void testAllFilesPresentInJsImport() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/default")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Default {
+        @Test
+        public void testAllFilesPresentInDefault() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalClassWithDefaults.kt")
+        public void testExternalClassWithDefaults() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.kt");
+        }
+
+        @Test
+        @TestMetadata("externalConstructor.kt")
+        public void testExternalConstructor() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/named")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Named {
+        @Test
+        public void testAllFilesPresentInNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalClassWithDefaults.kt")
+        public void testExternalClassWithDefaults() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.kt");
+        }
+
+        @Test
+        @TestMetadata("externalConstructor.kt")
+        public void testExternalConstructor() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/namespaced")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Namespaced {
+        @Test
+        public void testAllFilesPresentInNamespaced() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("jsExternalInheritorsOnly.kt")
+        public void testJsExternalInheritorsOnly() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/plainNamed")
+      @TestDataPath("$PROJECT_ROOT")
+      public class PlainNamed {
+        @Test
+        public void testAllFilesPresentInPlainNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+        }
+
+        @Test
+        @TestMetadata("externalClassNameClash.kt")
+        public void testExternalClassNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalClassNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackage.kt")
+        public void testExternalPackage() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackageInDifferentFile.kt")
+        public void testExternalPackageInDifferentFile() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+        }
+
+        @Test
+        @TestMetadata("interfaces.kt")
+        public void testInterfaces() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.kt");
+        }
+
+        @Test
+        @TestMetadata("interfacesWithCompanion.kt")
+        public void testInterfacesWithCompanion() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.kt");
+        }
+      }
+    }
+
+    @Nested
     @TestMetadata("js/js.translator/testData/box/esModules/jsModule")
     @TestDataPath("$PROJECT_ROOT")
     public class JsModule {
@@ -7456,6 +7810,360 @@
   }
 
   @Nested
+  @TestMetadata("js/js.translator/testData/box/jsFileImport")
+  @TestDataPath("$PROJECT_ROOT")
+  public class JsFileImport {
+    @Test
+    public void testAllFilesPresentInJsFileImport() {
+      KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsFileImport/default")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Default {
+      @Test
+      public void testAllFilesPresentInDefault() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Test
+      @TestMetadata("externalClass.kt")
+      public void testExternalClass() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalClass.kt");
+      }
+
+      @Test
+      @TestMetadata("externalClassWithDefaults.kt")
+      public void testExternalClassWithDefaults() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.kt");
+      }
+
+      @Test
+      @TestMetadata("externalConstructor.kt")
+      public void testExternalConstructor() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalConstructor.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunction.kt")
+      public void testExternalFunction() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalFunction.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunctionNameClash.kt")
+      public void testExternalFunctionNameClash() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("externalProperty.kt")
+      public void testExternalProperty() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalProperty.kt");
+      }
+
+      @Test
+      @TestMetadata("topLevelVarargFun.kt")
+      public void testTopLevelVarargFun() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsFileImport/named")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Named {
+      @Test
+      public void testAllFilesPresentInNamed() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Test
+      @TestMetadata("externalClass.kt")
+      public void testExternalClass() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalClass.kt");
+      }
+
+      @Test
+      @TestMetadata("externalClassWithDefaults.kt")
+      public void testExternalClassWithDefaults() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.kt");
+      }
+
+      @Test
+      @TestMetadata("externalConstructor.kt")
+      public void testExternalConstructor() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalConstructor.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunction.kt")
+      public void testExternalFunction() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalFunction.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunctionNameClash.kt")
+      public void testExternalFunctionNameClash() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("externalProperty.kt")
+      public void testExternalProperty() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalProperty.kt");
+      }
+
+      @Test
+      @TestMetadata("topLevelVarargFun.kt")
+      public void testTopLevelVarargFun() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsFileImport/plainNamed")
+    @TestDataPath("$PROJECT_ROOT")
+    public class PlainNamed {
+      @Test
+      public void testAllFilesPresentInPlainNamed() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Test
+      @TestMetadata("externalClassNameClash.kt")
+      public void testExternalClassNameClash() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalClassNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalPackage.kt")
+      public void testExternalPackage() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.kt");
+      }
+
+      @Test
+      @TestMetadata("externalPackageInDifferentFile.kt")
+      public void testExternalPackageInDifferentFile() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+      }
+
+      @Test
+      @TestMetadata("interfaces.kt")
+      public void testInterfaces() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.kt");
+      }
+
+      @Test
+      @TestMetadata("interfacesWithCompanion.kt")
+      public void testInterfacesWithCompanion() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.kt");
+      }
+    }
+  }
+
+  @Nested
+  @TestMetadata("js/js.translator/testData/box/jsImport")
+  @TestDataPath("$PROJECT_ROOT")
+  public class JsImport {
+    @Test
+    public void testAllFilesPresentInJsImport() {
+      KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsImport/default")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Default {
+      @Test
+      public void testAllFilesPresentInDefault() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Test
+      @TestMetadata("externalClass.kt")
+      public void testExternalClass() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalClass.kt");
+      }
+
+      @Test
+      @TestMetadata("externalClassWithDefaults.kt")
+      public void testExternalClassWithDefaults() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.kt");
+      }
+
+      @Test
+      @TestMetadata("externalConstructor.kt")
+      public void testExternalConstructor() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalConstructor.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunction.kt")
+      public void testExternalFunction() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalFunction.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunctionNameClash.kt")
+      public void testExternalFunctionNameClash() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("externalProperty.kt")
+      public void testExternalProperty() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalProperty.kt");
+      }
+
+      @Test
+      @TestMetadata("topLevelVarargFun.kt")
+      public void testTopLevelVarargFun() {
+        runTest("js/js.translator/testData/box/jsImport/default/topLevelVarargFun.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsImport/named")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Named {
+      @Test
+      public void testAllFilesPresentInNamed() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Test
+      @TestMetadata("externalClass.kt")
+      public void testExternalClass() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalClass.kt");
+      }
+
+      @Test
+      @TestMetadata("externalClassWithDefaults.kt")
+      public void testExternalClassWithDefaults() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.kt");
+      }
+
+      @Test
+      @TestMetadata("externalConstructor.kt")
+      public void testExternalConstructor() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalConstructor.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunction.kt")
+      public void testExternalFunction() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalFunction.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunctionNameClash.kt")
+      public void testExternalFunctionNameClash() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("externalProperty.kt")
+      public void testExternalProperty() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalProperty.kt");
+      }
+
+      @Test
+      @TestMetadata("topLevelVarargFun.kt")
+      public void testTopLevelVarargFun() {
+        runTest("js/js.translator/testData/box/jsImport/named/topLevelVarargFun.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsImport/namespaced")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Namespaced {
+      @Test
+      public void testAllFilesPresentInNamespaced() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsImport/namespaced/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("jsExternalInheritorsOnly.kt")
+      public void testJsExternalInheritorsOnly() {
+        runTest("js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsImport/plainNamed")
+    @TestDataPath("$PROJECT_ROOT")
+    public class PlainNamed {
+      @Test
+      public void testAllFilesPresentInPlainNamed() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Test
+      @TestMetadata("externalClassNameClash.kt")
+      public void testExternalClassNameClash() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/externalClassNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalPackage.kt")
+      public void testExternalPackage() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/externalPackage.kt");
+      }
+
+      @Test
+      @TestMetadata("externalPackageInDifferentFile.kt")
+      public void testExternalPackageInDifferentFile() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+      }
+
+      @Test
+      @TestMetadata("interfaces.kt")
+      public void testInterfaces() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/interfaces.kt");
+      }
+
+      @Test
+      @TestMetadata("interfacesWithCompanion.kt")
+      public void testInterfacesWithCompanion() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.kt");
+      }
+    }
+  }
+
+  @Nested
   @TestMetadata("js/js.translator/testData/box/jsModule")
   @TestDataPath("$PROJECT_ROOT")
   public class JsModule {
diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsOldFrontendDiagnosticsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsOldFrontendDiagnosticsTestGenerated.java
index dccb1c0..576813b 100644
--- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsOldFrontendDiagnosticsTestGenerated.java
+++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsOldFrontendDiagnosticsTestGenerated.java
@@ -542,6 +542,70 @@
   }
 
   @Nested
+  @TestMetadata("compiler/testData/diagnostics/testsWithJsStdLib/import")
+  @TestDataPath("$PROJECT_ROOT")
+  public class Import {
+    @Test
+    public void testAllFilesPresentInImport() {
+      KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithJsStdLib/import"), Pattern.compile("^([^_](.+))\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), TargetBackend.JS_IR, true);
+    }
+
+    @Test
+    @TestMetadata("jsImportOptionsWithoutJsImport.kt")
+    public void testJsImportOptionsWithoutJsImport() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/jsImportOptionsWithoutJsImport.kt");
+    }
+
+    @Test
+    @TestMetadata("jsVarProhibited.kt")
+    public void testJsVarProhibited() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/jsVarProhibited.kt");
+    }
+
+    @Test
+    @TestMetadata("mixedJsImportAndJsModule.kt")
+    public void testMixedJsImportAndJsModule() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsModule.kt");
+    }
+
+    @Test
+    @TestMetadata("mixedJsImportAndJsQualifier.kt")
+    public void testMixedJsImportAndJsQualifier() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsQualifier.kt");
+    }
+
+    @Test
+    @TestMetadata("multipleJsImportOptions.kt")
+    public void testMultipleJsImportOptions() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/multipleJsImportOptions.kt");
+    }
+
+    @Test
+    @TestMetadata("namespaceInsideFileJsImport.kt")
+    public void testNamespaceInsideFileJsImport() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/namespaceInsideFileJsImport.kt");
+    }
+
+    @Test
+    @TestMetadata("nestedProhibited.kt")
+    public void testNestedProhibited() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/nestedProhibited.kt");
+    }
+
+    @Test
+    @TestMetadata("nonObjectNamespace.kt")
+    public void testNonObjectNamespace() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/nonObjectNamespace.kt");
+    }
+
+    @Test
+    @TestMetadata("prohibitedOnNonNative.kt")
+    public void testProhibitedOnNonNative() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/prohibitedOnNonNative.kt");
+    }
+  }
+
+  @Nested
   @TestMetadata("compiler/testData/diagnostics/testsWithJsStdLib/inline")
   @TestDataPath("$PROJECT_ROOT")
   public class Inline {
diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/DiagnosticsWithJsStdLibTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/DiagnosticsWithJsStdLibTestGenerated.java
index dd3f1d8..d15591b0 100644
--- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/DiagnosticsWithJsStdLibTestGenerated.java
+++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/DiagnosticsWithJsStdLibTestGenerated.java
@@ -542,6 +542,70 @@
   }
 
   @Nested
+  @TestMetadata("compiler/testData/diagnostics/testsWithJsStdLib/import")
+  @TestDataPath("$PROJECT_ROOT")
+  public class Import {
+    @Test
+    public void testAllFilesPresentInImport() {
+      KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithJsStdLib/import"), Pattern.compile("^([^_](.+))\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), TargetBackend.JS_IR, true);
+    }
+
+    @Test
+    @TestMetadata("jsImportOptionsWithoutJsImport.kt")
+    public void testJsImportOptionsWithoutJsImport() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/jsImportOptionsWithoutJsImport.kt");
+    }
+
+    @Test
+    @TestMetadata("jsVarProhibited.kt")
+    public void testJsVarProhibited() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/jsVarProhibited.kt");
+    }
+
+    @Test
+    @TestMetadata("mixedJsImportAndJsModule.kt")
+    public void testMixedJsImportAndJsModule() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsModule.kt");
+    }
+
+    @Test
+    @TestMetadata("mixedJsImportAndJsQualifier.kt")
+    public void testMixedJsImportAndJsQualifier() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsQualifier.kt");
+    }
+
+    @Test
+    @TestMetadata("multipleJsImportOptions.kt")
+    public void testMultipleJsImportOptions() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/multipleJsImportOptions.kt");
+    }
+
+    @Test
+    @TestMetadata("namespaceInsideFileJsImport.kt")
+    public void testNamespaceInsideFileJsImport() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/namespaceInsideFileJsImport.kt");
+    }
+
+    @Test
+    @TestMetadata("nestedProhibited.kt")
+    public void testNestedProhibited() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/nestedProhibited.kt");
+    }
+
+    @Test
+    @TestMetadata("nonObjectNamespace.kt")
+    public void testNonObjectNamespace() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/nonObjectNamespace.kt");
+    }
+
+    @Test
+    @TestMetadata("prohibitedOnNonNative.kt")
+    public void testProhibitedOnNonNative() {
+      runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/prohibitedOnNonNative.kt");
+    }
+  }
+
+  @Nested
   @TestMetadata("compiler/testData/diagnostics/testsWithJsStdLib/inline")
   @TestDataPath("$PROJECT_ROOT")
   public class Inline {
diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java
index 68765e0..80627c3 100644
--- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java
+++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java
@@ -2631,6 +2631,360 @@
     }
 
     @Nested
+    @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport")
+    @TestDataPath("$PROJECT_ROOT")
+    public class JsFileImport {
+      @Test
+      public void testAllFilesPresentInJsFileImport() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/default")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Default {
+        @Test
+        public void testAllFilesPresentInDefault() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalClassWithDefaults.kt")
+        public void testExternalClassWithDefaults() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.kt");
+        }
+
+        @Test
+        @TestMetadata("externalConstructor.kt")
+        public void testExternalConstructor() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/named")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Named {
+        @Test
+        public void testAllFilesPresentInNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalClassWithDefaults.kt")
+        public void testExternalClassWithDefaults() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.kt");
+        }
+
+        @Test
+        @TestMetadata("externalConstructor.kt")
+        public void testExternalConstructor() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/plainNamed")
+      @TestDataPath("$PROJECT_ROOT")
+      public class PlainNamed {
+        @Test
+        public void testAllFilesPresentInPlainNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+        }
+
+        @Test
+        @TestMetadata("externalClassNameClash.kt")
+        public void testExternalClassNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalClassNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackage.kt")
+        public void testExternalPackage() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackageInDifferentFile.kt")
+        public void testExternalPackageInDifferentFile() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+        }
+
+        @Test
+        @TestMetadata("interfaces.kt")
+        public void testInterfaces() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.kt");
+        }
+
+        @Test
+        @TestMetadata("interfacesWithCompanion.kt")
+        public void testInterfacesWithCompanion() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.kt");
+        }
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/esModules/jsImport")
+    @TestDataPath("$PROJECT_ROOT")
+    public class JsImport {
+      @Test
+      public void testAllFilesPresentInJsImport() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/default")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Default {
+        @Test
+        public void testAllFilesPresentInDefault() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalClassWithDefaults.kt")
+        public void testExternalClassWithDefaults() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.kt");
+        }
+
+        @Test
+        @TestMetadata("externalConstructor.kt")
+        public void testExternalConstructor() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/named")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Named {
+        @Test
+        public void testAllFilesPresentInNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalClassWithDefaults.kt")
+        public void testExternalClassWithDefaults() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.kt");
+        }
+
+        @Test
+        @TestMetadata("externalConstructor.kt")
+        public void testExternalConstructor() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/namespaced")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Namespaced {
+        @Test
+        public void testAllFilesPresentInNamespaced() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("jsExternalInheritorsOnly.kt")
+        public void testJsExternalInheritorsOnly() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/plainNamed")
+      @TestDataPath("$PROJECT_ROOT")
+      public class PlainNamed {
+        @Test
+        public void testAllFilesPresentInPlainNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+        }
+
+        @Test
+        @TestMetadata("externalClassNameClash.kt")
+        public void testExternalClassNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalClassNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackage.kt")
+        public void testExternalPackage() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackageInDifferentFile.kt")
+        public void testExternalPackageInDifferentFile() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+        }
+
+        @Test
+        @TestMetadata("interfaces.kt")
+        public void testInterfaces() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.kt");
+        }
+
+        @Test
+        @TestMetadata("interfacesWithCompanion.kt")
+        public void testInterfacesWithCompanion() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.kt");
+        }
+      }
+    }
+
+    @Nested
     @TestMetadata("js/js.translator/testData/box/esModules/jsModule")
     @TestDataPath("$PROJECT_ROOT")
     public class JsModule {
@@ -7562,6 +7916,360 @@
   }
 
   @Nested
+  @TestMetadata("js/js.translator/testData/box/jsFileImport")
+  @TestDataPath("$PROJECT_ROOT")
+  public class JsFileImport {
+    @Test
+    public void testAllFilesPresentInJsFileImport() {
+      KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsFileImport/default")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Default {
+      @Test
+      public void testAllFilesPresentInDefault() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+      }
+
+      @Test
+      @TestMetadata("externalClass.kt")
+      public void testExternalClass() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalClass.kt");
+      }
+
+      @Test
+      @TestMetadata("externalClassWithDefaults.kt")
+      public void testExternalClassWithDefaults() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.kt");
+      }
+
+      @Test
+      @TestMetadata("externalConstructor.kt")
+      public void testExternalConstructor() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalConstructor.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunction.kt")
+      public void testExternalFunction() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalFunction.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunctionNameClash.kt")
+      public void testExternalFunctionNameClash() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("externalProperty.kt")
+      public void testExternalProperty() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalProperty.kt");
+      }
+
+      @Test
+      @TestMetadata("topLevelVarargFun.kt")
+      public void testTopLevelVarargFun() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsFileImport/named")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Named {
+      @Test
+      public void testAllFilesPresentInNamed() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+      }
+
+      @Test
+      @TestMetadata("externalClass.kt")
+      public void testExternalClass() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalClass.kt");
+      }
+
+      @Test
+      @TestMetadata("externalClassWithDefaults.kt")
+      public void testExternalClassWithDefaults() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.kt");
+      }
+
+      @Test
+      @TestMetadata("externalConstructor.kt")
+      public void testExternalConstructor() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalConstructor.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunction.kt")
+      public void testExternalFunction() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalFunction.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunctionNameClash.kt")
+      public void testExternalFunctionNameClash() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("externalProperty.kt")
+      public void testExternalProperty() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalProperty.kt");
+      }
+
+      @Test
+      @TestMetadata("topLevelVarargFun.kt")
+      public void testTopLevelVarargFun() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsFileImport/plainNamed")
+    @TestDataPath("$PROJECT_ROOT")
+    public class PlainNamed {
+      @Test
+      public void testAllFilesPresentInPlainNamed() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+      }
+
+      @Test
+      @TestMetadata("externalClassNameClash.kt")
+      public void testExternalClassNameClash() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalClassNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalPackage.kt")
+      public void testExternalPackage() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.kt");
+      }
+
+      @Test
+      @TestMetadata("externalPackageInDifferentFile.kt")
+      public void testExternalPackageInDifferentFile() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+      }
+
+      @Test
+      @TestMetadata("interfaces.kt")
+      public void testInterfaces() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.kt");
+      }
+
+      @Test
+      @TestMetadata("interfacesWithCompanion.kt")
+      public void testInterfacesWithCompanion() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.kt");
+      }
+    }
+  }
+
+  @Nested
+  @TestMetadata("js/js.translator/testData/box/jsImport")
+  @TestDataPath("$PROJECT_ROOT")
+  public class JsImport {
+    @Test
+    public void testAllFilesPresentInJsImport() {
+      KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsImport/default")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Default {
+      @Test
+      public void testAllFilesPresentInDefault() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+      }
+
+      @Test
+      @TestMetadata("externalClass.kt")
+      public void testExternalClass() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalClass.kt");
+      }
+
+      @Test
+      @TestMetadata("externalClassWithDefaults.kt")
+      public void testExternalClassWithDefaults() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.kt");
+      }
+
+      @Test
+      @TestMetadata("externalConstructor.kt")
+      public void testExternalConstructor() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalConstructor.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunction.kt")
+      public void testExternalFunction() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalFunction.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunctionNameClash.kt")
+      public void testExternalFunctionNameClash() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("externalProperty.kt")
+      public void testExternalProperty() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalProperty.kt");
+      }
+
+      @Test
+      @TestMetadata("topLevelVarargFun.kt")
+      public void testTopLevelVarargFun() {
+        runTest("js/js.translator/testData/box/jsImport/default/topLevelVarargFun.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsImport/named")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Named {
+      @Test
+      public void testAllFilesPresentInNamed() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+      }
+
+      @Test
+      @TestMetadata("externalClass.kt")
+      public void testExternalClass() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalClass.kt");
+      }
+
+      @Test
+      @TestMetadata("externalClassWithDefaults.kt")
+      public void testExternalClassWithDefaults() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.kt");
+      }
+
+      @Test
+      @TestMetadata("externalConstructor.kt")
+      public void testExternalConstructor() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalConstructor.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunction.kt")
+      public void testExternalFunction() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalFunction.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunctionNameClash.kt")
+      public void testExternalFunctionNameClash() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("externalProperty.kt")
+      public void testExternalProperty() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalProperty.kt");
+      }
+
+      @Test
+      @TestMetadata("topLevelVarargFun.kt")
+      public void testTopLevelVarargFun() {
+        runTest("js/js.translator/testData/box/jsImport/named/topLevelVarargFun.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsImport/namespaced")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Namespaced {
+      @Test
+      public void testAllFilesPresentInNamespaced() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsImport/namespaced/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("jsExternalInheritorsOnly.kt")
+      public void testJsExternalInheritorsOnly() {
+        runTest("js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsImport/plainNamed")
+    @TestDataPath("$PROJECT_ROOT")
+    public class PlainNamed {
+      @Test
+      public void testAllFilesPresentInPlainNamed() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+      }
+
+      @Test
+      @TestMetadata("externalClassNameClash.kt")
+      public void testExternalClassNameClash() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/externalClassNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalPackage.kt")
+      public void testExternalPackage() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/externalPackage.kt");
+      }
+
+      @Test
+      @TestMetadata("externalPackageInDifferentFile.kt")
+      public void testExternalPackageInDifferentFile() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+      }
+
+      @Test
+      @TestMetadata("interfaces.kt")
+      public void testInterfaces() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/interfaces.kt");
+      }
+
+      @Test
+      @TestMetadata("interfacesWithCompanion.kt")
+      public void testInterfacesWithCompanion() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.kt");
+      }
+    }
+  }
+
+  @Nested
   @TestMetadata("js/js.translator/testData/box/jsModule")
   @TestDataPath("$PROJECT_ROOT")
   public class JsModule {
diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java
index c60a540..a03bf2e 100644
--- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java
+++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java
@@ -2525,6 +2525,360 @@
     }
 
     @Nested
+    @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport")
+    @TestDataPath("$PROJECT_ROOT")
+    public class JsFileImport {
+      @Test
+      public void testAllFilesPresentInJsFileImport() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/default")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Default {
+        @Test
+        public void testAllFilesPresentInDefault() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalClassWithDefaults.kt")
+        public void testExternalClassWithDefaults() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.kt");
+        }
+
+        @Test
+        @TestMetadata("externalConstructor.kt")
+        public void testExternalConstructor() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/named")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Named {
+        @Test
+        public void testAllFilesPresentInNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalClassWithDefaults.kt")
+        public void testExternalClassWithDefaults() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.kt");
+        }
+
+        @Test
+        @TestMetadata("externalConstructor.kt")
+        public void testExternalConstructor() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/plainNamed")
+      @TestDataPath("$PROJECT_ROOT")
+      public class PlainNamed {
+        @Test
+        public void testAllFilesPresentInPlainNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+        }
+
+        @Test
+        @TestMetadata("externalClassNameClash.kt")
+        public void testExternalClassNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalClassNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackage.kt")
+        public void testExternalPackage() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackageInDifferentFile.kt")
+        public void testExternalPackageInDifferentFile() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+        }
+
+        @Test
+        @TestMetadata("interfaces.kt")
+        public void testInterfaces() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.kt");
+        }
+
+        @Test
+        @TestMetadata("interfacesWithCompanion.kt")
+        public void testInterfacesWithCompanion() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.kt");
+        }
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/esModules/jsImport")
+    @TestDataPath("$PROJECT_ROOT")
+    public class JsImport {
+      @Test
+      public void testAllFilesPresentInJsImport() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/default")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Default {
+        @Test
+        public void testAllFilesPresentInDefault() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalClassWithDefaults.kt")
+        public void testExternalClassWithDefaults() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.kt");
+        }
+
+        @Test
+        @TestMetadata("externalConstructor.kt")
+        public void testExternalConstructor() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/named")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Named {
+        @Test
+        public void testAllFilesPresentInNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalClassWithDefaults.kt")
+        public void testExternalClassWithDefaults() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.kt");
+        }
+
+        @Test
+        @TestMetadata("externalConstructor.kt")
+        public void testExternalConstructor() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/namespaced")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Namespaced {
+        @Test
+        public void testAllFilesPresentInNamespaced() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("jsExternalInheritorsOnly.kt")
+        public void testJsExternalInheritorsOnly() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/plainNamed")
+      @TestDataPath("$PROJECT_ROOT")
+      public class PlainNamed {
+        @Test
+        public void testAllFilesPresentInPlainNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+        }
+
+        @Test
+        @TestMetadata("externalClassNameClash.kt")
+        public void testExternalClassNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalClassNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackage.kt")
+        public void testExternalPackage() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackageInDifferentFile.kt")
+        public void testExternalPackageInDifferentFile() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+        }
+
+        @Test
+        @TestMetadata("interfaces.kt")
+        public void testInterfaces() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.kt");
+        }
+
+        @Test
+        @TestMetadata("interfacesWithCompanion.kt")
+        public void testInterfacesWithCompanion() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.kt");
+        }
+      }
+    }
+
+    @Nested
     @TestMetadata("js/js.translator/testData/box/esModules/jsModule")
     @TestDataPath("$PROJECT_ROOT")
     public class JsModule {
@@ -7456,6 +7810,360 @@
   }
 
   @Nested
+  @TestMetadata("js/js.translator/testData/box/jsFileImport")
+  @TestDataPath("$PROJECT_ROOT")
+  public class JsFileImport {
+    @Test
+    public void testAllFilesPresentInJsFileImport() {
+      KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsFileImport/default")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Default {
+      @Test
+      public void testAllFilesPresentInDefault() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Test
+      @TestMetadata("externalClass.kt")
+      public void testExternalClass() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalClass.kt");
+      }
+
+      @Test
+      @TestMetadata("externalClassWithDefaults.kt")
+      public void testExternalClassWithDefaults() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.kt");
+      }
+
+      @Test
+      @TestMetadata("externalConstructor.kt")
+      public void testExternalConstructor() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalConstructor.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunction.kt")
+      public void testExternalFunction() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalFunction.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunctionNameClash.kt")
+      public void testExternalFunctionNameClash() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("externalProperty.kt")
+      public void testExternalProperty() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/externalProperty.kt");
+      }
+
+      @Test
+      @TestMetadata("topLevelVarargFun.kt")
+      public void testTopLevelVarargFun() {
+        runTest("js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsFileImport/named")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Named {
+      @Test
+      public void testAllFilesPresentInNamed() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Test
+      @TestMetadata("externalClass.kt")
+      public void testExternalClass() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalClass.kt");
+      }
+
+      @Test
+      @TestMetadata("externalClassWithDefaults.kt")
+      public void testExternalClassWithDefaults() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.kt");
+      }
+
+      @Test
+      @TestMetadata("externalConstructor.kt")
+      public void testExternalConstructor() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalConstructor.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunction.kt")
+      public void testExternalFunction() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalFunction.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunctionNameClash.kt")
+      public void testExternalFunctionNameClash() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("externalProperty.kt")
+      public void testExternalProperty() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/externalProperty.kt");
+      }
+
+      @Test
+      @TestMetadata("topLevelVarargFun.kt")
+      public void testTopLevelVarargFun() {
+        runTest("js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsFileImport/plainNamed")
+    @TestDataPath("$PROJECT_ROOT")
+    public class PlainNamed {
+      @Test
+      public void testAllFilesPresentInPlainNamed() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Test
+      @TestMetadata("externalClassNameClash.kt")
+      public void testExternalClassNameClash() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalClassNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalPackage.kt")
+      public void testExternalPackage() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.kt");
+      }
+
+      @Test
+      @TestMetadata("externalPackageInDifferentFile.kt")
+      public void testExternalPackageInDifferentFile() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+      }
+
+      @Test
+      @TestMetadata("interfaces.kt")
+      public void testInterfaces() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.kt");
+      }
+
+      @Test
+      @TestMetadata("interfacesWithCompanion.kt")
+      public void testInterfacesWithCompanion() {
+        runTest("js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.kt");
+      }
+    }
+  }
+
+  @Nested
+  @TestMetadata("js/js.translator/testData/box/jsImport")
+  @TestDataPath("$PROJECT_ROOT")
+  public class JsImport {
+    @Test
+    public void testAllFilesPresentInJsImport() {
+      KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsImport/default")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Default {
+      @Test
+      public void testAllFilesPresentInDefault() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Test
+      @TestMetadata("externalClass.kt")
+      public void testExternalClass() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalClass.kt");
+      }
+
+      @Test
+      @TestMetadata("externalClassWithDefaults.kt")
+      public void testExternalClassWithDefaults() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.kt");
+      }
+
+      @Test
+      @TestMetadata("externalConstructor.kt")
+      public void testExternalConstructor() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalConstructor.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunction.kt")
+      public void testExternalFunction() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalFunction.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunctionNameClash.kt")
+      public void testExternalFunctionNameClash() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("externalProperty.kt")
+      public void testExternalProperty() {
+        runTest("js/js.translator/testData/box/jsImport/default/externalProperty.kt");
+      }
+
+      @Test
+      @TestMetadata("topLevelVarargFun.kt")
+      public void testTopLevelVarargFun() {
+        runTest("js/js.translator/testData/box/jsImport/default/topLevelVarargFun.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsImport/named")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Named {
+      @Test
+      public void testAllFilesPresentInNamed() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Test
+      @TestMetadata("externalClass.kt")
+      public void testExternalClass() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalClass.kt");
+      }
+
+      @Test
+      @TestMetadata("externalClassWithDefaults.kt")
+      public void testExternalClassWithDefaults() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.kt");
+      }
+
+      @Test
+      @TestMetadata("externalConstructor.kt")
+      public void testExternalConstructor() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalConstructor.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunction.kt")
+      public void testExternalFunction() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalFunction.kt");
+      }
+
+      @Test
+      @TestMetadata("externalFunctionNameClash.kt")
+      public void testExternalFunctionNameClash() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("externalProperty.kt")
+      public void testExternalProperty() {
+        runTest("js/js.translator/testData/box/jsImport/named/externalProperty.kt");
+      }
+
+      @Test
+      @TestMetadata("topLevelVarargFun.kt")
+      public void testTopLevelVarargFun() {
+        runTest("js/js.translator/testData/box/jsImport/named/topLevelVarargFun.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsImport/namespaced")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Namespaced {
+      @Test
+      public void testAllFilesPresentInNamespaced() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Test
+      @TestMetadata("externalObject.kt")
+      public void testExternalObject() {
+        runTest("js/js.translator/testData/box/jsImport/namespaced/externalObject.kt");
+      }
+
+      @Test
+      @TestMetadata("jsExternalInheritorsOnly.kt")
+      public void testJsExternalInheritorsOnly() {
+        runTest("js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.kt");
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/jsImport/plainNamed")
+    @TestDataPath("$PROJECT_ROOT")
+    public class PlainNamed {
+      @Test
+      public void testAllFilesPresentInPlainNamed() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+      }
+
+      @Test
+      @TestMetadata("externalClassNameClash.kt")
+      public void testExternalClassNameClash() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/externalClassNameClash.kt");
+      }
+
+      @Test
+      @TestMetadata("externalPackage.kt")
+      public void testExternalPackage() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/externalPackage.kt");
+      }
+
+      @Test
+      @TestMetadata("externalPackageInDifferentFile.kt")
+      public void testExternalPackageInDifferentFile() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+      }
+
+      @Test
+      @TestMetadata("interfaces.kt")
+      public void testInterfaces() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/interfaces.kt");
+      }
+
+      @Test
+      @TestMetadata("interfacesWithCompanion.kt")
+      public void testInterfacesWithCompanion() {
+        runTest("js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.kt");
+      }
+    }
+  }
+
+  @Nested
   @TestMetadata("js/js.translator/testData/box/jsModule")
   @TestDataPath("$PROJECT_ROOT")
   public class JsModule {
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.kt b/js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.kt
new file mode 100644
index 0000000..c076b62
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.kt
@@ -0,0 +1,34 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+@file:JsImport("./externalClass.mjs")
+package foo
+
+@JsImport.Default
+external class A(x: Int = definedExternally) {
+    val x: Int
+
+    fun foo(y: Int): Int = definedExternally
+
+    fun bar(vararg arg: String): String = definedExternally
+}
+
+class C {
+    val e = arrayOf("e")
+    val f = arrayOf("f")
+    val a = A(1)
+
+    fun qux() = a.bar(*e, *f)
+}
+
+
+fun box(): String {
+    val a = A(23)
+    assertEquals(23, a.x)
+    assertEquals(65, a.foo(42))
+
+    assertEquals(C().qux(), "(ef)")
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.mjs b/js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.mjs
new file mode 100644
index 0000000..848fe5d
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.mjs
@@ -0,0 +1,11 @@
+export default function A(x) {
+    this.x = x;
+}
+
+A.prototype.foo = function (y) {
+    return this.x + y;
+};
+
+A.prototype.bar = function() {
+    return "(" + Array.prototype.join.call(arguments, "") + ")";
+};
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.kt b/js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.kt
new file mode 100644
index 0000000..9ea3510
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.kt
@@ -0,0 +1,50 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+@file:JsImport("./externalClassWithDefaults.mjs")
+package foo
+
+@JsImport.Default
+external open class A(ss: String = definedExternally) {
+    val s: String
+    fun foo(y: String = definedExternally): String = definedExternally
+    fun bar(y: String = definedExternally): String = definedExternally
+}
+
+class C: A {
+    constructor(ss: String) : super(ss) {}
+    constructor() : super() {}
+
+    fun qux(s: String = "O") = s
+}
+
+
+fun box(): String {
+    val a = A()
+    val c = C()
+
+    val r1 = a.foo("O") + c.foo()
+    if (r1 != "OK") return "Fail1: $r1"
+
+    val r2 = a.bar() + c.bar("K")
+    if (r2 != "OK") return "Fail2: $r2"
+
+    val r3 = c.qux() + c.qux("K")
+    if (r3 != "OK") return "Fail3: $r3"
+
+    if (a.s != "A") return "Fail4: ${a.s}"
+    if (c.s != "A") return "Fail5: ${c.s}"
+
+    val a2 = A("A2")
+    val c2 = C("C2")
+
+    val r6 = a2.s + c2.s
+    if (r6 != "A2C2") return "Fail6: $r6"
+
+    return "OK"
+
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.mjs b/js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.mjs
new file mode 100644
index 0000000..1a1ebc0
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.mjs
@@ -0,0 +1,9 @@
+export default function A(ss) {
+    this.s = ss || "A"
+}
+A.prototype.foo = function (y) {
+    return y || "K";
+};
+A.prototype.bar = function (y) {
+    return y || "O";
+};
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.kt b/js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.kt
new file mode 100644
index 0000000..26dd18e
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.kt
@@ -0,0 +1,30 @@
+// EXPECTED_REACHABLE_NODES: 1334
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+@file:JsImport("./externalConstructor.mjs")
+package foo
+
+@JsImport.Default
+open external class A(data: String) {
+    constructor(data: Int)
+    constructor(data: Boolean)
+
+    val data: Any
+}
+
+class B(data: String) : A(data)
+
+class C(data: Int) : A(data)
+
+class D(data: Boolean) : A(data)
+
+fun box(): String {
+    assertEquals("13", B("13").data)
+    assertEquals(42, C(42).data)
+    assertEquals(true, D(true).data)
+    return "OK"
+}
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.mjs b/js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.mjs
new file mode 100644
index 0000000..4882be9
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.mjs
@@ -0,0 +1,3 @@
+export default function (data) {
+    this.data = data
+}
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.kt b/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.kt
new file mode 100644
index 0000000..fbcb049
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@file:JsImport("./externalFunction.mjs")
+package foo
+
+@JsImport.Default
+external fun foo(y: Int): Int = definedExternally
+
+fun box(): String {
+    assertEquals(65, foo(42))
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.mjs b/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.mjs
new file mode 100644
index 0000000..b80e3d9
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.mjs
@@ -0,0 +1,3 @@
+export default function(y) {
+    return 23 + y;
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.kt b/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.kt
new file mode 100644
index 0000000..adaff66
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.kt
@@ -0,0 +1,15 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@file:JsImport("./externalFunctionNameClash.mjs")
+package foo
+
+@JsImport.Default
+external fun foo(y: Int): Int = definedExternally
+
+fun foo(y: String): String = y + "K"
+
+fun box(): String {
+    val foo10 = foo(10)
+    if (foo10 != 33) return "Fail: $foo10"
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.mjs b/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.mjs
new file mode 100644
index 0000000..b80e3d9
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.mjs
@@ -0,0 +1,3 @@
+export default function(y) {
+    return 23 + y;
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.kt b/js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.kt
new file mode 100644
index 0000000..da2ba7b
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@file:JsImport("./externalObject.mjs")
+package foo
+
+@JsImport.Default
+external object A {
+    val x: Int = definedExternally
+
+    fun foo(y: Int): Int = definedExternally
+}
+
+fun box(): String {
+    assertEquals(23, A.x)
+    assertEquals(65, A.foo(42))
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.mjs b/js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.mjs
new file mode 100644
index 0000000..5910b6d
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.mjs
@@ -0,0 +1,6 @@
+export default {
+    x: 23,
+    foo: function(y) {
+        return this.x + y;
+    }
+};
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.kt b/js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.kt
new file mode 100644
index 0000000..99d3beb
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@file:JsImport("./externalProperty.mjs")
+package foo
+
+@JsImport.Default
+external val foo: Int = definedExternally
+
+fun box(): String {
+    assertEquals(23, foo)
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.mjs b/js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.mjs
new file mode 100644
index 0000000..19835ca
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.mjs
@@ -0,0 +1 @@
+export default 23;
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.kt b/js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.kt
new file mode 100644
index 0000000..2411008
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@file:JsImport("./topLevelVarargFun.mjs")
+
+@JsImport.Default
+external fun foo(vararg arg: String): String
+
+fun box(): String {
+    val x = arrayOf("a", "b")
+    var r = foo(*x)
+    if (r != "(ab)") return "fail1: $r"
+
+    r = foo("c", "d")
+    if (r != "(cd)") return "fail2: $r"
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.mjs b/js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.mjs
new file mode 100644
index 0000000..a447c76
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.mjs
@@ -0,0 +1,3 @@
+export default function() {
+    return "(" + Array.prototype.join.call(arguments, "") + ")";
+};
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.kt b/js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.kt
new file mode 100644
index 0000000..9b1f7e8
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.kt
@@ -0,0 +1,34 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+@file:JsImport("./externalClass.mjs")
+package foo
+
+@JsImport.Name("Foo")
+external class A(x: Int = definedExternally) {
+    val x: Int
+
+    fun foo(y: Int): Int = definedExternally
+
+    fun bar(vararg arg: String): String = definedExternally
+}
+
+class C {
+    val e = arrayOf("e")
+    val f = arrayOf("f")
+    val a = A(1)
+
+    fun qux() = a.bar(*e, *f)
+}
+
+
+fun box(): String {
+    val a = A(23)
+    assertEquals(23, a.x)
+    assertEquals(65, a.foo(42))
+
+    assertEquals(C().qux(), "(ef)")
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.mjs b/js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.mjs
new file mode 100644
index 0000000..4ba1f27
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.mjs
@@ -0,0 +1,11 @@
+export function Foo(x) {
+    this.x = x;
+}
+
+Foo.prototype.foo = function (y) {
+    return this.x + y;
+};
+
+Foo.prototype.bar = function() {
+    return "(" + Array.prototype.join.call(arguments, "") + ")";
+};
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.kt b/js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.kt
new file mode 100644
index 0000000..907c424
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.kt
@@ -0,0 +1,50 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+@file:JsImport("./externalClassWithDefaults.mjs")
+package foo
+
+@JsImport.Name("Foo")
+external open class A(ss: String = definedExternally) {
+    val s: String
+    fun foo(y: String = definedExternally): String = definedExternally
+    fun bar(y: String = definedExternally): String = definedExternally
+}
+
+class C: A {
+    constructor(ss: String) : super(ss) {}
+    constructor() : super() {}
+
+    fun qux(s: String = "O") = s
+}
+
+
+fun box(): String {
+    val a = A()
+    val c = C()
+
+    val r1 = a.foo("O") + c.foo()
+    if (r1 != "OK") return "Fail1: $r1"
+
+    val r2 = a.bar() + c.bar("K")
+    if (r2 != "OK") return "Fail2: $r2"
+
+    val r3 = c.qux() + c.qux("K")
+    if (r3 != "OK") return "Fail3: $r3"
+
+    if (a.s != "A") return "Fail4: ${a.s}"
+    if (c.s != "A") return "Fail5: ${c.s}"
+
+    val a2 = A("A2")
+    val c2 = C("C2")
+
+    val r6 = a2.s + c2.s
+    if (r6 != "A2C2") return "Fail6: $r6"
+
+    return "OK"
+
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.mjs b/js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.mjs
new file mode 100644
index 0000000..11dd982
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.mjs
@@ -0,0 +1,9 @@
+export function Foo(ss) {
+    this.s = ss || "A"
+}
+Foo.prototype.foo = function (y) {
+    return y || "K";
+};
+Foo.prototype.bar = function (y) {
+    return y || "O";
+};
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.kt b/js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.kt
new file mode 100644
index 0000000..60f8820
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.kt
@@ -0,0 +1,30 @@
+// EXPECTED_REACHABLE_NODES: 1334
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+@file:JsImport("./externalConstructor.mjs")
+package foo
+
+@JsImport.Name("Foo")
+open external class A(data: String) {
+    constructor(data: Int)
+    constructor(data: Boolean)
+
+    val data: Any
+}
+
+class B(data: String) : A(data)
+
+class C(data: Int) : A(data)
+
+class D(data: Boolean) : A(data)
+
+fun box(): String {
+    assertEquals("13", B("13").data)
+    assertEquals(42, C(42).data)
+    assertEquals(true, D(true).data)
+    return "OK"
+}
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.mjs b/js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.mjs
new file mode 100644
index 0000000..98a5db6
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.mjs
@@ -0,0 +1,3 @@
+export function Foo (data) {
+    this.data = data
+}
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.kt b/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.kt
new file mode 100644
index 0000000..bd89fc5
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@file:JsImport("./externalFunction.mjs")
+package foo
+
+@JsImport.Name("bar")
+external fun foo(y: Int): Int = definedExternally
+
+fun box(): String {
+    assertEquals(65, foo(42))
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.mjs b/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.mjs
new file mode 100644
index 0000000..e6b1cc4
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.mjs
@@ -0,0 +1,3 @@
+export function bar(y) {
+    return 23 + y;
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.kt b/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.kt
new file mode 100644
index 0000000..bdf5fbf
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.kt
@@ -0,0 +1,15 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@file:JsImport("./externalFunctionNameClash.mjs")
+package foo
+
+@JsImport.Name("bar")
+external fun foo(y: Int): Int = definedExternally
+
+fun foo(y: String): String = y + "K"
+
+fun box(): String {
+    val foo10 = foo(10)
+    if (foo10 != 33) return "Fail: $foo10"
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.mjs b/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.mjs
new file mode 100644
index 0000000..e6b1cc4
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.mjs
@@ -0,0 +1,3 @@
+export function bar(y) {
+    return 23 + y;
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.kt b/js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.kt
new file mode 100644
index 0000000..f9c7fc7
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@file:JsImport("./externalObject.mjs")
+package foo
+
+@JsImport.Name("O")
+external object A {
+    val x: Int = definedExternally
+
+    fun foo(y: Int): Int = definedExternally
+}
+
+fun box(): String {
+    assertEquals(23, A.x)
+    assertEquals(65, A.foo(42))
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.mjs b/js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.mjs
new file mode 100644
index 0000000..ffa75f7
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.mjs
@@ -0,0 +1,6 @@
+export const O = {
+    x: 23,
+    foo: function(y) {
+        return this.x + y;
+    }
+};
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.kt b/js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.kt
new file mode 100644
index 0000000..4c26535
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@file:JsImport("./externalProperty.mjs")
+package foo
+
+@JsImport.Name("bar")
+external val foo: Int = definedExternally
+
+fun box(): String {
+    assertEquals(23, foo)
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.mjs b/js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.mjs
new file mode 100644
index 0000000..75a47e2
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.mjs
@@ -0,0 +1 @@
+export const bar = 23;
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.kt b/js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.kt
new file mode 100644
index 0000000..7c72b0f
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@file:JsImport("./topLevelVarargFun.mjs")
+
+@JsImport.Name("bar")
+external fun foo(vararg arg: String): String
+
+fun box(): String {
+    val x = arrayOf("a", "b")
+    var r = foo(*x)
+    if (r != "(ab)") return "fail1: $r"
+
+    r = foo("c", "d")
+    if (r != "(cd)") return "fail2: $r"
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.mjs b/js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.mjs
new file mode 100644
index 0000000..c9d2a77
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.mjs
@@ -0,0 +1,3 @@
+export function bar() {
+    return "(" + Array.prototype.join.call(arguments, "") + ")";
+};
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalClassNameClash.kt b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalClassNameClash.kt
new file mode 100644
index 0000000..e99f418
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalClassNameClash.kt
@@ -0,0 +1,62 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+// FILE: a.kt
+@file:JsImport("./a.mjs")
+package a
+
+external class A {
+    fun foo(): String
+}
+
+external fun bar(): Int
+
+external val prop: Int
+
+// FILE: b.kt
+@file:JsImport("./b.mjs")
+package b
+
+external class A {
+    fun foo(): String
+}
+
+external fun bar(): Int
+
+external val prop: Int
+
+// FILE: main.kt
+
+import a.A as O
+import b.A as K
+
+fun box(): String {
+    if (a.bar() != 1) return "fail 1"
+    if (a.prop != 10) return "fail 2"
+    if (b.bar() != 2) return "fail 3"
+    if (b.prop != 20) return "fail 4"
+
+    return O().foo() + K().foo()
+}
+
+// FILE: a.mjs
+export function A() {}
+
+A.prototype.foo = function () {
+   return "O";
+};
+
+export function bar() { return 1; }
+
+export let prop = 10
+
+
+// FILE: b.mjs
+export function A() {}
+
+A.prototype.foo = function () {
+    return "K";
+};
+
+export function bar() { return 2; }
+
+export let prop = 20;
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.kt b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.kt
new file mode 100644
index 0000000..fcfd665
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.kt
@@ -0,0 +1,45 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+// FILE: a.kt
+@file:JsImport("./externalPackage.mjs")
+package foo
+
+external class A(x: Int) {
+    val x: Int
+
+    fun foo(y: Int): Int = definedExternally
+
+    class Nested {
+        val y: Int
+    }
+}
+
+external object B {
+    val x: Int = definedExternally
+
+    fun foo(y: Int): Int = definedExternally
+}
+
+external fun foo(y: Int): Int = definedExternally
+
+external val bar: Int = definedExternally
+
+// FILE: b.kt
+package foo
+
+fun box(): String {
+    val a = A(23)
+    assertEquals(23, a.x)
+    assertEquals(65, a.foo(42))
+
+    val nested = A.Nested()
+    assertEquals(55, nested.y)
+
+    assertEquals(123, B.x)
+    assertEquals(265, B.foo(142))
+
+    assertEquals(365, foo(42))
+    assertEquals(423, bar)
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.mjs b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.mjs
new file mode 100644
index 0000000..da3a03f
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.mjs
@@ -0,0 +1,24 @@
+export function A(x) {
+    this.x = x;
+}
+A.prototype.foo = function (y) {
+    return this.x + y;
+};
+
+function Nested() {
+    this.y = 55;
+}
+A.Nested = Nested;
+
+export var B = {
+    x: 123,
+    foo: function(y) {
+        return this.x + y;
+    }
+};
+
+export function foo(y) {
+    return 323 + y;
+}
+
+export var bar = 423;
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.js b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.js
new file mode 100644
index 0000000..d5a29ec4
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.js
@@ -0,0 +1,5 @@
+C = {
+    f: function() {
+        return 12345;
+    }
+};
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.kt b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.kt
new file mode 100644
index 0000000..08d80c1
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.kt
@@ -0,0 +1,47 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+// FILE: lib.kt
+@file:JsImport("./externalPackageInDifferentFile.mjs")
+package foo
+
+external class A(x: Int = definedExternally) {
+    val x: Int
+
+    fun foo(y: Int): Int = definedExternally
+}
+
+external object B {
+    val x: Int = definedExternally
+
+    fun foo(y: Int): Int = definedExternally
+}
+
+external fun foo(y: Int): Int = definedExternally
+
+external val bar: Int = definedExternally
+
+// FILE: lib2.kt
+package foo
+
+external object C {
+    fun f(): Int = definedExternally
+}
+
+// FILE: main.kt
+package foo
+
+fun box(): String {
+    val a = A(23)
+    assertEquals(23, a.x)
+    assertEquals(65, a.foo(42))
+
+    assertEquals(123, B.x)
+    assertEquals(265, B.foo(142))
+
+    assertEquals(365, foo(42))
+    assertEquals(423, bar)
+
+    assertEquals(12345, C.f())
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.mjs b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.mjs
new file mode 100644
index 0000000..05d3135
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.mjs
@@ -0,0 +1,21 @@
+function A(x) {
+    this.x = x;
+}
+A.prototype.foo = function (y) {
+    return this.x + y;
+};
+
+var B = {
+    x: 123,
+    foo: function(y) {
+        return this.x + y;
+    }
+};
+
+function foo(y) {
+    return 323 + y;
+}
+
+var bar = 423;
+
+export { A, B, foo, bar };
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.kt b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.kt
new file mode 100644
index 0000000..41a7cd2
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.kt
@@ -0,0 +1,41 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// IGNORE_BACKEND: WASM
+// ES_MODULES
+// FILE: bar.kt
+@file:JsImport("./interfaces.mjs")
+package foo
+
+external interface Bar {
+    fun ping(): String
+}
+
+// FILE: baz.kt
+@file:JsImport("./interfaces.mjs")
+package boo
+
+external interface Baz {
+    fun pong(): Int
+}
+
+// FILE: root.kt
+@file:JsImport("./interfaces.mjs")
+import foo.Bar
+import boo.Baz
+
+external val bar: Bar
+external val baz: Baz
+
+// FILE: test.kt
+import boo.Baz
+
+fun box(): String {
+    if (bar.ping() != "ping" || baz.pong() != 194) return "Fail"
+
+    val local = object : Baz {
+        override fun pong(): Int = 322
+    }
+
+    if (local.asDynamic().pong() != 322) return "Fail"
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.mjs b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.mjs
new file mode 100644
index 0000000..b5027cc
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.mjs
@@ -0,0 +1,12 @@
+export var bar = {
+    ping() {
+        return "ping"
+    }
+};
+
+export var baz = {
+    pong() {
+        return 194
+    }
+};
+
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.kt b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.kt
new file mode 100644
index 0000000..a578db2
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.kt
@@ -0,0 +1,20 @@
+// TARGET_BACKEND: JS_IR
+// TARGET_BACKEND: JS_IR_ES6
+// EXPECTED_REACHABLE_NODES: 1238
+// ES_MODULES
+// FILE: bar.kt
+@file:JsImport("./interfacesWithCompanion.mjs")
+package bar
+
+external interface Bar {
+    companion object {
+        fun ok(): String
+    }
+}
+
+// FILE: test.kt
+import bar.Bar
+
+fun box(): String {
+    return Bar.ok()
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.mjs b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.mjs
new file mode 100644
index 0000000..f5344ff
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.mjs
@@ -0,0 +1,3 @@
+export const Bar = {
+    ok() { return "OK" }
+};
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalClass.kt b/js/js.translator/testData/box/esModules/jsImport/default/externalClass.kt
new file mode 100644
index 0000000..bfd5f37
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalClass.kt
@@ -0,0 +1,34 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+package foo
+
+@JsImport("./externalClass.mjs")
+@JsImport.Default
+external class A(x: Int = definedExternally) {
+    val x: Int
+
+    fun foo(y: Int): Int = definedExternally
+
+    fun bar(vararg arg: String): String = definedExternally
+}
+
+class C {
+    val e = arrayOf("e")
+    val f = arrayOf("f")
+    val a = A(1)
+
+    fun qux() = a.bar(*e, *f)
+}
+
+
+fun box(): String {
+    val a = A(23)
+    assertEquals(23, a.x)
+    assertEquals(65, a.foo(42))
+
+    assertEquals(C().qux(), "(ef)")
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalClass.mjs b/js/js.translator/testData/box/esModules/jsImport/default/externalClass.mjs
new file mode 100644
index 0000000..848fe5d
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalClass.mjs
@@ -0,0 +1,11 @@
+export default function A(x) {
+    this.x = x;
+}
+
+A.prototype.foo = function (y) {
+    return this.x + y;
+};
+
+A.prototype.bar = function() {
+    return "(" + Array.prototype.join.call(arguments, "") + ")";
+};
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.kt b/js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.kt
new file mode 100644
index 0000000..6883fc4
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.kt
@@ -0,0 +1,50 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+package foo
+
+@JsImport("./externalClassWithDefaults.mjs")
+@JsImport.Default
+external open class A(ss: String = definedExternally) {
+    val s: String
+    fun foo(y: String = definedExternally): String = definedExternally
+    fun bar(y: String = definedExternally): String = definedExternally
+}
+
+class C: A {
+    constructor(ss: String) : super(ss) {}
+    constructor() : super() {}
+
+    fun qux(s: String = "O") = s
+}
+
+
+fun box(): String {
+    val a = A()
+    val c = C()
+
+    val r1 = a.foo("O") + c.foo()
+    if (r1 != "OK") return "Fail1: $r1"
+
+    val r2 = a.bar() + c.bar("K")
+    if (r2 != "OK") return "Fail2: $r2"
+
+    val r3 = c.qux() + c.qux("K")
+    if (r3 != "OK") return "Fail3: $r3"
+
+    if (a.s != "A") return "Fail4: ${a.s}"
+    if (c.s != "A") return "Fail5: ${c.s}"
+
+    val a2 = A("A2")
+    val c2 = C("C2")
+
+    val r6 = a2.s + c2.s
+    if (r6 != "A2C2") return "Fail6: $r6"
+
+    return "OK"
+
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.mjs b/js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.mjs
new file mode 100644
index 0000000..1a1ebc0
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.mjs
@@ -0,0 +1,9 @@
+export default function A(ss) {
+    this.s = ss || "A"
+}
+A.prototype.foo = function (y) {
+    return y || "K";
+};
+A.prototype.bar = function (y) {
+    return y || "O";
+};
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.kt b/js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.kt
new file mode 100644
index 0000000..b427b3f
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.kt
@@ -0,0 +1,30 @@
+// EXPECTED_REACHABLE_NODES: 1334
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+package foo
+
+@JsImport("./externalConstructor.mjs")
+@JsImport.Default
+open external class A(data: String) {
+    constructor(data: Int)
+    constructor(data: Boolean)
+
+    val data: Any
+}
+
+class B(data: String) : A(data)
+
+class C(data: Int) : A(data)
+
+class D(data: Boolean) : A(data)
+
+fun box(): String {
+    assertEquals("13", B("13").data)
+    assertEquals(42, C(42).data)
+    assertEquals(true, D(true).data)
+    return "OK"
+}
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.mjs b/js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.mjs
new file mode 100644
index 0000000..4882be9
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.mjs
@@ -0,0 +1,3 @@
+export default function (data) {
+    this.data = data
+}
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalFunction.kt b/js/js.translator/testData/box/esModules/jsImport/default/externalFunction.kt
new file mode 100644
index 0000000..6e232c5
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalFunction.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+package foo
+
+@JsImport("./externalFunction.mjs")
+@JsImport.Default
+external fun foo(y: Int): Int = definedExternally
+
+fun box(): String {
+    assertEquals(65, foo(42))
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalFunction.mjs b/js/js.translator/testData/box/esModules/jsImport/default/externalFunction.mjs
new file mode 100644
index 0000000..b80e3d9
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalFunction.mjs
@@ -0,0 +1,3 @@
+export default function(y) {
+    return 23 + y;
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.kt b/js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.kt
new file mode 100644
index 0000000..2eb65b4
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.kt
@@ -0,0 +1,15 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+package foo
+
+@JsImport("./externalFunctionNameClash.mjs")
+@JsImport.Default
+external fun foo(y: Int): Int = definedExternally
+
+fun foo(y: String): String = y + "K"
+
+fun box(): String {
+    val foo10 = foo(10)
+    if (foo10 != 33) return "Fail: $foo10"
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.mjs b/js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.mjs
new file mode 100644
index 0000000..b80e3d9
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.mjs
@@ -0,0 +1,3 @@
+export default function(y) {
+    return 23 + y;
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalObject.kt b/js/js.translator/testData/box/esModules/jsImport/default/externalObject.kt
new file mode 100644
index 0000000..4021654
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalObject.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+package foo
+
+@JsImport("./externalObject.mjs")
+@JsImport.Default
+external object A {
+    val x: Int = definedExternally
+
+    fun foo(y: Int): Int = definedExternally
+}
+
+fun box(): String {
+    assertEquals(23, A.x)
+    assertEquals(65, A.foo(42))
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalObject.mjs b/js/js.translator/testData/box/esModules/jsImport/default/externalObject.mjs
new file mode 100644
index 0000000..5910b6d
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalObject.mjs
@@ -0,0 +1,6 @@
+export default {
+    x: 23,
+    foo: function(y) {
+        return this.x + y;
+    }
+};
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalProperty.kt b/js/js.translator/testData/box/esModules/jsImport/default/externalProperty.kt
new file mode 100644
index 0000000..d3903cf
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalProperty.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+package foo
+
+@JsImport("./externalProperty.mjs")
+@JsImport.Default
+external val foo: Int = definedExternally
+
+fun box(): String {
+    assertEquals(23, foo)
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalProperty.mjs b/js/js.translator/testData/box/esModules/jsImport/default/externalProperty.mjs
new file mode 100644
index 0000000..19835ca
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalProperty.mjs
@@ -0,0 +1 @@
+export default 23;
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.kt b/js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.kt
new file mode 100644
index 0000000..9b4c90a
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.kt
@@ -0,0 +1,16 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@JsImport("./topLevelVarargFun.mjs")
+@JsImport.Default
+external fun foo(vararg arg: String): String
+
+fun box(): String {
+    val x = arrayOf("a", "b")
+    var r = foo(*x)
+    if (r != "(ab)") return "fail1: $r"
+
+    r = foo("c", "d")
+    if (r != "(cd)") return "fail2: $r"
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.mjs b/js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.mjs
new file mode 100644
index 0000000..a447c76
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.mjs
@@ -0,0 +1,3 @@
+export default function() {
+    return "(" + Array.prototype.join.call(arguments, "") + ")";
+};
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalClass.kt b/js/js.translator/testData/box/esModules/jsImport/named/externalClass.kt
new file mode 100644
index 0000000..e0abbd43
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalClass.kt
@@ -0,0 +1,34 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+package foo
+
+@JsImport("./externalClass.mjs")
+@JsImport.Name("Foo")
+external class A(x: Int = definedExternally) {
+    val x: Int
+
+    fun foo(y: Int): Int = definedExternally
+
+    fun bar(vararg arg: String): String = definedExternally
+}
+
+class C {
+    val e = arrayOf("e")
+    val f = arrayOf("f")
+    val a = A(1)
+
+    fun qux() = a.bar(*e, *f)
+}
+
+
+fun box(): String {
+    val a = A(23)
+    assertEquals(23, a.x)
+    assertEquals(65, a.foo(42))
+
+    assertEquals(C().qux(), "(ef)")
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalClass.mjs b/js/js.translator/testData/box/esModules/jsImport/named/externalClass.mjs
new file mode 100644
index 0000000..4ba1f27
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalClass.mjs
@@ -0,0 +1,11 @@
+export function Foo(x) {
+    this.x = x;
+}
+
+Foo.prototype.foo = function (y) {
+    return this.x + y;
+};
+
+Foo.prototype.bar = function() {
+    return "(" + Array.prototype.join.call(arguments, "") + ")";
+};
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.kt b/js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.kt
new file mode 100644
index 0000000..ad360e1
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.kt
@@ -0,0 +1,50 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+package foo
+
+@JsImport("./externalClassWithDefaults.mjs")
+@JsImport.Name("Foo")
+external open class A(ss: String = definedExternally) {
+    val s: String
+    fun foo(y: String = definedExternally): String = definedExternally
+    fun bar(y: String = definedExternally): String = definedExternally
+}
+
+class C: A {
+    constructor(ss: String) : super(ss) {}
+    constructor() : super() {}
+
+    fun qux(s: String = "O") = s
+}
+
+
+fun box(): String {
+    val a = A()
+    val c = C()
+
+    val r1 = a.foo("O") + c.foo()
+    if (r1 != "OK") return "Fail1: $r1"
+
+    val r2 = a.bar() + c.bar("K")
+    if (r2 != "OK") return "Fail2: $r2"
+
+    val r3 = c.qux() + c.qux("K")
+    if (r3 != "OK") return "Fail3: $r3"
+
+    if (a.s != "A") return "Fail4: ${a.s}"
+    if (c.s != "A") return "Fail5: ${c.s}"
+
+    val a2 = A("A2")
+    val c2 = C("C2")
+
+    val r6 = a2.s + c2.s
+    if (r6 != "A2C2") return "Fail6: $r6"
+
+    return "OK"
+
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.mjs b/js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.mjs
new file mode 100644
index 0000000..11dd982
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.mjs
@@ -0,0 +1,9 @@
+export function Foo(ss) {
+    this.s = ss || "A"
+}
+Foo.prototype.foo = function (y) {
+    return y || "K";
+};
+Foo.prototype.bar = function (y) {
+    return y || "O";
+};
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.kt b/js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.kt
new file mode 100644
index 0000000..aea9c9c
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.kt
@@ -0,0 +1,30 @@
+// EXPECTED_REACHABLE_NODES: 1334
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+package foo
+
+@JsImport("./externalConstructor.mjs")
+@JsImport.Name("Foo")
+open external class A(data: String) {
+    constructor(data: Int)
+    constructor(data: Boolean)
+
+    val data: Any
+}
+
+class B(data: String) : A(data)
+
+class C(data: Int) : A(data)
+
+class D(data: Boolean) : A(data)
+
+fun box(): String {
+    assertEquals("13", B("13").data)
+    assertEquals(42, C(42).data)
+    assertEquals(true, D(true).data)
+    return "OK"
+}
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.mjs b/js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.mjs
new file mode 100644
index 0000000..98a5db6
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.mjs
@@ -0,0 +1,3 @@
+export function Foo (data) {
+    this.data = data
+}
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalFunction.kt b/js/js.translator/testData/box/esModules/jsImport/named/externalFunction.kt
new file mode 100644
index 0000000..9b5aa58
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalFunction.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+package foo
+
+@JsImport("./externalFunction.mjs")
+@JsImport.Name("bar")
+external fun foo(y: Int): Int = definedExternally
+
+fun box(): String {
+    assertEquals(65, foo(42))
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalFunction.mjs b/js/js.translator/testData/box/esModules/jsImport/named/externalFunction.mjs
new file mode 100644
index 0000000..e6b1cc4
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalFunction.mjs
@@ -0,0 +1,3 @@
+export function bar(y) {
+    return 23 + y;
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.kt b/js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.kt
new file mode 100644
index 0000000..eaa863f
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.kt
@@ -0,0 +1,15 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+package foo
+
+@JsImport("./externalFunctionNameClash.mjs")
+@JsImport.Name("bar")
+external fun foo(y: Int): Int = definedExternally
+
+fun foo(y: String): String = y + "K"
+
+fun box(): String {
+    val foo10 = foo(10)
+    if (foo10 != 33) return "Fail: $foo10"
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.mjs b/js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.mjs
new file mode 100644
index 0000000..e6b1cc4
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.mjs
@@ -0,0 +1,3 @@
+export function bar(y) {
+    return 23 + y;
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalObject.kt b/js/js.translator/testData/box/esModules/jsImport/named/externalObject.kt
new file mode 100644
index 0000000..4bcd4d5
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalObject.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+package foo
+
+@JsImport("./externalObject.mjs")
+@JsImport.Name("O")
+external object A {
+    val x: Int = definedExternally
+
+    fun foo(y: Int): Int = definedExternally
+}
+
+fun box(): String {
+    assertEquals(23, A.x)
+    assertEquals(65, A.foo(42))
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalObject.mjs b/js/js.translator/testData/box/esModules/jsImport/named/externalObject.mjs
new file mode 100644
index 0000000..ffa75f7
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalObject.mjs
@@ -0,0 +1,6 @@
+export const O = {
+    x: 23,
+    foo: function(y) {
+        return this.x + y;
+    }
+};
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalProperty.kt b/js/js.translator/testData/box/esModules/jsImport/named/externalProperty.kt
new file mode 100644
index 0000000..a715a2d
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalProperty.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+package foo
+
+@JsImport("./externalProperty.mjs")
+@JsImport.Name("bar")
+external val foo: Int = definedExternally
+
+fun box(): String {
+    assertEquals(23, foo)
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalProperty.mjs b/js/js.translator/testData/box/esModules/jsImport/named/externalProperty.mjs
new file mode 100644
index 0000000..75a47e2
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalProperty.mjs
@@ -0,0 +1 @@
+export const bar = 23;
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.kt b/js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.kt
new file mode 100644
index 0000000..17883fb
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.kt
@@ -0,0 +1,16 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@JsImport("./topLevelVarargFun.mjs")
+@JsImport.Name("bar")
+external fun foo(vararg arg: String): String
+
+fun box(): String {
+    val x = arrayOf("a", "b")
+    var r = foo(*x)
+    if (r != "(ab)") return "fail1: $r"
+
+    r = foo("c", "d")
+    if (r != "(cd)") return "fail2: $r"
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.mjs b/js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.mjs
new file mode 100644
index 0000000..c9d2a77
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.mjs
@@ -0,0 +1,3 @@
+export function bar() {
+    return "(" + Array.prototype.join.call(arguments, "") + ")";
+};
diff --git a/js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.kt b/js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.kt
new file mode 100644
index 0000000..e595e59
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.kt
@@ -0,0 +1,18 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+package foo
+
+@JsImport("./externalObject.mjs")
+@JsImport.Namespace
+external object A {
+    object O {
+        val x: Int = definedExternally
+        fun foo(y: Int): Int = definedExternally
+    }
+}
+
+fun box(): String {
+    assertEquals(23, A.O.x)
+    assertEquals(65, A.O.foo(42))
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.mjs b/js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.mjs
new file mode 100644
index 0000000..ffa75f7
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.mjs
@@ -0,0 +1,6 @@
+export const O = {
+    x: 23,
+    foo: function(y) {
+        return this.x + y;
+    }
+};
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.kt b/js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.kt
new file mode 100644
index 0000000..f433eb5
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.kt
@@ -0,0 +1,64 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// DONT_TARGET_EXACT_BACKEND: WASM
+// ES_MODULES
+
+@OptIn(ExperimentalStdlibApi::class)
+@JsExternalInheritorsOnly
+external interface ExternalInterfaceX {
+    val x: String
+}
+
+external interface ExternalInterfaceXY : ExternalInterfaceX {
+    val y: String
+}
+
+external interface ExternalInterfaceXYZ : ExternalInterfaceXY {
+    val z: String
+}
+
+external class ExternalXYZ() : ExternalInterfaceXYZ {
+    override val x: String
+    override val y: String
+    override val z: String
+}
+
+external class ExternalClassNameSpace {
+    interface NestedInterfaceXYZ : ExternalInterfaceXYZ {
+        override val x: String
+        override val y: String
+        override val z: String
+    }
+}
+
+@JsImport("./jsExternalInheritorsOnly.mjs")
+@JsImport.Namespace
+external object Creator: ExternalInterfaceXYZ {
+    fun createX(): ExternalInterfaceX
+    fun createXY(): ExternalInterfaceXY
+    fun createXYZ(): ExternalInterfaceXYZ
+    fun createClassXYZ(): ExternalXYZ
+
+    fun createNestedInterfaceXYZ(): ExternalClassNameSpace.NestedInterfaceXYZ
+
+    override val x: String
+    override val y: String
+    override val z: String
+}
+
+fun checkX(x: ExternalInterfaceX, id: Int) = x.x == "X$id"
+fun checkXY(xy: ExternalInterfaceXY, id: Int) = checkX(xy, id) && xy.y == "Y$id"
+fun checkXYZ(xyz: ExternalInterfaceXYZ, id: Int) = checkXY(xyz, id) && xyz.z == "Z$id"
+
+fun box(): String {
+    if (!checkX(Creator.createX(), 1)) return "Fail interface X"
+    if (!checkXY(Creator.createXY(), 2)) return "Fail interface XY"
+    if (!checkXYZ(Creator.createXYZ(), 3)) return "Fail interface XYZ"
+
+    if (!checkXYZ(Creator.createClassXYZ(), 4)) return "Fail class XYZ"
+
+    if (!checkXYZ(Creator.createNestedInterfaceXYZ(), 5)) return "Fail nested interface XYZ"
+
+    if (!checkXYZ(Creator, 6)) return "Fail object XYZ"
+
+    return "OK"
+}
diff --git a/js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.mjs b/js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.mjs
new file mode 100644
index 0000000..aa31102
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.mjs
@@ -0,0 +1,19 @@
+export function createX () {
+    return {x: "X1"};
+}
+export function createXY () {
+    return {x: "X2", y: "Y2"};
+}
+export function createXYZ() {
+    return {x: "X3", y: "Y3", z: "Z3"};
+}
+export function createClassXYZ() {
+    return {x: "X4", y: "Y4", z: "Z4"};
+}
+export function createNestedInterfaceXYZ() {
+    return {x: "X5", y: "Y5", z: "Z5"};
+}
+
+export const x = "X6"
+export const y = "Y6"
+export const z = "Z6"
diff --git a/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalClassNameClash.kt b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalClassNameClash.kt
new file mode 100644
index 0000000..e3c4c43
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalClassNameClash.kt
@@ -0,0 +1,66 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+// FILE: a.kt
+package a
+
+@JsImport("./a.mjs")
+external class A {
+    fun foo(): String
+}
+
+@JsImport("./a.mjs")
+external fun bar(): Int
+
+@JsImport("./a.mjs")
+external val prop: Int
+
+// FILE: b.kt
+package b
+
+@JsImport("./b.mjs")
+external class A {
+    fun foo(): String
+}
+
+@JsImport("./b.mjs")
+external fun bar(): Int
+
+@JsImport("./b.mjs")
+external val prop: Int
+
+// FILE: main.kt
+
+import a.A as O
+import b.A as K
+
+fun box(): String {
+    if (a.bar() != 1) return "fail 1"
+    if (a.prop != 10) return "fail 2"
+    if (b.bar() != 2) return "fail 3"
+    if (b.prop != 20) return "fail 4"
+
+    return O().foo() + K().foo()
+}
+
+// FILE: a.mjs
+export function A() {}
+
+A.prototype.foo = function () {
+   return "O";
+};
+
+export function bar() { return 1; }
+
+export let prop = 10
+
+
+// FILE: b.mjs
+export function A() {}
+
+A.prototype.foo = function () {
+    return "K";
+};
+
+export function bar() { return 2; }
+
+export let prop = 20;
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.kt b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.kt
new file mode 100644
index 0000000..9f05521
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.kt
@@ -0,0 +1,48 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+// FILE: a.kt
+package foo
+
+@JsImport("./externalPackage.mjs")
+external class A(x: Int) {
+    val x: Int
+
+    fun foo(y: Int): Int = definedExternally
+
+    class Nested {
+        val y: Int
+    }
+}
+
+@JsImport("./externalPackage.mjs")
+external object B {
+    val x: Int = definedExternally
+
+    fun foo(y: Int): Int = definedExternally
+}
+
+@JsImport("./externalPackage.mjs")
+external fun foo(y: Int): Int = definedExternally
+
+@JsImport("./externalPackage.mjs")
+external val bar: Int = definedExternally
+
+// FILE: b.kt
+package foo
+
+fun box(): String {
+    val a = A(23)
+    assertEquals(23, a.x)
+    assertEquals(65, a.foo(42))
+
+    val nested = A.Nested()
+    assertEquals(55, nested.y)
+
+    assertEquals(123, B.x)
+    assertEquals(265, B.foo(142))
+
+    assertEquals(365, foo(42))
+    assertEquals(423, bar)
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.mjs b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.mjs
new file mode 100644
index 0000000..da3a03f
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.mjs
@@ -0,0 +1,24 @@
+export function A(x) {
+    this.x = x;
+}
+A.prototype.foo = function (y) {
+    return this.x + y;
+};
+
+function Nested() {
+    this.y = 55;
+}
+A.Nested = Nested;
+
+export var B = {
+    x: 123,
+    foo: function(y) {
+        return this.x + y;
+    }
+};
+
+export function foo(y) {
+    return 323 + y;
+}
+
+export var bar = 423;
diff --git a/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.js b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.js
new file mode 100644
index 0000000..d5a29ec4
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.js
@@ -0,0 +1,5 @@
+C = {
+    f: function() {
+        return 12345;
+    }
+};
diff --git a/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.kt b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.kt
new file mode 100644
index 0000000..bfa38d7
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.kt
@@ -0,0 +1,50 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+// FILE: lib.kt
+package foo
+
+@JsImport("./externalPackageInDifferentFile.mjs")
+external class A(x: Int = definedExternally) {
+    val x: Int
+
+    fun foo(y: Int): Int = definedExternally
+}
+
+@JsImport("./externalPackageInDifferentFile.mjs")
+external object B {
+    val x: Int = definedExternally
+
+    fun foo(y: Int): Int = definedExternally
+}
+
+@JsImport("./externalPackageInDifferentFile.mjs")
+external fun foo(y: Int): Int = definedExternally
+
+@JsImport("./externalPackageInDifferentFile.mjs")
+external val bar: Int = definedExternally
+
+// FILE: lib2.kt
+package foo
+
+external object C {
+    fun f(): Int = definedExternally
+}
+
+// FILE: main.kt
+package foo
+
+fun box(): String {
+    val a = A(23)
+    assertEquals(23, a.x)
+    assertEquals(65, a.foo(42))
+
+    assertEquals(123, B.x)
+    assertEquals(265, B.foo(142))
+
+    assertEquals(365, foo(42))
+    assertEquals(423, bar)
+
+    assertEquals(12345, C.f())
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.mjs b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.mjs
new file mode 100644
index 0000000..05d3135
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.mjs
@@ -0,0 +1,21 @@
+function A(x) {
+    this.x = x;
+}
+A.prototype.foo = function (y) {
+    return this.x + y;
+};
+
+var B = {
+    x: 123,
+    foo: function(y) {
+        return this.x + y;
+    }
+};
+
+function foo(y) {
+    return 323 + y;
+}
+
+var bar = 423;
+
+export { A, B, foo, bar };
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.kt b/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.kt
new file mode 100644
index 0000000..7e3a8de
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.kt
@@ -0,0 +1,43 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// IGNORE_BACKEND: WASM
+// ES_MODULES
+// FILE: bar.kt
+package foo
+
+@JsImport("./interfaces.mjs")
+external interface Bar {
+    fun ping(): String
+}
+
+// FILE: baz.kt
+package boo
+
+@JsImport("./interfaces.mjs")
+external interface Baz {
+    fun pong(): Int
+}
+
+// FILE: root.kt
+import foo.Bar
+import boo.Baz
+
+@JsImport("./interfaces.mjs")
+external val bar: Bar
+
+@JsImport("./interfaces.mjs")
+external val baz: Baz
+
+// FILE: test.kt
+import boo.Baz
+
+fun box(): String {
+    if (bar.ping() != "ping" || baz.pong() != 194) return "Fail"
+
+    val local = object : Baz {
+        override fun pong(): Int = 322
+    }
+
+    if (local.asDynamic().pong() != 322) return "Fail"
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.mjs b/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.mjs
new file mode 100644
index 0000000..b5027cc
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.mjs
@@ -0,0 +1,12 @@
+export var bar = {
+    ping() {
+        return "ping"
+    }
+};
+
+export var baz = {
+    pong() {
+        return 194
+    }
+};
+
diff --git a/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.kt b/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.kt
new file mode 100644
index 0000000..c3d5231
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.kt
@@ -0,0 +1,20 @@
+// TARGET_BACKEND: JS_IR
+// TARGET_BACKEND: JS_IR_ES6
+// EXPECTED_REACHABLE_NODES: 1238
+// ES_MODULES
+// FILE: bar.kt
+package bar
+
+@JsImport("./interfacesWithCompanion.mjs")
+external interface Bar {
+    companion object {
+        fun ok(): String
+    }
+}
+
+// FILE: test.kt
+import bar.Bar
+
+fun box(): String {
+    return Bar.ok()
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.mjs b/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.mjs
new file mode 100644
index 0000000..f5344ff
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.mjs
@@ -0,0 +1,3 @@
+export const Bar = {
+    ok() { return "OK" }
+};
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalClass.js b/js/js.translator/testData/box/jsFileImport/default/externalClass.js
new file mode 100644
index 0000000..ece1640
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalClass.js
@@ -0,0 +1,15 @@
+define("lib", [], function() {
+    function A(x) {
+        this.x = x;
+    }
+
+    A.prototype.foo = function (y) {
+        return this.x + y;
+    };
+
+    A.prototype.bar = function () {
+        return "(" + Array.prototype.join.call(arguments, "") + ")";
+    };
+
+    return A;
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalClass.kt b/js/js.translator/testData/box/jsFileImport/default/externalClass.kt
new file mode 100644
index 0000000..c8b3773
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalClass.kt
@@ -0,0 +1,34 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+@file:JsImport("lib")
+package foo
+
+@JsImport.Default
+external class A(x: Int = definedExternally) {
+    val x: Int
+
+    fun foo(y: Int): Int = definedExternally
+
+    fun bar(vararg arg: String): String = definedExternally
+}
+
+class C {
+    val e = arrayOf("e")
+    val f = arrayOf("f")
+    val a = A(1)
+
+    fun qux() = a.bar(*e, *f)
+}
+
+
+fun box(): String {
+    val a = A(23)
+    assertEquals(23, a.x)
+    assertEquals(65, a.foo(42))
+
+    assertEquals(C().qux(), "(ef)")
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.js b/js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.js
new file mode 100644
index 0000000..f6a1a6d
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.js
@@ -0,0 +1,12 @@
+define("lib", [], function () {
+    function A(ss) {
+        this.s = ss || "A"
+    }
+    A.prototype.foo = function (y) {
+        return y || "K";
+    };
+    A.prototype.bar = function (y) {
+        return y || "O";
+    };
+    return A;
+})
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.kt b/js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.kt
new file mode 100644
index 0000000..b173f999
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.kt
@@ -0,0 +1,50 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+@file:JsImport("lib")
+package foo
+
+@JsImport.Default
+external open class A(ss: String = definedExternally) {
+    val s: String
+    fun foo(y: String = definedExternally): String = definedExternally
+    fun bar(y: String = definedExternally): String = definedExternally
+}
+
+class C: A {
+    constructor(ss: String) : super(ss) {}
+    constructor() : super() {}
+
+    fun qux(s: String = "O") = s
+}
+
+
+fun box(): String {
+    val a = A()
+    val c = C()
+
+    val r1 = a.foo("O") + c.foo()
+    if (r1 != "OK") return "Fail1: $r1"
+
+    val r2 = a.bar() + c.bar("K")
+    if (r2 != "OK") return "Fail2: $r2"
+
+    val r3 = c.qux() + c.qux("K")
+    if (r3 != "OK") return "Fail3: $r3"
+
+    if (a.s != "A") return "Fail4: ${a.s}"
+    if (c.s != "A") return "Fail5: ${c.s}"
+
+    val a2 = A("A2")
+    val c2 = C("C2")
+
+    val r6 = a2.s + c2.s
+    if (r6 != "A2C2") return "Fail6: $r6"
+
+    return "OK"
+
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalConstructor.js b/js/js.translator/testData/box/jsFileImport/default/externalConstructor.js
new file mode 100644
index 0000000..61948a0
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalConstructor.js
@@ -0,0 +1,5 @@
+define("lib", [], function () {
+    return function (data) {
+        this.data = data
+    }
+})
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalConstructor.kt b/js/js.translator/testData/box/jsFileImport/default/externalConstructor.kt
new file mode 100644
index 0000000..157e23c
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalConstructor.kt
@@ -0,0 +1,30 @@
+// EXPECTED_REACHABLE_NODES: 1334
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+@file:JsImport("lib")
+package foo
+
+@JsImport.Default
+open external class A(data: String) {
+    constructor(data: Int)
+    constructor(data: Boolean)
+
+    val data: Any
+}
+
+class B(data: String) : A(data)
+
+class C(data: Int) : A(data)
+
+class D(data: Boolean) : A(data)
+
+fun box(): String {
+    assertEquals("13", B("13").data)
+    assertEquals(42, C(42).data)
+    assertEquals(true, D(true).data)
+    return "OK"
+}
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalFunction.js b/js/js.translator/testData/box/jsFileImport/default/externalFunction.js
new file mode 100644
index 0000000..dfc1ec0
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalFunction.js
@@ -0,0 +1,5 @@
+define("lib", [], function () {
+    return function (y) {
+        return 23 + y;
+    }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalFunction.kt b/js/js.translator/testData/box/jsFileImport/default/externalFunction.kt
new file mode 100644
index 0000000..fe0a1db
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalFunction.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@file:JsImport("lib")
+package foo
+
+@JsImport.Default
+external fun foo(y: Int): Int = definedExternally
+
+fun box(): String {
+    assertEquals(65, foo(42))
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.js b/js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.js
new file mode 100644
index 0000000..e731aac
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.js
@@ -0,0 +1,5 @@
+define("lib", [], function () {
+    return function(y) {
+        return 23 + y;
+    }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.kt b/js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.kt
new file mode 100644
index 0000000..49cc5eb
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.kt
@@ -0,0 +1,15 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@file:JsImport("lib")
+package foo
+
+@JsImport.Default
+external fun foo(y: Int): Int = definedExternally
+
+fun foo(y: String): String = y + "K"
+
+fun box(): String {
+    val foo10 = foo(10)
+    if (foo10 != 33) return "Fail: $foo10"
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalObject.js b/js/js.translator/testData/box/jsFileImport/default/externalObject.js
new file mode 100644
index 0000000..9b17e88
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalObject.js
@@ -0,0 +1,8 @@
+define("lib", [], function () {
+    return {
+        x: 23,
+        foo: function(y) {
+            return this.x + y;
+        }
+    };
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalObject.kt b/js/js.translator/testData/box/jsFileImport/default/externalObject.kt
new file mode 100644
index 0000000..73cf5fd
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalObject.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@file:JsImport("lib")
+package foo
+
+@JsImport.Default
+external object A {
+    val x: Int = definedExternally
+
+    fun foo(y: Int): Int = definedExternally
+}
+
+fun box(): String {
+    assertEquals(23, A.x)
+    assertEquals(65, A.foo(42))
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalProperty.js b/js/js.translator/testData/box/jsFileImport/default/externalProperty.js
new file mode 100644
index 0000000..c76f9e7
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalProperty.js
@@ -0,0 +1,3 @@
+define("lib", [], function () {
+    return 23;
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalProperty.kt b/js/js.translator/testData/box/jsFileImport/default/externalProperty.kt
new file mode 100644
index 0000000..3308bc4
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalProperty.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@file:JsImport("lib")
+package foo
+
+@JsImport.Default
+external val foo: Int = definedExternally
+
+fun box(): String {
+    assertEquals(23, foo)
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.js b/js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.js
new file mode 100644
index 0000000..1d1fa0e
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.js
@@ -0,0 +1,5 @@
+define("lib", [], function () {
+    return function() {
+        return "(" + Array.prototype.join.call(arguments, "") + ")";
+    };
+})
diff --git a/js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.kt b/js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.kt
new file mode 100644
index 0000000..5e4b6f1
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@file:JsImport("lib")
+
+@JsImport.Default
+external fun foo(vararg arg: String): String
+
+fun box(): String {
+    val x = arrayOf("a", "b")
+    var r = foo(*x)
+    if (r != "(ab)") return "fail1: $r"
+
+    r = foo("c", "d")
+    if (r != "(cd)") return "fail2: $r"
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalClass.js b/js/js.translator/testData/box/jsFileImport/named/externalClass.js
new file mode 100644
index 0000000..7df3adb
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalClass.js
@@ -0,0 +1,15 @@
+define("lib", [], function () {
+    function Foo(x) {
+        this.x = x;
+    }
+
+    Foo.prototype.foo = function (y) {
+        return this.x + y;
+    };
+
+    Foo.prototype.bar = function() {
+        return "(" + Array.prototype.join.call(arguments, "") + ")";
+    };
+
+    return { Foo };
+})
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalClass.kt b/js/js.translator/testData/box/jsFileImport/named/externalClass.kt
new file mode 100644
index 0000000..f24f57f
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalClass.kt
@@ -0,0 +1,34 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+@file:JsImport("lib")
+package foo
+
+@JsImport.Name("Foo")
+external class A(x: Int = definedExternally) {
+    val x: Int
+
+    fun foo(y: Int): Int = definedExternally
+
+    fun bar(vararg arg: String): String = definedExternally
+}
+
+class C {
+    val e = arrayOf("e")
+    val f = arrayOf("f")
+    val a = A(1)
+
+    fun qux() = a.bar(*e, *f)
+}
+
+
+fun box(): String {
+    val a = A(23)
+    assertEquals(23, a.x)
+    assertEquals(65, a.foo(42))
+
+    assertEquals(C().qux(), "(ef)")
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.js b/js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.js
new file mode 100644
index 0000000..69bf9b5
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.js
@@ -0,0 +1,13 @@
+define("lib", [], function () {
+    function Foo(ss) {
+        this.s = ss || "A"
+    }
+    Foo.prototype.foo = function (y) {
+        return y || "K";
+    };
+    Foo.prototype.bar = function (y) {
+        return y || "O";
+    };
+
+    return { Foo };
+})
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.kt b/js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.kt
new file mode 100644
index 0000000..9de4844
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.kt
@@ -0,0 +1,50 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+@file:JsImport("lib")
+package foo
+
+@JsImport.Name("Foo")
+external open class A(ss: String = definedExternally) {
+    val s: String
+    fun foo(y: String = definedExternally): String = definedExternally
+    fun bar(y: String = definedExternally): String = definedExternally
+}
+
+class C: A {
+    constructor(ss: String) : super(ss) {}
+    constructor() : super() {}
+
+    fun qux(s: String = "O") = s
+}
+
+
+fun box(): String {
+    val a = A()
+    val c = C()
+
+    val r1 = a.foo("O") + c.foo()
+    if (r1 != "OK") return "Fail1: $r1"
+
+    val r2 = a.bar() + c.bar("K")
+    if (r2 != "OK") return "Fail2: $r2"
+
+    val r3 = c.qux() + c.qux("K")
+    if (r3 != "OK") return "Fail3: $r3"
+
+    if (a.s != "A") return "Fail4: ${a.s}"
+    if (c.s != "A") return "Fail5: ${c.s}"
+
+    val a2 = A("A2")
+    val c2 = C("C2")
+
+    val r6 = a2.s + c2.s
+    if (r6 != "A2C2") return "Fail6: $r6"
+
+    return "OK"
+
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalConstructor.js b/js/js.translator/testData/box/jsFileImport/named/externalConstructor.js
new file mode 100644
index 0000000..8718a67
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalConstructor.js
@@ -0,0 +1,6 @@
+define("lib", [], function () {
+    function Foo (data) {
+        this.data = data
+    };
+    return { Foo }
+})
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalConstructor.kt b/js/js.translator/testData/box/jsFileImport/named/externalConstructor.kt
new file mode 100644
index 0000000..fcef185
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalConstructor.kt
@@ -0,0 +1,30 @@
+// EXPECTED_REACHABLE_NODES: 1334
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+@file:JsImport("lib")
+package foo
+
+@JsImport.Name("Foo")
+open external class A(data: String) {
+    constructor(data: Int)
+    constructor(data: Boolean)
+
+    val data: Any
+}
+
+class B(data: String) : A(data)
+
+class C(data: Int) : A(data)
+
+class D(data: Boolean) : A(data)
+
+fun box(): String {
+    assertEquals("13", B("13").data)
+    assertEquals(42, C(42).data)
+    assertEquals(true, D(true).data)
+    return "OK"
+}
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalFunction.js b/js/js.translator/testData/box/jsFileImport/named/externalFunction.js
new file mode 100644
index 0000000..41df583
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalFunction.js
@@ -0,0 +1,7 @@
+define("lib", [], function () {
+    function bar(y) {
+        return 23 + y;
+    }
+
+    return { bar }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalFunction.kt b/js/js.translator/testData/box/jsFileImport/named/externalFunction.kt
new file mode 100644
index 0000000..04cb631
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalFunction.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@file:JsImport("lib")
+package foo
+
+@JsImport.Name("bar")
+external fun foo(y: Int): Int = definedExternally
+
+fun box(): String {
+    assertEquals(65, foo(42))
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.js b/js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.js
new file mode 100644
index 0000000..41df583
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.js
@@ -0,0 +1,7 @@
+define("lib", [], function () {
+    function bar(y) {
+        return 23 + y;
+    }
+
+    return { bar }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.kt b/js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.kt
new file mode 100644
index 0000000..2836026
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.kt
@@ -0,0 +1,15 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@file:JsImport("lib")
+package foo
+
+@JsImport.Name("bar")
+external fun foo(y: Int): Int = definedExternally
+
+fun foo(y: String): String = y + "K"
+
+fun box(): String {
+    val foo10 = foo(10)
+    if (foo10 != 33) return "Fail: $foo10"
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalObject.js b/js/js.translator/testData/box/jsFileImport/named/externalObject.js
new file mode 100644
index 0000000..2961c453
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalObject.js
@@ -0,0 +1,10 @@
+define("lib", [], function () {
+    const O = {
+        x: 23,
+        foo: function(y) {
+            return this.x + y;
+        }
+    };
+
+    return { O }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalObject.kt b/js/js.translator/testData/box/jsFileImport/named/externalObject.kt
new file mode 100644
index 0000000..b6d8779
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalObject.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@file:JsImport("lib")
+package foo
+
+@JsImport.Name("O")
+external object A {
+    val x: Int = definedExternally
+
+    fun foo(y: Int): Int = definedExternally
+}
+
+fun box(): String {
+    assertEquals(23, A.x)
+    assertEquals(65, A.foo(42))
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalProperty.js b/js/js.translator/testData/box/jsFileImport/named/externalProperty.js
new file mode 100644
index 0000000..2c0d2ca
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalProperty.js
@@ -0,0 +1,4 @@
+define("lib", [], function () {
+    const bar = 23;
+    return { bar }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalProperty.kt b/js/js.translator/testData/box/jsFileImport/named/externalProperty.kt
new file mode 100644
index 0000000..a84fad1
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalProperty.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@file:JsImport("lib")
+package foo
+
+@JsImport.Name("bar")
+external val foo: Int = definedExternally
+
+fun box(): String {
+    assertEquals(23, foo)
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.js b/js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.js
new file mode 100644
index 0000000..dbc0a37
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.js
@@ -0,0 +1,6 @@
+define("lib", [], function () {
+    function bar() {
+        return "(" + Array.prototype.join.call(arguments, "") + ")";
+    }
+    return { bar }
+})
diff --git a/js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.kt b/js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.kt
new file mode 100644
index 0000000..b8ceb60
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@file:JsImport("lib")
+
+@JsImport.Name("bar")
+external fun foo(vararg arg: String): String
+
+fun box(): String {
+    val x = arrayOf("a", "b")
+    var r = foo(*x)
+    if (r != "(ab)") return "fail1: $r"
+
+    r = foo("c", "d")
+    if (r != "(cd)") return "fail2: $r"
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/plainNamed/externalClassNameClash.kt b/js/js.translator/testData/box/jsFileImport/plainNamed/externalClassNameClash.kt
new file mode 100644
index 0000000..adbd3c8
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/plainNamed/externalClassNameClash.kt
@@ -0,0 +1,69 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+// FILE: a.kt
+@file:JsImport("a")
+package a
+
+external class A {
+    fun foo(): String
+}
+
+external fun bar(): Int
+
+external val prop: Int
+
+// FILE: b.kt
+@file:JsImport("b")
+package b
+
+external class A {
+    fun foo(): String
+}
+
+external fun bar(): Int
+
+external val prop: Int
+
+// FILE: main.kt
+
+import a.A as O
+import b.A as K
+
+fun box(): String {
+    if (a.bar() != 1) return "fail 1"
+    if (a.prop != 10) return "fail 2"
+    if (b.bar() != 2) return "fail 3"
+    if (b.prop != 20) return "fail 4"
+
+    return O().foo() + K().foo()
+}
+
+// FILE: a.js
+define("a", [], function () {
+    function A() {}
+
+    A.prototype.foo = function () {
+        return "O";
+    };
+
+    function bar() { return 1; }
+
+    let prop = 10
+
+    return { A, bar, prop }
+})
+
+// FILE: b.js
+define("b", [], function () {
+    function A() {}
+
+    A.prototype.foo = function () {
+        return "K";
+    };
+
+    function bar() { return 2; }
+
+    let prop = 20;
+
+    return { A, bar, prop }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.js b/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.js
new file mode 100644
index 0000000..d8004d8
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.js
@@ -0,0 +1,28 @@
+define("lib", [], function () {
+    function A(x) {
+        this.x = x;
+    }
+    A.prototype.foo = function (y) {
+        return this.x + y;
+    };
+
+    function Nested() {
+        this.y = 55;
+    }
+    A.Nested = Nested;
+
+    var B = {
+        x: 123,
+        foo: function(y) {
+            return this.x + y;
+        }
+    };
+
+    function foo(y) {
+        return 323 + y;
+    }
+
+    var bar = 423;
+
+    return { A, B, foo, bar }
+})
diff --git a/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.kt b/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.kt
new file mode 100644
index 0000000..40557de
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.kt
@@ -0,0 +1,45 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+// FILE: a.kt
+@file:JsImport("lib")
+package foo
+
+external class A(x: Int) {
+    val x: Int
+
+    fun foo(y: Int): Int = definedExternally
+
+    class Nested {
+        val y: Int
+    }
+}
+
+external object B {
+    val x: Int = definedExternally
+
+    fun foo(y: Int): Int = definedExternally
+}
+
+external fun foo(y: Int): Int = definedExternally
+
+external val bar: Int = definedExternally
+
+// FILE: b.kt
+package foo
+
+fun box(): String {
+    val a = A(23)
+    assertEquals(23, a.x)
+    assertEquals(65, a.foo(42))
+
+    val nested = A.Nested()
+    assertEquals(55, nested.y)
+
+    assertEquals(123, B.x)
+    assertEquals(265, B.foo(142))
+
+    assertEquals(365, foo(42))
+    assertEquals(423, bar)
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.js b/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.js
new file mode 100644
index 0000000..7034601
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.js
@@ -0,0 +1,29 @@
+C = {
+    f: function() {
+        return 12345;
+    }
+};
+
+define("lib", [], function () {
+    function A(x) {
+        this.x = x;
+    }
+    A.prototype.foo = function (y) {
+        return this.x + y;
+    };
+
+    var B = {
+        x: 123,
+        foo: function(y) {
+            return this.x + y;
+        }
+    };
+
+    function foo(y) {
+        return 323 + y;
+    }
+
+    var bar = 423;
+
+    return { A, B, foo, bar };
+})
diff --git a/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.kt b/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.kt
new file mode 100644
index 0000000..38504bc
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.kt
@@ -0,0 +1,47 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+// FILE: lib.kt
+@file:JsImport("lib")
+package foo
+
+external class A(x: Int = definedExternally) {
+    val x: Int
+
+    fun foo(y: Int): Int = definedExternally
+}
+
+external object B {
+    val x: Int = definedExternally
+
+    fun foo(y: Int): Int = definedExternally
+}
+
+external fun foo(y: Int): Int = definedExternally
+
+external val bar: Int = definedExternally
+
+// FILE: lib2.kt
+package foo
+
+external object C {
+    fun f(): Int = definedExternally
+}
+
+// FILE: main.kt
+package foo
+
+fun box(): String {
+    val a = A(23)
+    assertEquals(23, a.x)
+    assertEquals(65, a.foo(42))
+
+    assertEquals(123, B.x)
+    assertEquals(265, B.foo(142))
+
+    assertEquals(365, foo(42))
+    assertEquals(423, bar)
+
+    assertEquals(12345, C.f())
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.js b/js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.js
new file mode 100644
index 0000000..3147a35
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.js
@@ -0,0 +1,15 @@
+define("lib", [], function () {
+    var bar = {
+        ping() {
+            return "ping"
+        }
+    };
+
+    var baz = {
+        pong() {
+            return 194
+        }
+    };
+
+    return { bar, baz }
+})
diff --git a/js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.kt b/js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.kt
new file mode 100644
index 0000000..a12785d
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.kt
@@ -0,0 +1,43 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// IGNORE_BACKEND: WASM
+// MODULE_KIND: AMD
+// FILE: bar.kt
+@file:JsImport("lib")
+package foo
+
+external interface Bar {
+    fun ping(): String
+}
+
+// FILE: baz.kt
+@file:JsImport("lib")
+package boo
+
+external interface Baz {
+    fun pong(): Int
+}
+
+// FILE: root.kt
+@file:JsImport("lib")
+
+import foo.Bar
+import boo.Baz
+
+external val bar: Bar
+
+external val baz: Baz
+
+// FILE: test.kt
+import boo.Baz
+
+fun box(): String {
+    if (bar.ping() != "ping" || baz.pong() != 194) return "Fail"
+
+    val local = object : Baz {
+        override fun pong(): Int = 322
+    }
+
+    if (local.asDynamic().pong() != 322) return "Fail"
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.js b/js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.js
new file mode 100644
index 0000000..f3d161d
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.js
@@ -0,0 +1,7 @@
+define("lib", [], function () {
+    const Bar = {
+        ok() { return "OK" }
+    };
+
+    return { Bar }
+})
diff --git a/js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.kt b/js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.kt
new file mode 100644
index 0000000..af8a58a
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.kt
@@ -0,0 +1,20 @@
+// TARGET_BACKEND: JS_IR
+// TARGET_BACKEND: JS_IR_ES6
+// EXPECTED_REACHABLE_NODES: 1238
+// MODULE_KIND: AMD
+// FILE: bar.kt
+@file:JsImport("lib")
+package bar
+
+external interface Bar {
+    companion object {
+        fun ok(): String
+    }
+}
+
+// FILE: test.kt
+import bar.Bar
+
+fun box(): String {
+    return Bar.ok()
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalClass.js b/js/js.translator/testData/box/jsImport/default/externalClass.js
new file mode 100644
index 0000000..ece1640
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalClass.js
@@ -0,0 +1,15 @@
+define("lib", [], function() {
+    function A(x) {
+        this.x = x;
+    }
+
+    A.prototype.foo = function (y) {
+        return this.x + y;
+    };
+
+    A.prototype.bar = function () {
+        return "(" + Array.prototype.join.call(arguments, "") + ")";
+    };
+
+    return A;
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalClass.kt b/js/js.translator/testData/box/jsImport/default/externalClass.kt
new file mode 100644
index 0000000..6675ed8
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalClass.kt
@@ -0,0 +1,34 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+package foo
+
+@JsImport("lib")
+@JsImport.Default
+external class A(x: Int = definedExternally) {
+    val x: Int
+
+    fun foo(y: Int): Int = definedExternally
+
+    fun bar(vararg arg: String): String = definedExternally
+}
+
+class C {
+    val e = arrayOf("e")
+    val f = arrayOf("f")
+    val a = A(1)
+
+    fun qux() = a.bar(*e, *f)
+}
+
+
+fun box(): String {
+    val a = A(23)
+    assertEquals(23, a.x)
+    assertEquals(65, a.foo(42))
+
+    assertEquals(C().qux(), "(ef)")
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.js b/js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.js
new file mode 100644
index 0000000..f6a1a6d
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.js
@@ -0,0 +1,12 @@
+define("lib", [], function () {
+    function A(ss) {
+        this.s = ss || "A"
+    }
+    A.prototype.foo = function (y) {
+        return y || "K";
+    };
+    A.prototype.bar = function (y) {
+        return y || "O";
+    };
+    return A;
+})
diff --git a/js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.kt b/js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.kt
new file mode 100644
index 0000000..13d6409
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.kt
@@ -0,0 +1,50 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+package foo
+
+@JsImport("lib")
+@JsImport.Default
+external open class A(ss: String = definedExternally) {
+    val s: String
+    fun foo(y: String = definedExternally): String = definedExternally
+    fun bar(y: String = definedExternally): String = definedExternally
+}
+
+class C: A {
+    constructor(ss: String) : super(ss) {}
+    constructor() : super() {}
+
+    fun qux(s: String = "O") = s
+}
+
+
+fun box(): String {
+    val a = A()
+    val c = C()
+
+    val r1 = a.foo("O") + c.foo()
+    if (r1 != "OK") return "Fail1: $r1"
+
+    val r2 = a.bar() + c.bar("K")
+    if (r2 != "OK") return "Fail2: $r2"
+
+    val r3 = c.qux() + c.qux("K")
+    if (r3 != "OK") return "Fail3: $r3"
+
+    if (a.s != "A") return "Fail4: ${a.s}"
+    if (c.s != "A") return "Fail5: ${c.s}"
+
+    val a2 = A("A2")
+    val c2 = C("C2")
+
+    val r6 = a2.s + c2.s
+    if (r6 != "A2C2") return "Fail6: $r6"
+
+    return "OK"
+
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalConstructor.js b/js/js.translator/testData/box/jsImport/default/externalConstructor.js
new file mode 100644
index 0000000..61948a0
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalConstructor.js
@@ -0,0 +1,5 @@
+define("lib", [], function () {
+    return function (data) {
+        this.data = data
+    }
+})
diff --git a/js/js.translator/testData/box/jsImport/default/externalConstructor.kt b/js/js.translator/testData/box/jsImport/default/externalConstructor.kt
new file mode 100644
index 0000000..5ce1142
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalConstructor.kt
@@ -0,0 +1,30 @@
+// EXPECTED_REACHABLE_NODES: 1334
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+package foo
+
+@JsImport("lib")
+@JsImport.Default
+open external class A(data: String) {
+    constructor(data: Int)
+    constructor(data: Boolean)
+
+    val data: Any
+}
+
+class B(data: String) : A(data)
+
+class C(data: Int) : A(data)
+
+class D(data: Boolean) : A(data)
+
+fun box(): String {
+    assertEquals("13", B("13").data)
+    assertEquals(42, C(42).data)
+    assertEquals(true, D(true).data)
+    return "OK"
+}
diff --git a/js/js.translator/testData/box/jsImport/default/externalFunction.js b/js/js.translator/testData/box/jsImport/default/externalFunction.js
new file mode 100644
index 0000000..dfc1ec0
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalFunction.js
@@ -0,0 +1,5 @@
+define("lib", [], function () {
+    return function (y) {
+        return 23 + y;
+    }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalFunction.kt b/js/js.translator/testData/box/jsImport/default/externalFunction.kt
new file mode 100644
index 0000000..9362ab3
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalFunction.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+package foo
+
+@JsImport("lib")
+@JsImport.Default
+external fun foo(y: Int): Int = definedExternally
+
+fun box(): String {
+    assertEquals(65, foo(42))
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.js b/js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.js
new file mode 100644
index 0000000..e731aac
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.js
@@ -0,0 +1,5 @@
+define("lib", [], function () {
+    return function(y) {
+        return 23 + y;
+    }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.kt b/js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.kt
new file mode 100644
index 0000000..16e54ea
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.kt
@@ -0,0 +1,15 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+package foo
+
+@JsImport("lib")
+@JsImport.Default
+external fun foo(y: Int): Int = definedExternally
+
+fun foo(y: String): String = y + "K"
+
+fun box(): String {
+    val foo10 = foo(10)
+    if (foo10 != 33) return "Fail: $foo10"
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalObject.js b/js/js.translator/testData/box/jsImport/default/externalObject.js
new file mode 100644
index 0000000..9b17e88
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalObject.js
@@ -0,0 +1,8 @@
+define("lib", [], function () {
+    return {
+        x: 23,
+        foo: function(y) {
+            return this.x + y;
+        }
+    };
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalObject.kt b/js/js.translator/testData/box/jsImport/default/externalObject.kt
new file mode 100644
index 0000000..bfc2dcd
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalObject.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+package foo
+
+@JsImport("lib")
+@JsImport.Default
+external object A {
+    val x: Int = definedExternally
+
+    fun foo(y: Int): Int = definedExternally
+}
+
+fun box(): String {
+    assertEquals(23, A.x)
+    assertEquals(65, A.foo(42))
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalProperty.js b/js/js.translator/testData/box/jsImport/default/externalProperty.js
new file mode 100644
index 0000000..c76f9e7
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalProperty.js
@@ -0,0 +1,3 @@
+define("lib", [], function () {
+    return 23;
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalProperty.kt b/js/js.translator/testData/box/jsImport/default/externalProperty.kt
new file mode 100644
index 0000000..4b22ba3
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalProperty.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+package foo
+
+@JsImport("lib")
+@JsImport.Default
+external val foo: Int = definedExternally
+
+fun box(): String {
+    assertEquals(23, foo)
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/topLevelVarargFun.js b/js/js.translator/testData/box/jsImport/default/topLevelVarargFun.js
new file mode 100644
index 0000000..1d1fa0e
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/topLevelVarargFun.js
@@ -0,0 +1,5 @@
+define("lib", [], function () {
+    return function() {
+        return "(" + Array.prototype.join.call(arguments, "") + ")";
+    };
+})
diff --git a/js/js.translator/testData/box/jsImport/default/topLevelVarargFun.kt b/js/js.translator/testData/box/jsImport/default/topLevelVarargFun.kt
new file mode 100644
index 0000000..4014159
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/topLevelVarargFun.kt
@@ -0,0 +1,16 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@JsImport("lib")
+@JsImport.Default
+external fun foo(vararg arg: String): String
+
+fun box(): String {
+    val x = arrayOf("a", "b")
+    var r = foo(*x)
+    if (r != "(ab)") return "fail1: $r"
+
+    r = foo("c", "d")
+    if (r != "(cd)") return "fail2: $r"
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/externalClass.js b/js/js.translator/testData/box/jsImport/named/externalClass.js
new file mode 100644
index 0000000..7df3adb
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalClass.js
@@ -0,0 +1,15 @@
+define("lib", [], function () {
+    function Foo(x) {
+        this.x = x;
+    }
+
+    Foo.prototype.foo = function (y) {
+        return this.x + y;
+    };
+
+    Foo.prototype.bar = function() {
+        return "(" + Array.prototype.join.call(arguments, "") + ")";
+    };
+
+    return { Foo };
+})
diff --git a/js/js.translator/testData/box/jsImport/named/externalClass.kt b/js/js.translator/testData/box/jsImport/named/externalClass.kt
new file mode 100644
index 0000000..2153e0e
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalClass.kt
@@ -0,0 +1,34 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+package foo
+
+@JsImport("lib")
+@JsImport.Name("Foo")
+external class A(x: Int = definedExternally) {
+    val x: Int
+
+    fun foo(y: Int): Int = definedExternally
+
+    fun bar(vararg arg: String): String = definedExternally
+}
+
+class C {
+    val e = arrayOf("e")
+    val f = arrayOf("f")
+    val a = A(1)
+
+    fun qux() = a.bar(*e, *f)
+}
+
+
+fun box(): String {
+    val a = A(23)
+    assertEquals(23, a.x)
+    assertEquals(65, a.foo(42))
+
+    assertEquals(C().qux(), "(ef)")
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.js b/js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.js
new file mode 100644
index 0000000..69bf9b5
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.js
@@ -0,0 +1,13 @@
+define("lib", [], function () {
+    function Foo(ss) {
+        this.s = ss || "A"
+    }
+    Foo.prototype.foo = function (y) {
+        return y || "K";
+    };
+    Foo.prototype.bar = function (y) {
+        return y || "O";
+    };
+
+    return { Foo };
+})
diff --git a/js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.kt b/js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.kt
new file mode 100644
index 0000000..2778325
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.kt
@@ -0,0 +1,50 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+package foo
+
+@JsImport("lib")
+@JsImport.Name("Foo")
+external open class A(ss: String = definedExternally) {
+    val s: String
+    fun foo(y: String = definedExternally): String = definedExternally
+    fun bar(y: String = definedExternally): String = definedExternally
+}
+
+class C: A {
+    constructor(ss: String) : super(ss) {}
+    constructor() : super() {}
+
+    fun qux(s: String = "O") = s
+}
+
+
+fun box(): String {
+    val a = A()
+    val c = C()
+
+    val r1 = a.foo("O") + c.foo()
+    if (r1 != "OK") return "Fail1: $r1"
+
+    val r2 = a.bar() + c.bar("K")
+    if (r2 != "OK") return "Fail2: $r2"
+
+    val r3 = c.qux() + c.qux("K")
+    if (r3 != "OK") return "Fail3: $r3"
+
+    if (a.s != "A") return "Fail4: ${a.s}"
+    if (c.s != "A") return "Fail5: ${c.s}"
+
+    val a2 = A("A2")
+    val c2 = C("C2")
+
+    val r6 = a2.s + c2.s
+    if (r6 != "A2C2") return "Fail6: $r6"
+
+    return "OK"
+
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/externalConstructor.js b/js/js.translator/testData/box/jsImport/named/externalConstructor.js
new file mode 100644
index 0000000..8718a67
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalConstructor.js
@@ -0,0 +1,6 @@
+define("lib", [], function () {
+    function Foo (data) {
+        this.data = data
+    };
+    return { Foo }
+})
diff --git a/js/js.translator/testData/box/jsImport/named/externalConstructor.kt b/js/js.translator/testData/box/jsImport/named/externalConstructor.kt
new file mode 100644
index 0000000..d0ff370
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalConstructor.kt
@@ -0,0 +1,30 @@
+// EXPECTED_REACHABLE_NODES: 1334
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+package foo
+
+@JsImport("lib")
+@JsImport.Name("Foo")
+open external class A(data: String) {
+    constructor(data: Int)
+    constructor(data: Boolean)
+
+    val data: Any
+}
+
+class B(data: String) : A(data)
+
+class C(data: Int) : A(data)
+
+class D(data: Boolean) : A(data)
+
+fun box(): String {
+    assertEquals("13", B("13").data)
+    assertEquals(42, C(42).data)
+    assertEquals(true, D(true).data)
+    return "OK"
+}
diff --git a/js/js.translator/testData/box/jsImport/named/externalFunction.js b/js/js.translator/testData/box/jsImport/named/externalFunction.js
new file mode 100644
index 0000000..41df583
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalFunction.js
@@ -0,0 +1,7 @@
+define("lib", [], function () {
+    function bar(y) {
+        return 23 + y;
+    }
+
+    return { bar }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/externalFunction.kt b/js/js.translator/testData/box/jsImport/named/externalFunction.kt
new file mode 100644
index 0000000..dd7cf87
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalFunction.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+package foo
+
+@JsImport("lib")
+@JsImport.Name("bar")
+external fun foo(y: Int): Int = definedExternally
+
+fun box(): String {
+    assertEquals(65, foo(42))
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.js b/js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.js
new file mode 100644
index 0000000..41df583
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.js
@@ -0,0 +1,7 @@
+define("lib", [], function () {
+    function bar(y) {
+        return 23 + y;
+    }
+
+    return { bar }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.kt b/js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.kt
new file mode 100644
index 0000000..6864ed1
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.kt
@@ -0,0 +1,15 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+package foo
+
+@JsImport("lib")
+@JsImport.Name("bar")
+external fun foo(y: Int): Int = definedExternally
+
+fun foo(y: String): String = y + "K"
+
+fun box(): String {
+    val foo10 = foo(10)
+    if (foo10 != 33) return "Fail: $foo10"
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/externalObject.js b/js/js.translator/testData/box/jsImport/named/externalObject.js
new file mode 100644
index 0000000..2961c453
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalObject.js
@@ -0,0 +1,10 @@
+define("lib", [], function () {
+    const O = {
+        x: 23,
+        foo: function(y) {
+            return this.x + y;
+        }
+    };
+
+    return { O }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/externalObject.kt b/js/js.translator/testData/box/jsImport/named/externalObject.kt
new file mode 100644
index 0000000..6369e97
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalObject.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+package foo
+
+@JsImport("lib")
+@JsImport.Name("O")
+external object A {
+    val x: Int = definedExternally
+
+    fun foo(y: Int): Int = definedExternally
+}
+
+fun box(): String {
+    assertEquals(23, A.x)
+    assertEquals(65, A.foo(42))
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/externalProperty.js b/js/js.translator/testData/box/jsImport/named/externalProperty.js
new file mode 100644
index 0000000..2c0d2ca
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalProperty.js
@@ -0,0 +1,4 @@
+define("lib", [], function () {
+    const bar = 23;
+    return { bar }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/externalProperty.kt b/js/js.translator/testData/box/jsImport/named/externalProperty.kt
new file mode 100644
index 0000000..038e029
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalProperty.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+package foo
+
+@JsImport("lib")
+@JsImport.Name("bar")
+external val foo: Int = definedExternally
+
+fun box(): String {
+    assertEquals(23, foo)
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/topLevelVarargFun.js b/js/js.translator/testData/box/jsImport/named/topLevelVarargFun.js
new file mode 100644
index 0000000..dbc0a37
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/topLevelVarargFun.js
@@ -0,0 +1,6 @@
+define("lib", [], function () {
+    function bar() {
+        return "(" + Array.prototype.join.call(arguments, "") + ")";
+    }
+    return { bar }
+})
diff --git a/js/js.translator/testData/box/jsImport/named/topLevelVarargFun.kt b/js/js.translator/testData/box/jsImport/named/topLevelVarargFun.kt
new file mode 100644
index 0000000..26eb50a
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/topLevelVarargFun.kt
@@ -0,0 +1,16 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@JsImport("lib")
+@JsImport.Name("bar")
+external fun foo(vararg arg: String): String
+
+fun box(): String {
+    val x = arrayOf("a", "b")
+    var r = foo(*x)
+    if (r != "(ab)") return "fail1: $r"
+
+    r = foo("c", "d")
+    if (r != "(cd)") return "fail2: $r"
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/namespaced/externalObject.js b/js/js.translator/testData/box/jsImport/namespaced/externalObject.js
new file mode 100644
index 0000000..e241286
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/namespaced/externalObject.js
@@ -0,0 +1,10 @@
+define("lib", [], function () {
+    return {
+        O: {
+            x: 23,
+            foo: function(y) {
+                return this.x + y;
+            }
+        }
+    };
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/namespaced/externalObject.kt b/js/js.translator/testData/box/jsImport/namespaced/externalObject.kt
new file mode 100644
index 0000000..1ad8d3e
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/namespaced/externalObject.kt
@@ -0,0 +1,18 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+package foo
+
+@JsImport("lib")
+@JsImport.Namespace
+external object A {
+    object O {
+        val x: Int = definedExternally
+        fun foo(y: Int): Int = definedExternally
+    }
+}
+
+fun box(): String {
+    assertEquals(23, A.O.x)
+    assertEquals(65, A.O.foo(42))
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.js b/js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.js
new file mode 100644
index 0000000..7962353
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.js
@@ -0,0 +1,32 @@
+define("lib", [], function () {
+    function createX () {
+        return {x: "X1"};
+    }
+    function createXY () {
+        return {x: "X2", y: "Y2"};
+    }
+    function createXYZ() {
+        return {x: "X3", y: "Y3", z: "Z3"};
+    }
+    function createClassXYZ() {
+        return {x: "X4", y: "Y4", z: "Z4"};
+    }
+    function createNestedInterfaceXYZ() {
+        return {x: "X5", y: "Y5", z: "Z5"};
+    }
+
+    const x = "X6"
+    const y = "Y6"
+    const z = "Z6"
+
+    return {
+        createX,
+        createXY,
+        createXYZ,
+        createClassXYZ,
+        createNestedInterfaceXYZ,
+        x,
+        y,
+        z
+    }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.kt b/js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.kt
new file mode 100644
index 0000000..4dcf925
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.kt
@@ -0,0 +1,64 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// DONT_TARGET_EXACT_BACKEND: WASM
+// MODULE_KIND: AMD
+
+@OptIn(ExperimentalStdlibApi::class)
+@JsExternalInheritorsOnly
+external interface ExternalInterfaceX {
+    val x: String
+}
+
+external interface ExternalInterfaceXY : ExternalInterfaceX {
+    val y: String
+}
+
+external interface ExternalInterfaceXYZ : ExternalInterfaceXY {
+    val z: String
+}
+
+external class ExternalXYZ() : ExternalInterfaceXYZ {
+    override val x: String
+    override val y: String
+    override val z: String
+}
+
+external class ExternalClassNameSpace {
+    interface NestedInterfaceXYZ : ExternalInterfaceXYZ {
+        override val x: String
+        override val y: String
+        override val z: String
+    }
+}
+
+@JsImport("lib")
+@JsImport.Namespace
+external object Creator: ExternalInterfaceXYZ {
+    fun createX(): ExternalInterfaceX
+    fun createXY(): ExternalInterfaceXY
+    fun createXYZ(): ExternalInterfaceXYZ
+    fun createClassXYZ(): ExternalXYZ
+
+    fun createNestedInterfaceXYZ(): ExternalClassNameSpace.NestedInterfaceXYZ
+
+    override val x: String
+    override val y: String
+    override val z: String
+}
+
+fun checkX(x: ExternalInterfaceX, id: Int) = x.x == "X$id"
+fun checkXY(xy: ExternalInterfaceXY, id: Int) = checkX(xy, id) && xy.y == "Y$id"
+fun checkXYZ(xyz: ExternalInterfaceXYZ, id: Int) = checkXY(xyz, id) && xyz.z == "Z$id"
+
+fun box(): String {
+    if (!checkX(Creator.createX(), 1)) return "Fail interface X"
+    if (!checkXY(Creator.createXY(), 2)) return "Fail interface XY"
+    if (!checkXYZ(Creator.createXYZ(), 3)) return "Fail interface XYZ"
+
+    if (!checkXYZ(Creator.createClassXYZ(), 4)) return "Fail class XYZ"
+
+    if (!checkXYZ(Creator.createNestedInterfaceXYZ(), 5)) return "Fail nested interface XYZ"
+
+    if (!checkXYZ(Creator, 6)) return "Fail object XYZ"
+
+    return "OK"
+}
diff --git a/js/js.translator/testData/box/jsImport/plainNamed/externalClassNameClash.kt b/js/js.translator/testData/box/jsImport/plainNamed/externalClassNameClash.kt
new file mode 100644
index 0000000..0662128
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/plainNamed/externalClassNameClash.kt
@@ -0,0 +1,73 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+// FILE: a.kt
+package a
+
+@JsImport("a")
+external class A {
+    fun foo(): String
+}
+
+@JsImport("a")
+external fun bar(): Int
+
+@JsImport("a")
+external val prop: Int
+
+// FILE: b.kt
+package b
+
+@JsImport("b")
+external class A {
+    fun foo(): String
+}
+
+@JsImport("b")
+external fun bar(): Int
+
+@JsImport("b")
+external val prop: Int
+
+// FILE: main.kt
+
+import a.A as O
+import b.A as K
+
+fun box(): String {
+    if (a.bar() != 1) return "fail 1"
+    if (a.prop != 10) return "fail 2"
+    if (b.bar() != 2) return "fail 3"
+    if (b.prop != 20) return "fail 4"
+
+    return O().foo() + K().foo()
+}
+
+// FILE: a.js
+define("a", [], function () {
+    function A() {}
+
+    A.prototype.foo = function () {
+        return "O";
+    };
+
+    function bar() { return 1; }
+
+    let prop = 10
+
+    return { A, bar, prop }
+})
+
+// FILE: b.js
+define("b", [], function () {
+    function A() {}
+
+    A.prototype.foo = function () {
+        return "K";
+    };
+
+    function bar() { return 2; }
+
+    let prop = 20;
+
+    return { A, bar, prop }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/plainNamed/externalPackage.js b/js/js.translator/testData/box/jsImport/plainNamed/externalPackage.js
new file mode 100644
index 0000000..d8004d8
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/plainNamed/externalPackage.js
@@ -0,0 +1,28 @@
+define("lib", [], function () {
+    function A(x) {
+        this.x = x;
+    }
+    A.prototype.foo = function (y) {
+        return this.x + y;
+    };
+
+    function Nested() {
+        this.y = 55;
+    }
+    A.Nested = Nested;
+
+    var B = {
+        x: 123,
+        foo: function(y) {
+            return this.x + y;
+        }
+    };
+
+    function foo(y) {
+        return 323 + y;
+    }
+
+    var bar = 423;
+
+    return { A, B, foo, bar }
+})
diff --git a/js/js.translator/testData/box/jsImport/plainNamed/externalPackage.kt b/js/js.translator/testData/box/jsImport/plainNamed/externalPackage.kt
new file mode 100644
index 0000000..dec2f31
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/plainNamed/externalPackage.kt
@@ -0,0 +1,48 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+// FILE: a.kt
+package foo
+
+@JsImport("lib")
+external class A(x: Int) {
+    val x: Int
+
+    fun foo(y: Int): Int = definedExternally
+
+    class Nested {
+        val y: Int
+    }
+}
+
+@JsImport("lib")
+external object B {
+    val x: Int = definedExternally
+
+    fun foo(y: Int): Int = definedExternally
+}
+
+@JsImport("lib")
+external fun foo(y: Int): Int = definedExternally
+
+@JsImport("lib")
+external val bar: Int = definedExternally
+
+// FILE: b.kt
+package foo
+
+fun box(): String {
+    val a = A(23)
+    assertEquals(23, a.x)
+    assertEquals(65, a.foo(42))
+
+    val nested = A.Nested()
+    assertEquals(55, nested.y)
+
+    assertEquals(123, B.x)
+    assertEquals(265, B.foo(142))
+
+    assertEquals(365, foo(42))
+    assertEquals(423, bar)
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.js b/js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.js
new file mode 100644
index 0000000..7034601
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.js
@@ -0,0 +1,29 @@
+C = {
+    f: function() {
+        return 12345;
+    }
+};
+
+define("lib", [], function () {
+    function A(x) {
+        this.x = x;
+    }
+    A.prototype.foo = function (y) {
+        return this.x + y;
+    };
+
+    var B = {
+        x: 123,
+        foo: function(y) {
+            return this.x + y;
+        }
+    };
+
+    function foo(y) {
+        return 323 + y;
+    }
+
+    var bar = 423;
+
+    return { A, B, foo, bar };
+})
diff --git a/js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.kt b/js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.kt
new file mode 100644
index 0000000..b1c05f6
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.kt
@@ -0,0 +1,50 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+// FILE: lib.kt
+package foo
+
+@JsImport("lib")
+external class A(x: Int = definedExternally) {
+    val x: Int
+
+    fun foo(y: Int): Int = definedExternally
+}
+
+@JsImport("lib")
+external object B {
+    val x: Int = definedExternally
+
+    fun foo(y: Int): Int = definedExternally
+}
+
+@JsImport("lib")
+external fun foo(y: Int): Int = definedExternally
+
+@JsImport("lib")
+external val bar: Int = definedExternally
+
+// FILE: lib2.kt
+package foo
+
+external object C {
+    fun f(): Int = definedExternally
+}
+
+// FILE: main.kt
+package foo
+
+fun box(): String {
+    val a = A(23)
+    assertEquals(23, a.x)
+    assertEquals(65, a.foo(42))
+
+    assertEquals(123, B.x)
+    assertEquals(265, B.foo(142))
+
+    assertEquals(365, foo(42))
+    assertEquals(423, bar)
+
+    assertEquals(12345, C.f())
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/plainNamed/interfaces.js b/js/js.translator/testData/box/jsImport/plainNamed/interfaces.js
new file mode 100644
index 0000000..3147a35
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/plainNamed/interfaces.js
@@ -0,0 +1,15 @@
+define("lib", [], function () {
+    var bar = {
+        ping() {
+            return "ping"
+        }
+    };
+
+    var baz = {
+        pong() {
+            return 194
+        }
+    };
+
+    return { bar, baz }
+})
diff --git a/js/js.translator/testData/box/jsImport/plainNamed/interfaces.kt b/js/js.translator/testData/box/jsImport/plainNamed/interfaces.kt
new file mode 100644
index 0000000..e9bf5e8
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/plainNamed/interfaces.kt
@@ -0,0 +1,43 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// IGNORE_BACKEND: WASM
+// MODULE_KIND: AMD
+// FILE: bar.kt
+package foo
+
+@JsImport("lib")
+external interface Bar {
+    fun ping(): String
+}
+
+// FILE: baz.kt
+package boo
+
+@JsImport("lib")
+external interface Baz {
+    fun pong(): Int
+}
+
+// FILE: root.kt
+import foo.Bar
+import boo.Baz
+
+@JsImport("lib")
+external val bar: Bar
+
+@JsImport("lib")
+external val baz: Baz
+
+// FILE: test.kt
+import boo.Baz
+
+fun box(): String {
+    if (bar.ping() != "ping" || baz.pong() != 194) return "Fail"
+
+    val local = object : Baz {
+        override fun pong(): Int = 322
+    }
+
+    if (local.asDynamic().pong() != 322) return "Fail"
+
+    return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.js b/js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.js
new file mode 100644
index 0000000..f3d161d
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.js
@@ -0,0 +1,7 @@
+define("lib", [], function () {
+    const Bar = {
+        ok() { return "OK" }
+    };
+
+    return { Bar }
+})
diff --git a/js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.kt b/js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.kt
new file mode 100644
index 0000000..d80f038
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.kt
@@ -0,0 +1,20 @@
+// TARGET_BACKEND: JS_IR
+// TARGET_BACKEND: JS_IR_ES6
+// EXPECTED_REACHABLE_NODES: 1238
+// MODULE_KIND: AMD
+// FILE: bar.kt
+package bar
+
+@JsImport("lib")
+external interface Bar {
+    companion object {
+        fun ok(): String
+    }
+}
+
+// FILE: test.kt
+import bar.Bar
+
+fun box(): String {
+    return Bar.ok()
+}
\ No newline at end of file
diff --git a/libraries/stdlib/js/src/kotlin/annotationsJs.kt b/libraries/stdlib/js/src/kotlin/annotationsJs.kt
index 3c8780b..9b2736b 100644
--- a/libraries/stdlib/js/src/kotlin/annotationsJs.kt
+++ b/libraries/stdlib/js/src/kotlin/annotationsJs.kt
@@ -104,6 +104,56 @@
 public annotation class JsModule(val import: String)
 
 /**
+ * Denotes an `external` declaration that must be imported from native JavaScript library.
+ * It's the future replacement for the [JsModule] annotation
+ *
+ * The compiler produces the code relevant for the target module system, for example, in case of CommonJS,
+ * it will import the declaration via the ESM `import` statement
+ *
+ * The annotation can be used on top-level external declarations (classes, properties, functions) and files.
+ * In case of file (which can't be `external`) the following rule applies: all the declarations in
+ * the file must be `external`. By applying `@JsModule(...)` on a file you tell the compiler to import a JavaScript object
+ * that contain all the declarations from the file.
+ *
+ * Example:
+ *
+ * ``` kotlin
+ * @JsImport(from = "jquery", exportName = "Test")
+ * external abstract class JQuery() {
+ *     // some declarations here
+ * }
+ *
+ * @JsImport(from = "jquery", default = true)
+ * external fun JQuery(element: Element): JQuery
+ * ```
+ *
+ * @property `from` name of a module to import declaration from.
+ *           It is not interpreted by the Kotlin compiler, it's passed as is directly to the target module system.
+ * @property `default` handle the case if the imported declaration is default exported from the target module.
+ * @property `exportName` declare the original name that is used to export the declaration from the target module.
+ */
+@SinceKotlin("1.9")
+@Retention(AnnotationRetention.BINARY)
+@Target(CLASS, PROPERTY, FUNCTION, FILE)
+public annotation class JsImport(val from: String) {
+
+    @Retention(AnnotationRetention.BINARY)
+    @Target(CLASS, PROPERTY, FUNCTION, CONSTRUCTOR)
+    @SinceKotlin("1.9")
+    public annotation class Name(val exportName: String)
+
+    @Retention(AnnotationRetention.BINARY)
+    @Target(CLASS, PROPERTY, FUNCTION, CONSTRUCTOR)
+    @SinceKotlin("1.9")
+    public annotation class Default
+
+    @Retention(AnnotationRetention.BINARY)
+    @Target(CLASS)
+    @SinceKotlin("1.9")
+    public annotation class Namespace
+}
+
+/**
  * Denotes an `external` declaration that can be used without module system.
  *
  * By default, an `external` declaration is available regardless your target module system.
diff --git a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/FirWasmJsTranslatorTestGenerated.java b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/FirWasmJsTranslatorTestGenerated.java
index 071ac06..6dc7332 100644
--- a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/FirWasmJsTranslatorTestGenerated.java
+++ b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/FirWasmJsTranslatorTestGenerated.java
@@ -266,6 +266,294 @@
     }
 
     @Nested
+    @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport")
+    @TestDataPath("$PROJECT_ROOT")
+    public class JsFileImport {
+      @Test
+      public void testAllFilesPresentInJsFileImport() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/default")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Default {
+        @Test
+        public void testAllFilesPresentInDefault() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/named")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Named {
+        @Test
+        public void testAllFilesPresentInNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/plainNamed")
+      @TestDataPath("$PROJECT_ROOT")
+      public class PlainNamed {
+        @Test
+        public void testAllFilesPresentInPlainNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+        }
+
+        @Test
+        @TestMetadata("externalClassNameClash.kt")
+        public void testExternalClassNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalClassNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackage.kt")
+        public void testExternalPackage() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackageInDifferentFile.kt")
+        public void testExternalPackageInDifferentFile() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+        }
+
+        @Test
+        @TestMetadata("interfaces.kt")
+        public void testInterfaces() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.kt");
+        }
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/esModules/jsImport")
+    @TestDataPath("$PROJECT_ROOT")
+    public class JsImport {
+      @Test
+      public void testAllFilesPresentInJsImport() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/default")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Default {
+        @Test
+        public void testAllFilesPresentInDefault() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/named")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Named {
+        @Test
+        public void testAllFilesPresentInNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/namespaced")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Namespaced {
+        @Test
+        public void testAllFilesPresentInNamespaced() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/plainNamed")
+      @TestDataPath("$PROJECT_ROOT")
+      public class PlainNamed {
+        @Test
+        public void testAllFilesPresentInPlainNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+        }
+
+        @Test
+        @TestMetadata("externalClassNameClash.kt")
+        public void testExternalClassNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalClassNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackage.kt")
+        public void testExternalPackage() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackageInDifferentFile.kt")
+        public void testExternalPackageInDifferentFile() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+        }
+
+        @Test
+        @TestMetadata("interfaces.kt")
+        public void testInterfaces() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.kt");
+        }
+      }
+    }
+
+    @Nested
     @TestMetadata("js/js.translator/testData/box/esModules/jsModule")
     @TestDataPath("$PROJECT_ROOT")
     public class JsModule {
diff --git a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/K1WasmJsTranslatorTestGenerated.java b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/K1WasmJsTranslatorTestGenerated.java
index 20bf569..95c1596 100644
--- a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/K1WasmJsTranslatorTestGenerated.java
+++ b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/K1WasmJsTranslatorTestGenerated.java
@@ -266,6 +266,294 @@
     }
 
     @Nested
+    @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport")
+    @TestDataPath("$PROJECT_ROOT")
+    public class JsFileImport {
+      @Test
+      public void testAllFilesPresentInJsFileImport() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/default")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Default {
+        @Test
+        public void testAllFilesPresentInDefault() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/named")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Named {
+        @Test
+        public void testAllFilesPresentInNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/plainNamed")
+      @TestDataPath("$PROJECT_ROOT")
+      public class PlainNamed {
+        @Test
+        public void testAllFilesPresentInPlainNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+        }
+
+        @Test
+        @TestMetadata("externalClassNameClash.kt")
+        public void testExternalClassNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalClassNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackage.kt")
+        public void testExternalPackage() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackageInDifferentFile.kt")
+        public void testExternalPackageInDifferentFile() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+        }
+
+        @Test
+        @TestMetadata("interfaces.kt")
+        public void testInterfaces() {
+          runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.kt");
+        }
+      }
+    }
+
+    @Nested
+    @TestMetadata("js/js.translator/testData/box/esModules/jsImport")
+    @TestDataPath("$PROJECT_ROOT")
+    public class JsImport {
+      @Test
+      public void testAllFilesPresentInJsImport() {
+        KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/default")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Default {
+        @Test
+        public void testAllFilesPresentInDefault() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/named")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Named {
+        @Test
+        public void testAllFilesPresentInNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+        }
+
+        @Test
+        @TestMetadata("externalClass.kt")
+        public void testExternalClass() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClass.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunction.kt")
+        public void testExternalFunction() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunction.kt");
+        }
+
+        @Test
+        @TestMetadata("externalFunctionNameClash.kt")
+        public void testExternalFunctionNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalObject.kt");
+        }
+
+        @Test
+        @TestMetadata("externalProperty.kt")
+        public void testExternalProperty() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/externalProperty.kt");
+        }
+
+        @Test
+        @TestMetadata("topLevelVarargFun.kt")
+        public void testTopLevelVarargFun() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/namespaced")
+      @TestDataPath("$PROJECT_ROOT")
+      public class Namespaced {
+        @Test
+        public void testAllFilesPresentInNamespaced() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+        }
+
+        @Test
+        @TestMetadata("externalObject.kt")
+        public void testExternalObject() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.kt");
+        }
+      }
+
+      @Nested
+      @TestMetadata("js/js.translator/testData/box/esModules/jsImport/plainNamed")
+      @TestDataPath("$PROJECT_ROOT")
+      public class PlainNamed {
+        @Test
+        public void testAllFilesPresentInPlainNamed() {
+          KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+        }
+
+        @Test
+        @TestMetadata("externalClassNameClash.kt")
+        public void testExternalClassNameClash() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalClassNameClash.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackage.kt")
+        public void testExternalPackage() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.kt");
+        }
+
+        @Test
+        @TestMetadata("externalPackageInDifferentFile.kt")
+        public void testExternalPackageInDifferentFile() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+        }
+
+        @Test
+        @TestMetadata("interfaces.kt")
+        public void testInterfaces() {
+          runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.kt");
+        }
+      }
+    }
+
+    @Nested
     @TestMetadata("js/js.translator/testData/box/esModules/jsModule")
     @TestDataPath("$PROJECT_ROOT")
     public class JsModule {