aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/frontend/build.gradle.kts
blob: ab2f61c9836eaf25245d16a95698b1a2ff7fc8a3 (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
import org.siouan.frontendgradleplugin.infrastructure.gradle.RunYarn
import tools.refinery.buildsrc.SonarPropertiesUtils

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

val viteOutputDir = "$buildDir/vite"
val productionResources = file("$viteOutputDir/production")

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

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

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

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

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

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

val sharedConfigFiles = installationState + files(
		"tsconfig.json",
		"tsconfig.base.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 = sourcesWithTypes + buildScripts + sharedConfigFiles

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

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

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

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

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

val fixFrontend by tasks.registering(RunYarn::class) {
	dependsOn(tasks.installFrontend)
	dependsOn(generateXStateTypes)
	dependsOn(typeCheckFrontend)
	inputs.files(lintingFiles)
	script.set("run lint:fix")
	group = "verification"
	description = "Fix TypeScript lint errors and warnings."
}

tasks.check {
	dependsOn(typeCheckFrontend)
	dependsOn(lintFrontend)
}

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

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

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