diff --git a/libraries/tools/kotlin-gradle-plugin-npm-versions-codegen/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-npm-versions-codegen/build.gradle.kts index fbcda6c4a60..23665d192e5 100644 --- a/libraries/tools/kotlin-gradle-plugin-npm-versions-codegen/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-npm-versions-codegen/build.gradle.kts @@ -3,8 +3,20 @@ plugins { } dependencies { -// implementation(project(":kotlin-gradle-plugin")) implementation("io.ktor:ktor-client-cio:1.4.0") implementation("com.google.code.gson:gson:${rootProject.extra["versions.jar.gson"]}") + implementation("org.apache.velocity:velocity:1.7") implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.0.0-RC") +} + +val generateNpmVersions by generator( + "org.jetbrains.kotlin.generators.gradle.targets.js.MainKt", + sourceSets["main"] +) + +listOf(generateNpmVersions).forEach { + it.systemProperty( + "org.jetbrains.kotlin.generators.gradle.targets.js.outputSourceRoot", + project(":kotlin-gradle-plugin").projectDir.resolve("src/main/kotlin").absolutePath + ) } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-npm-versions-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/targets/js/PackageDto.kt b/libraries/tools/kotlin-gradle-plugin-npm-versions-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/targets/js/PackageDto.kt new file mode 100644 index 00000000000..aa6220bed38 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-npm-versions-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/targets/js/PackageDto.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.generators.gradle.targets.js + +data class Package( + val name: String, + val version: SemVer +) { + // Used in velocity template + @Suppress("unused") + fun camelize(): String = + name + .split("-") + .mapIndexed { index, item -> if (index == 0) item else item.capitalize() } + .joinToString("") +} + +data class PackageInformation( + val name: String, + val versions: Set +) \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-npm-versions-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/targets/js/VersionFetcher.kt b/libraries/tools/kotlin-gradle-plugin-npm-versions-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/targets/js/VersionFetcher.kt index 80b72f92f2d..5526dd60b4e 100644 --- a/libraries/tools/kotlin-gradle-plugin-npm-versions-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/targets/js/VersionFetcher.kt +++ b/libraries/tools/kotlin-gradle-plugin-npm-versions-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/targets/js/VersionFetcher.kt @@ -18,35 +18,44 @@ import kotlin.coroutines.CoroutineContext class VersionFetcher( private val coroutineContext: CoroutineContext -) { +) : AutoCloseable { private val client = HttpClient() suspend fun fetch(): List { - return withContext(coroutineContext) { - npmPackages - .map { packageName -> - val packagePath = - if (packageName.startsWith("@")) - "@" + encodeURIComponent(packageName) - else - encodeURIComponent(packageName) + return npmPackages + .map { fetchPackageInformationAsync(it) } + .map { fetched -> + val (packageName, value) = fetched.await() + val fetchedPackageInformation = Gson().fromJson(value, FetchedPackageInformation::class.java) + PackageInformation( + packageName, + fetchedPackageInformation.versions.keys + ) + } + } - val fetch = async { - client.get("http://registry.npmjs.org/$packagePath") - } + private suspend fun fetchPackageInformationAsync(packageName: String) = + withContext(coroutineContext) { + val packagePath = + if (packageName.startsWith("@")) + "@" + encodeURIComponent(packageName) + else + encodeURIComponent(packageName) - val fetchedPackageInformation = Gson().fromJson(fetch.await(), FetchedPackageInformation::class.java) - PackageInformation( - packageName, - fetchedPackageInformation.versions.keys - ) - }.also { - client.close() - } + async { + packageName to client.get("http://registry.npmjs.org/$packagePath") + } } + + override fun close() { + client.close() } } +private data class FetchedPackageInformation( + val versions: Map +) + fun encodeURIComponent(s: String): String { return try { URLEncoder.encode(s, StandardCharsets.UTF_8.name()) @@ -59,18 +68,4 @@ fun encodeURIComponent(s: String): String { } catch (e: UnsupportedEncodingException) { s } -} - -data class PackageInformation( - val name: String, - val versions: Set -) - -data class Package( - val name: String, - val version: SemVer -) - -data class FetchedPackageInformation( - val versions: Map -) \ No newline at end of file +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-npm-versions-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/targets/js/main.kt b/libraries/tools/kotlin-gradle-plugin-npm-versions-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/targets/js/main.kt index 06c507d7539..5307aa3433b 100644 --- a/libraries/tools/kotlin-gradle-plugin-npm-versions-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/targets/js/main.kt +++ b/libraries/tools/kotlin-gradle-plugin-npm-versions-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/targets/js/main.kt @@ -6,14 +6,47 @@ package org.jetbrains.kotlin.generators.gradle.targets.js import kotlinx.coroutines.runBlocking +import org.apache.velocity.VelocityContext +import org.apache.velocity.app.Velocity +import org.apache.velocity.app.VelocityEngine +import org.apache.velocity.runtime.RuntimeConstants.RESOURCE_LOADER +import java.io.File fun main() { + val outputSourceRoot = System.getProperties()["org.jetbrains.kotlin.generators.gradle.targets.js.outputSourceRoot"] + val packageName = "org.jetbrains.kotlin.gradle.targets.js" + val className = "NpmVersions" + val fileName = "$className.kt" + val targetFile = File("$outputSourceRoot") + .resolve(packageName.replace(".", "/")) + .resolve(fileName) + + val context = VelocityContext() + .apply { + put("package", packageName) + put("class", className) + } + + val velocityEngine = VelocityEngine().apply { + setProperty(RESOURCE_LOADER, "class") + setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader") + init() + } + + val template = velocityEngine.getTemplate("$fileName.vm") + runBlocking { - val packages = VersionFetcher(coroutineContext).fetch() + val packages = VersionFetcher(coroutineContext).use { + it.fetch() + } findLastVersions(packages) - .forEach { - println(it) + .also { + context.put("dependencies", it) } + + targetFile.writer().use { + template.merge(context, it) + } } } diff --git a/libraries/tools/kotlin-gradle-plugin-npm-versions-codegen/src/main/resources/NpmVersions.kt.vm b/libraries/tools/kotlin-gradle-plugin-npm-versions-codegen/src/main/resources/NpmVersions.kt.vm new file mode 100644 index 00000000000..60e7cdeda77 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-npm-versions-codegen/src/main/resources/NpmVersions.kt.vm @@ -0,0 +1,18 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package $package + +/** + * Package versions used by tasks + */ +// DO NOT MODIFY DIRECTLY! Use org.jetbrains.kotlin.generators.gradle.targets.js.MainKt +class $class { +#foreach( $dep in $dependencies ) + val $dep.camelize() = NpmPackageVersion("$dep.name", "$dep.version") +#end + + val kotlinJsTestRunner = KotlinGradleNpmPackage("test-js-runner") +} \ No newline at end of file