import org.siouan.frontendgradleplugin.infrastructure.gradle.* import java.io.FileInputStream import java.io.FileNotFoundException import java.io.FileOutputStream import java.util.* plugins { id("refinery-frontend-conventions") } val frontend = the() val yarn1Version = providers.gradleProperty("frontend.yarn1Version") frontend.yarnGlobalInstallScript.set(yarn1Version.map { version -> "install -g yarn@$version" }) frontend.yarnInstallScript.set(frontend.yarnVersion.map { version -> "set version $version --only-if-needed" }) frontend.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.named("installNode") { onlyIf { getFrontendProperty("installedNodeVersion") != frontend.nodeVersion.get() } doLast { putFrontedProperty("installedNodeVersion", frontend.nodeVersion.get()) } } tasks.named("installYarnGlobally") { onlyIf { getFrontendProperty("installedYarn1Version") != yarn1Version.get() } doLast { putFrontedProperty("installedYarn1Version", yarn1Version.get()) } outputs.dir(frontend.nodeInstallDirectory.map { dir -> "$dir/lib/node_modules/yarn" }) } tasks.named("installYarn") { outputs.file(frontend.yarnVersion.map { version -> ".yarn/releases/yarn-$version.cjs" }) } tasks.named("installFrontend") { inputs.files("package.json", "yarn.lock") outputs.files(".pnp.cjs", ".pnp.loader.mjs") } tasks.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") }