/*
 * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
 */

apply from: rootProject.file('gradle/node-js.gradle')

kotlin {
    js {
        moduleName = project.name

        // In 1.4.x it has in `both` and `legacy` mode and js() is of type `KotlinJsTarget`
        // `irTarget` is non-null in `both` mode
        // and contains appropriate `irTarget` with type `KotlinJsIrTarget`
        // `irTarget` is null in `legacy` mode
        if (it.irTarget != null) {
            irTarget.nodejs()
            irTarget.compilations['main']?.dependencies {
                api "org.jetbrains.kotlinx:atomicfu-js:$atomicfu_version"
            }
        }
    }

    sourceSets {
        jsTest.dependencies {
            api "org.jetbrains.kotlin:kotlin-test-js:$kotlin_version"
        }
    }
}

// When source sets are configured
apply from: rootProject.file('gradle/test-mocha-js.gradle')

def compileJsLegacy = tasks.hasProperty("compileKotlinJsLegacy")
        ? compileKotlinJsLegacy
        : compileKotlinJs

def compileTestJsLegacy = tasks.hasProperty("compileTestKotlinJsLegacy")
        ? compileTestKotlinJsLegacy
        : compileTestKotlinJs

compileJsLegacy.configure {
    kotlinOptions.metaInfo = true
    kotlinOptions.sourceMap = true
    kotlinOptions.moduleKind = 'umd'

    kotlinOptions {
        // drop -js suffix from outputFile
        def baseName = project.name - "-js"
        outputFile = new File(outputFile.parent, baseName + ".js")
    }
}

compileTestJsLegacy.configure {
    kotlinOptions.metaInfo = true
    kotlinOptions.sourceMap = true
    kotlinOptions.moduleKind = 'umd'
}


task populateNodeModules(type: Copy, dependsOn: compileTestJsLegacy) {
    // we must copy output that is transformed by atomicfu
    from(kotlin.js().compilations.main.output.allOutputs)
    into "$node.nodeModulesDir/node_modules"

    def configuration = configurations.hasProperty("jsLegacyTestRuntimeClasspath")
            ? configurations.jsLegacyTestRuntimeClasspath
            : configurations.jsTestRuntimeClasspath

    from(files {
        configuration.collect { File file ->
            file.name.endsWith(".jar") ?
                    zipTree(file.absolutePath).matching {
                        include '*.js'
                        include '*.js.map'
                    } : files()
        }
    }.builtBy(configuration))
}

npmInstall.dependsOn populateNodeModules
