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

def prop(name, defVal) {
    def value = project.properties[name]
    if (value == null) return defVal
    return value
}

def distTag(version) {
    def i = version.indexOf('-')
    if (i > 0) return version.substring(i + 1)
    return "latest"
}

def npmTemplateDir = file("$projectDir/npm")
def npmDeployDir = file("$buildDir/npm")

def authToken = prop("kotlin.npmjs.auth.token", "")
def dryRun = prop("dryRun", "false")

def jsLegacy = kotlin.targets.hasProperty("jsLegacy")
        ? kotlin.targets.jsLegacy
        : kotlin.targets.js

// Note: publish transformed files using dependency on sourceSets.main.output
task preparePublishNpm(type: Copy) {
    from(npmTemplateDir) {
        // Postpone expansion of package.json until we configure version property in build.gradle
        def copySpec = it
        afterEvaluate {
            copySpec.expand(project.properties + [kotlinDependency: "\"kotlin\": \"$kotlin_version\""])
        }
    }
    // we must publish output that is transformed by atomicfu
    from(jsLegacy.compilations.main.output.allOutputs)
    into npmDeployDir
}

task publishNpm(type: NpmTask, dependsOn: [preparePublishNpm]) {
    workingDir = npmDeployDir
  
    doFirst {
        def npmDeployTag = distTag(version)
        def deployArgs = ['publish',
                          "--//registry.npmjs.org/:_authToken=$authToken",
                          "--tag=$npmDeployTag"]
        if (dryRun == "true") {
            println("$npmDeployDir \$ npm arguments: $deployArgs")
            args = ['pack']
        } else {
            args = deployArgs
        }
    }
}
