Skip to content

Commit 87e0b34

Browse files
committed
Read package.json into extension #232
1 parent d15f7ee commit 87e0b34

File tree

4 files changed

+99
-0
lines changed

4 files changed

+99
-0
lines changed

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ repositories {
3838
}
3939

4040
dependencies {
41+
api("com.fasterxml.jackson.core:jackson-databind:2.13.2.2")
4142
testImplementation(platform("org.junit:junit-bom:5.6.2"))
4243
testImplementation("org.junit.jupiter:junit-jupiter-api")
4344
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")

src/main/kotlin/com/github/gradle/node/NodePlugin.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class NodePlugin : Plugin<Project> {
2525
override fun apply(project: Project) {
2626
this.project = project
2727
val nodeExtension = NodeExtension.create(project)
28+
project.extensions.create<PackageJsonExtension>(PackageJsonExtension.NAME, project)
2829
addGlobalTypes()
2930
addTasks()
3031
addNpmRule()
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.github.gradle.node
2+
3+
import com.fasterxml.jackson.databind.JsonNode
4+
import com.fasterxml.jackson.databind.ObjectMapper
5+
import org.gradle.api.Project
6+
import org.gradle.kotlin.dsl.property
7+
8+
9+
open class PackageJsonExtension(project: Project) {
10+
val node = project.objects.property<JsonNode>()
11+
12+
init {
13+
node.finalizeValueOnRead()
14+
node.set(project.provider { project.file("package.json").let(ObjectMapper()::readTree) })
15+
}
16+
17+
val name = project.provider { node.get().get("name").asText() }
18+
19+
val version = project.provider { node.get().get("version").asText() }
20+
21+
val description = project.provider { node.get().get("description").asText() }
22+
23+
val homepage = project.provider { node.get().get("homepage").asText() }
24+
25+
val license = project.provider { node.get().get("license").asText() }
26+
27+
val private = project.provider { node.get().get("private").asBoolean() }
28+
29+
fun get(name: String): String {
30+
return node.get().get(name).asText()
31+
}
32+
33+
fun getBoolean(name: String): Boolean {
34+
return node.get().get(name).asBoolean()
35+
}
36+
37+
fun get(vararg name: String): String {
38+
return name.fold(node.get()) { acc, next -> acc.get(next) }.asText()
39+
}
40+
41+
companion object {
42+
/**
43+
* Extension name in Gradle
44+
*/
45+
const val NAME = "package.json"
46+
}
47+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
//file:noinspection GroovyPointlessBoolean
2+
package com.github.gradle.node
3+
4+
import com.github.gradle.AbstractProjectTest
5+
6+
class PackageJsonExtensionTest extends AbstractProjectTest {
7+
def 'check standard attributes'() {
8+
when:
9+
temporaryFolder.newFile("package.json") << """
10+
{ "name": "test", "version": "1.10.2", "private": false }
11+
"""
12+
project.apply plugin: 'com.github.node-gradle.node'
13+
project.evaluate()
14+
15+
then:
16+
def ext = project.extensions.getByName('package.json') as PackageJsonExtension
17+
ext.name.get() == "test"
18+
ext.version.get() == "1.10.2"
19+
ext.private.get() == false
20+
}
21+
22+
def 'get raw attributes'() {
23+
when:
24+
temporaryFolder.newFile("package.json") << """
25+
{ "name": "test", "version": "1.10.2", "private": false }
26+
"""
27+
project.apply plugin: 'com.github.node-gradle.node'
28+
project.evaluate()
29+
30+
then:
31+
def ext = project.extensions.getByName('package.json') as PackageJsonExtension
32+
ext.get("name") == "test"
33+
ext.getBoolean("private") == false
34+
}
35+
36+
def 'get nested attributes'() {
37+
when:
38+
temporaryFolder.newFile("package.json") << """
39+
{
40+
"upper": { "lower": { "end": "done" } }
41+
}
42+
"""
43+
project.apply plugin: 'com.github.node-gradle.node'
44+
project.evaluate()
45+
46+
then:
47+
def ext = project.extensions.getByName('package.json') as PackageJsonExtension
48+
ext.get("upper", "lower", "end") == "done"
49+
}
50+
}

0 commit comments

Comments
 (0)