aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/frontend/build.gradle.kts
blob: ac2c1817d6874335e45e46b86e783f309de4b651 (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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
 *
 * SPDX-License-Identifier: EPL-2.0
 */

import org.siouan.frontendgradleplugin.infrastructure.gradle.RunYarn
import tools.refinery.gradle.utils.SonarPropertiesUtils

plugins {
	id("tools.refinery.gradle.frontend-workspace")
	id("tools.refinery.gradle.sonarqube")
}

frontend {
	assembleScript.set("run build")
}

val viteOutputDir = layout.buildDirectory.dir("vite")

val productionResources: Provider<Directory> = viteOutputDir.map { it.dir("production") }

val productionAssets: Configuration by configurations.creating {
	isCanBeConsumed = true
	isCanBeResolved = false
}

val sourcesWithoutTypes = fileTree("src") {
	exclude("**/*.typegen.ts")
}

val sourcesWithTypes: FileCollection = fileTree("src") + fileTree("types")

val buildScripts: FileCollection = fileTree("config") + files(
		rootProject.file(".eslintrc.cjs"),
		rootProject.file("prettier.config.cjs"),
		"vite.config.ts",
)

val installationState = files(
		rootProject.file("yarn.lock"),
		rootProject.file("package.json"),
		"package.json",
)

val sharedConfigFiles: FileCollection = installationState + files(
		rootProject.file("tsconfig.base.json"),
		"tsconfig.json",
		"tsconfig.node.json",
		"tsconfig.shared.json",
)

val assembleConfigFiles = sharedConfigFiles + file("vite.config.ts") + fileTree("config") {
	include("**/*.ts")
}

val assembleSources = sourcesWithTypes + fileTree("public") + file("index.html")

val assembleFiles = assembleSources + assembleConfigFiles

val lintingFiles: FileCollection = sourcesWithTypes + buildScripts + sharedConfigFiles

tasks {
	val generateXStateTypes by registering(RunYarn::class) {
		dependsOn(installFrontend)
		inputs.files(sourcesWithoutTypes)
		inputs.files(installationState)
		outputs.dir("src")
		script.set("run typegen")
		description = "Generate TypeScript typings for XState state machines."
	}

	assembleFrontend {
		dependsOn(generateXStateTypes)
		inputs.files(assembleFiles)
		outputs.dir(productionResources)
	}

	val typeCheckFrontend by registering(RunYarn::class) {
		dependsOn(installFrontend)
		dependsOn(generateXStateTypes)
		inputs.files(lintingFiles)
		outputs.dir(layout.buildDirectory.dir("typescript"))
		script.set("run typecheck")
		group = "verification"
		description = "Check for TypeScript type errors."
	}

	val lintFrontend by registering(RunYarn::class) {
		dependsOn(installFrontend)
		dependsOn(generateXStateTypes)
		dependsOn(typeCheckFrontend)
		inputs.files(lintingFiles)
		outputs.file(layout.buildDirectory.file("eslint.json"))
		script.set("run lint")
		group = "verification"
		description = "Check for TypeScript lint errors and warnings."
	}

	register<RunYarn>("fixFrontend") {
		dependsOn(installFrontend)
		dependsOn(generateXStateTypes)
		dependsOn(typeCheckFrontend)
		inputs.files(lintingFiles)
		script.set("run lint:fix")
		group = "verification"
		description = "Fix TypeScript lint errors and warnings."
	}

	check {
		dependsOn(typeCheckFrontend)
		dependsOn(lintFrontend)
	}

	register<RunYarn>("serveFrontend") {
		dependsOn(installFrontend)
		dependsOn(generateXStateTypes)
		inputs.files(assembleFiles)
		outputs.dir(viteOutputDir.map { it.dir("development") })
		script.set("run serve")
		group = "run"
		description = "Start a Vite dev server with hot module replacement."
	}

	clean {
		delete("dev-dist")
		delete(fileTree("src") {
			include("**/*.typegen.ts")
		})
	}
}

artifacts {
	add("productionAssets", productionResources) {
		builtBy(tasks.assembleFrontend)
	}
}

sonarqube.properties {
	SonarPropertiesUtils.addToList(properties, "sonar.sources", "src")
	property("sonar.nodejs.executable", "${frontend.nodeInstallDirectory.get()}/bin/node")
	property("sonar.eslint.reportPaths", "${layout.buildDirectory.get()}/eslint.json")
}