diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PackageJson.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PackageJson.kt index 840eaeef488..cb39b5196ff 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PackageJson.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PackageJson.kt @@ -5,6 +5,8 @@ package org.jetbrains.kotlin.gradle.targets.js.npm +import com.google.gson.ExclusionStrategy +import com.google.gson.FieldAttributes import com.google.gson.Gson import com.google.gson.GsonBuilder import org.jetbrains.kotlin.gradle.internal.ensureParentDirsCreated @@ -15,6 +17,8 @@ class PackageJson( var name: String, var version: String ) { + private val customFields = mutableMapOf() + val empty: Boolean get() = main == null && private == null && @@ -55,6 +59,10 @@ class PackageJson( val bundledDependencies = mutableListOf() get() = field ?: mutableListOf() + fun customField(key: String, value: Any) { + customFields[key] = value + } + companion object { fun scopedName(name: String): ScopedName = if (name.contains("/")) ScopedName( scope = name.substringBeforeLast("/").removePrefix("@"), @@ -72,11 +80,26 @@ class PackageJson( fun saveTo(packageJsonFile: File) { val gson = GsonBuilder() .setPrettyPrinting() + .addSerializationExclusionStrategy( + object : ExclusionStrategy { + override fun shouldSkipField(f: FieldAttributes?): Boolean = + f?.name == this@PackageJson::customFields.name + + override fun shouldSkipClass(clazz: Class<*>?): Boolean = + false + } + ) .create() packageJsonFile.ensureParentDirsCreated() + val jsonTree = gson.toJsonTree(this) + customFields + .forEach { (key, value) -> + val valueElement = gson.toJsonTree(value) + jsonTree.asJsonObject.add(key, valueElement) + } packageJsonFile.writer().use { - gson.toJson(this, it) + gson.toJson(jsonTree, it) } } }