/*
 * Copyright 2016-2020 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 {
        // In 1.3.7x js() has not member `moduleName`
        // In 1.4.x it has and allow to safety set compiler output file name and does not break test integration
        if (it.hasProperty("moduleName")) {
            moduleName = project.name
        }

        // In 1.3.7x js() has not member `irTarget`
        // 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.hasProperty("irTarget") && 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
