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

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

ext {
    packageName = "@$npmScope/$name"
}

if (!version) {
    
    def rev = ["hg", "log", "-r", ".", "--template", "{latesttag('re:^v') % '{tag}-{distance}'}"].execute().text.trim();

    def tagVersion;

    def match = (rev =~ /^v(\d+\.\d+\.\d+).*-(\d+)$/);
    
    if (match.size()) {
        tagVersion = match[0][1];
        tagDistance = match[0][2].toInteger();
    } else {
        throw new Exception("A version must be specied");
    }

    version = tagVersion;

    if (tagDistance > 0)
        version++;
} else {
    println "explicit version: $version";
}

if (hasProperty('versionSuffix') && versionSuffix) {
    version += "-$versionSuffix"
}

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
        listFiles = true
    }
    tscCmd = "$projectDir/node_modules/.bin/tsc"
    tsLintCmd = "$projectDir/node_modules/.bin/tslint"
	esLintCmd = "$projectDir/node_modules/.bin/eslint"
	npmCmd = "npm"
}

task prepare {
    
}

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

task clean {
    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"
}

task assembleAmd {
    dependsOn sources.amd.output
    assemble.mustRunAfter it

    doLast {
        assemble {
            from(sources.amd.output.compiledDir)
        }
    }
}

task assembleCjs {
    dependsOn sources.cjs.output
    assemble.mustRunAfter it

    doLast {
        assemble {
            from(sources.cjs.output.compiledDir)
        }
    }
}

task assembleTestAmd {
    dependsOn sources.amd.output
    dependsOn sources.testAmd.output
    assembleTest.mustRunAfter it

    doLast {
        assembleTest {
            from(sources.amd.output.compiledDir)
            from(sources.testAmd.output.compiledDir)
        }
    }
}

task assembleTestCjs {
    dependsOn sources.cjs.output
    dependsOn sources.testCjs.output
    assembleTest.mustRunAfter it

    doLast {
        assembleTest {
            from(sources.cjs.output.compiledDir)
            from(sources.testCjs.output.compiledDir)
        }
    }
}

task prepareTargetEs5 {
    prepare.mustRunAfter it

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

task prepareTargetEsNext {
    prepare.mustRunAfter it

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

task prepareNode {
    dependsOn prepareTargetEsNext
    prepare.mustRunAfter it

    doLast {
        typescript {
            compilerOptions {
                module = "commonjs"
            }
        }
    }
}

task prepareBrowser {
    dependsOn prepareTargetEs5
    prepare.mustRunAfter it

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

        typescript {
            compilerOptions {
                module = "amd"
            }
        }
    }
}

task assembleBrowser {
    dependsOn prepareBrowser, assembleAmd, assemble
}

task assembleNode {
    dependsOn prepareNode, assembleCjs, assemble
}

task testBrowser {
    dependsOn prepareBrowser, assembleTestAmd, test
}

task testNode {
    dependsOn prepareNode, assembleTestCjs, test
}