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

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

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"
}

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

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
}

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

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

task assembleTestAmd {
    dependsOn sources.amd.output
    dependsOn sources.testAmd.output

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

assembleTest {
    mustRunAfter assembleTestAmd
    dependsOn sources.main.output
    from(sources.main.output.compiledDir)
}



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

task prepareTargetEsNext {
    doLast {
        typescript {
            compilerOptions {
                target = "esnext"
                lib = ["esnext", "dom", "scripthost"]
            }
        }
    }
}

task prepareNode {
    dependsOn prepareTargetEsNext
    doLast {
        typescript {
            compilerOptions {
                target = "esnext"
                module = "commonjs"
            }
        }
    }
}

task prepareBrowser {
    dependsOn prepareTargetEs5
    doLast {
        typescript {
            compilerOptions {
                module = "requirejs"
            }
        }
    }
}

prepare {
    mustRunAfter prepareNode, prepareBrowser
}