plugins {
  id "org.implab.gradle-typescript" version "1.0.1-rc3"
  id "org.implab.gradle-hg"
  id "ivy-publish"
}

// если версия явно не заданы вычисляем ее из тэга ревизии v.{num}***
// результатом будет версия '{num}.{distance}' где distance - расстояние от
// текущей ревизии до ревизии с тэгом
def tagDistance = 0;

ext {
    packageName = "@$npmScope/$name"
    lint = project.hasProperty('lint') ? lint : false
}

configurations {
    
}

sources {
    amd {
        typings {
            srcDir main.output.typingsDir
        }
    }

    cjs {
        typings {
            srcDir main.output.typingsDir
        }
    }

    testAmd {
        typings {
            srcDir main.output.typingsDir
            srcDir amd.output.typingsDir
            srcDir test.output.typingsDir
        }
    }

    testCjs {
        typings {
            srcDir main.output.typingsDir
            srcDir cjs.output.typingsDir
            srcDir test.output.typingsDir
        }
    }
}

typescript {
    compilerOptions {
        types = []
        declaration = true
        sourceMap = true
        sourceRoot = "_src"
    }
    tscCmd = "$projectDir/node_modules/.bin/tsc"
    tsLintCmd = "$projectDir/node_modules/.bin/tslint"
	esLintCmd = "$projectDir/node_modules/.bin/eslint"
	npmCmd = "npm"
}

tasks.matching{ it.name =~ /^configureTs/ }.configureEach {
    dependsOn "prepare"
}

tasks.matching{ it.name =~ /^lint/ }.configureEach {
    onlyIf { lint }
}

task prepare {
    
}

task printVersion {
    dependsOn prepare
    
    doLast {
        println "version: ${-> version}";
        println "packageName: ${-> packageName}";
        println "target: ${-> typescript.compilerOptions.target}";
        println "module: ${-> typescript.compilerOptions.module}";
    }
}

task clean {
    prepare.mustRunAfter it

    doLast {
        delete buildDir
    }
}

npmPackMeta {
    meta {
        name = packageName
    }
}

configureTsCjs {
    dependsOn sources.main.output
    compilerOptions {
        types += [ "node" ]
    }
}

configureTsAmd {
    dependsOn sources.main.output
    compilerOptions {
        types += [ "requirejs", "dojo-typings" ]
    }
}

test {
    workingDir layout.buildDirectory.dir("test");
    commandLine "node", "tests/index.js"
}

assemble {
    mustRunAfter sources.amd.output,
        sources.cjs.output
        
    from sources.amd.output.compiledDir
    from sources.cjs.output.compiledDir
}

assembleTest {
    mustRunAfter sources.amd.output,
        sources.cjs.output,
        sources.testAmd.output,
        sources.testCjs.output

    from sources.amd.output.compiledDir
    from sources.cjs.output.compiledDir
    from sources.testAmd.output.compiledDir
    from sources.testCjs.output.compiledDir
}

task prepareLocalDebug {
    prepare.mustRunAfter it

    doLast {
        tasks.matching{ it.name =~ /^configureTs/ }.configureEach {
            compilerOptions {
                sourceRoot = "file://" + it.rootDir
            }
        }
    }
}

task prepareNode {
    prepare.mustRunAfter it

    doLast {
        typescript {
            compilerOptions {
                module = "commonjs"
                target = "es2017"
                lib = ["es2017", "dom", "scripthost"]
            }
        }
    }
}

task prepareBrowser {
    prepare.mustRunAfter it

    doLast {
        packageName = "@$npmScope/$project.name-amd"

        typescript {
            compilerOptions {
                module = "amd"
                target = "es5"
                lib = ["es5", "dom", "scripthost", "es2015.promise", "es2015.symbol", "es2015.iterable"]
            }
        }
    }
}

task npmPackTypingsAmd(type: Copy) {
    dependsOn sources.main.output
    dependsOn sources.amd.output
    npmPack.mustRunAfter it

    from sources.main.output.typingsDir
    from sources.amd.output.typingsDir

    into "${->buildDir}/npm/pack"
}

task npmPackSourcesAmd(type: Copy) {
    from sources.main.ts
    from sources.amd.ts

    npmPack.mustRunAfter it

    into "${->buildDir}/npm/pack/_src"
}

task assembleBrowser {
    dependsOn prepareBrowser, assemble, sources.amd.output
}

task assembleNode {
    dependsOn prepareNode, assemble, sources.cjs.output
}

task assembleTestBrowser {
    dependsOn prepareBrowser, prepareLocalDebug, assembleTest, sources.amd.output, sources.testAmd.output
}

task testBrowser {
    dependsOn prepareBrowser, test, sources.amd.output, sources.testAmd.output
}

task testNode {
    dependsOn prepareNode, test, sources.cjs.output, sources.testCjs.output
}

task npmPackBrowser {
    dependsOn assembleBrowser, npmPack, npmPackSourcesAmd, npmPackTypingsAmd
}


task packJsTar(type: Tar) {
    dependsOn assemble;

    archiveBaseName = provider { packageName }

    destinationDirectory = buildDir
    archiveClassifier = provider { typescript.compilerOptions.module }
    compression = Compression.GZIP

    from(assemble.outputs)

    doLast {
        println archiveName;
    }
}

task packTypingsTar(type: Tar) {
}

publishing {
    publications {
        local(IvyPublication) {
            artifact(packJsTar) {
                type = "js"
            }
        }
    }

    repositories {
        ivy {
            url "ivy-repo"
        }
    }
}