/*
 * 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 {
    targets {
        fromPreset(presets.js, 'js') {
            // Enable built-in test runner only for IR target.
            // These runners don't support changing js module name change.
            if (js.hasProperty("irTarget") && irTarget != null) {
                irTarget.nodejs()
                irTarget.compilations['main']?.dependencies {
                    api "org.jetbrains.kotlinx:atomicfu-js:$atomicfu_version"
                }
            }
        }
    }

    sourceSets {
        jsMain.dependencies {
            api "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version"
        }

        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')

compileKotlinJs {
    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")
    }
}

compileTestKotlinJs {
    kotlinOptions.metaInfo = true
    kotlinOptions.sourceMap = true
    kotlinOptions.moduleKind = 'umd'
}


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

    def configuration = configurations.hasProperty("legacyjsTestRuntimeClasspath")
            ? configurations.legacyjsTestRuntimeClasspath
            : 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
