aboutsummaryrefslogtreecommitdiffstats
path: root/buildSrc/src/main/kotlin/tools/refinery/gradle/frontend-worktree.gradle.kts
blob: 3225a1b119407444ce8c5984a13760b56cb037e7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package tools.refinery.gradle

import java.io.FileInputStream
import java.io.FileNotFoundException
import java.io.FileOutputStream
import java.util.Properties

plugins {
	id("tools.refinery.gradle.internal.frontend-conventions")
}

val yarn1Version = providers.gradleProperty("frontend.yarn1Version")

frontend {
	yarnGlobalInstallScript.set(yarn1Version.map { version -> "install -g yarn@$version" })
	yarnInstallScript.set(frontend.yarnVersion.map { version -> "set version $version --only-if-needed" })
	installScript.set(provider {
		if (project.hasProperty("ci")) "install --immutable --inline-builds" else "install"
	})
}

val frontendPropertiesFile = frontend.nodeInstallDirectory.map { dir -> "$dir/frontend.properties" }

fun readFrontendProperties(): Properties {
	val props = Properties()
	try {
		FileInputStream(frontendPropertiesFile.get()).use { inputStream ->
			props.load(inputStream)
		}
	} catch (ignored: FileNotFoundException) {
		// Ignore missing file.
	}
	return props
}

fun getFrontendProperty(propertyName: String): String? {
	val props = readFrontendProperties()
	return props[propertyName]?.toString()
}

fun putFrontedProperty(propertyName: String, propertyValue: String) {
	val props = readFrontendProperties()
	props[propertyName] = propertyValue
	FileOutputStream(frontendPropertiesFile.get()).use { outputStream ->
		props.store(outputStream, "generated by refinery-frontend-worktree")
	}
}

tasks {
	installNode {
		onlyIf {
			getFrontendProperty("installedNodeVersion") != frontend.nodeVersion.get()
		}
		doLast {
			putFrontedProperty("installedNodeVersion", frontend.nodeVersion.get())
		}
	}

	installYarnGlobally {
		onlyIf {
			getFrontendProperty("installedYarn1Version") != yarn1Version.get()
		}
		doLast {
			putFrontedProperty("installedYarn1Version", yarn1Version.get())
		}
		outputs.dir(frontend.nodeInstallDirectory.map { dir -> "$dir/lib/node_modules/yarn" })
	}

	installYarn {
		outputs.file(frontend.yarnVersion.map { version -> ".yarn/releases/yarn-$version.cjs" })
	}

	installFrontend {
		inputs.files("package.json", "yarn.lock")
		outputs.files(".pnp.cjs", ".pnp.loader.mjs")
	}

	register("clobberFrontend", Delete::class) {
		delete(frontend.nodeInstallDirectory)
		delete(".yarn/cache")
		delete(".yarn/install-state.gz")
		delete(".yarn/sdks")
		delete(".yarn/unplugged")
		delete(".pnp.cjs")
		delete(".pnp.loader.mjs")
	}
}