// MatsSocket-Client-JavaScript CLIENT LIBRARY

apply from: '../node.gradle'

/*
 * Runs Rollup - via npm - to create the different distributions:
 * 1. Native EcmaScript Modules (ESM) - just use the files directly
 * 2. Native EcmaScript Modules (EMS) - bundled
 * 3. Native EcmaScript Modules (EMS) - bundled, minified
 * 4. Universal Module Definition (UMD) - bundled ("by definition")
 * 5. Universal Module Definition (UMD) - bundled, minified
 *
 * Using this blog post as reference:
 * https://dev.to/remshams/rolling-up-a-multi-module-system-esm-cjs-compatible-npm-library-with-typescript-and-babel-3gjg
 */
tasks.register('build', NpmTask) {
    dependsOn jsdoc, archiveLib
    args = ['run', 'build']
    inputs.files('package.json', 'package-lock.json', 'rollup.config.js')
    inputs.dir('lib')
    outputs.dir('dist')
}

tasks.register('download') {
    dependsOn nodeBinDir
}

tasks.register('downloadAll') {
    dependsOn download, npmInstall
}

tasks.register('jsdoc', NpmTask) {
    dependsOn npmInstall
    args = ['run', 'jsdoc']
    inputs.files('package.json', 'package-lock.json', 'rollup.config.js')
    inputs.dir('lib')
    outputs.dir('jsdoc')
    File jsdocFile = file("$projectDir/jsdoc/index.html")
    doLast {
        println("##### JavaScript Client API docs: " + jsdocFile.toURI())
    }
}

// Package up the JavaScript library
tasks.register('archiveLib', Zip) {
    from "$projectDir/lib"
    into "matssocket-${project.version}-js"
    def destinationDir = layout.projectDirectory.dir("dist")
    def archiveName = "matssocket-${project.version}-js.zip"
    destinationDirectory = destinationDir
    archiveFileName = archiveName
    doLast {
        println("##### JavaScript Client zip: " + destinationDir + "/" + archiveName)
    }
}

tasks.register('jsPackDryRun', NpmTask) {
    dependsOn build
    args = ['pack', '--dry-run']
}

tasks.register('jsPublishDryRun', NpmTask) {
    dependsOn build
    args = ['publish', '--dry-run', '--tag', 'experimental']
}

// NOTE! Wrt. npmjs tags: It is possible to move tags without publish new packet, using e.g.
// `npm dist-tag add matssocket@2.0.0-beta.1 next` or `npm dist-tag rm matssocket beta`

tasks.register('jsPublishExperimental', NpmTask) {
    dependsOn build
    // Remember to update version in package.json, it shall read "x.y.z-experimental+<iso datetime>" (e.g. 2021-07-14T18-06)
    // REMEMBER: Update version in package.json and MatsSocket.js!!!
    args = ['publish', '--tag', 'experimental']
}

tasks.register('jsPublishRc', NpmTask) {
    dependsOn build
    // Remember to update version in package.json, it shall read "x.y.z-rcX+<iso date>" (e.g. 2021-07-14)
    // REMEMBER: Update version in package.json and MatsSocket.js!!!
    args = ['publish', '--tag', 'rc']
}

tasks.register('jsPublish', NpmTask) {
    dependsOn build
    // Remember to update version in package.json, it shall read "x.y.z-rc+<iso date>" (e.g. 2021-07-14)
    // REMEMBER: Update version in package.json and MatsSocket.js!!!
    // 'publish' by default uses '--tag latest'
    args = ['publish']
}

// Version of Node
tasks.register('nodeVersion', NodeTask) {
    script = file('README.md') // Dummy file, we just want to run node --version
    options = ['--version']
}

// Version of NPM
tasks.register('npmVersion', NpmTask) {
    args = ['--version']
}

// Versions of Node and NPM
tasks.register('versions') {dependsOn nodeVersion, npmVersion }

tasks.register('clean', Delete) {
    delete layout.buildDirectory
    delete "$projectDir/dist/"
    delete "$projectDir/jsdoc/"
}

tasks.register('distclean', Delete) {dependsOn distcleanNode }
