aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/frontend/build.gradle.kts
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2023-04-09 00:53:53 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2023-04-09 00:53:53 +0200
commitc3fcc1ae3d2f680a973e66c138d9be7ae22eee26 (patch)
tree6a30b2478a30747cd7a2522acdff941394dea4e7 /subprojects/frontend/build.gradle.kts
parentbuild: always prefer slf4j instead of log4j 1.x (diff)
downloadrefinery-c3fcc1ae3d2f680a973e66c138d9be7ae22eee26.tar.gz
refinery-c3fcc1ae3d2f680a973e66c138d9be7ae22eee26.tar.zst
refinery-c3fcc1ae3d2f680a973e66c138d9be7ae22eee26.zip
build: refactor frontend build
* Always write ESLint output to a file in addition to the console to make the lintFrontend task cacheable in Gradle (according to the output file). * Make sure frontend task inputs are declared properly for caching. * Make sure Typescript type checking is incremental. * Do not use @tsconfig, because both Vite and SonarScanner have problems with extending tsconfig files from Yarn PnP modules.
Diffstat (limited to 'subprojects/frontend/build.gradle.kts')
-rw-r--r--subprojects/frontend/build.gradle.kts75
1 files changed, 41 insertions, 34 deletions
diff --git a/subprojects/frontend/build.gradle.kts b/subprojects/frontend/build.gradle.kts
index 4a51c74e..8d2a8631 100644
--- a/subprojects/frontend/build.gradle.kts
+++ b/subprojects/frontend/build.gradle.kts
@@ -18,15 +18,45 @@ val productionAssets: Configuration by configurations.creating {
18 isCanBeResolved = false 18 isCanBeResolved = false
19} 19}
20 20
21val sourcesWithoutTypeGen = fileTree("src") { 21val sourcesWithoutTypes = fileTree("src") {
22 exclude("**/*.typegen.ts") 22 exclude("**/*.typegen.ts")
23} 23}
24 24
25val sourcesWithTypes = fileTree("src") + fileTree("types")
26
27val buildScripts = fileTree("config") + files(
28 ".eslintrc.cjs",
29 "prettier.config.cjs",
30 "vite.config.ts",
31)
32
33val installationState = files(
34 rootProject.file("yarn.lock"),
35 rootProject.file("package.json"),
36 "package.json",
37)
38
39val sharedConfigFiles = installationState + files(
40 "tsconfig.json",
41 "tsconfig.base.json",
42 "tsconfig.node.json",
43 "tsconfig.shared.json",
44)
45
46val assembleConfigFiles = sharedConfigFiles + file("vite.config.ts") + fileTree("config") {
47 include("**/*.ts")
48}
49
50val assembleSources = sourcesWithTypes + fileTree("public") + file("index.html")
51
52val assembleFiles = assembleSources + assembleConfigFiles
53
54val lintingFiles = sourcesWithTypes + buildScripts + sharedConfigFiles
55
25val generateXStateTypes by tasks.registering(RunYarn::class) { 56val generateXStateTypes by tasks.registering(RunYarn::class) {
26 dependsOn(tasks.installFrontend) 57 dependsOn(tasks.installFrontend)
27 inputs.files(sourcesWithoutTypeGen) 58 inputs.files(sourcesWithoutTypes)
28 inputs.file("package.json") 59 inputs.files(installationState)
29 inputs.file(rootProject.file("yarn.lock"))
30 outputs.dir("src") 60 outputs.dir("src")
31 script.set("run typegen") 61 script.set("run typegen")
32 description = "Generate TypeScript typings for XState state machines." 62 description = "Generate TypeScript typings for XState state machines."
@@ -34,11 +64,7 @@ val generateXStateTypes by tasks.registering(RunYarn::class) {
34 64
35tasks.assembleFrontend { 65tasks.assembleFrontend {
36 dependsOn(generateXStateTypes) 66 dependsOn(generateXStateTypes)
37 inputs.dir("public") 67 inputs.files(assembleFiles)
38 inputs.files(sourcesWithoutTypeGen)
39 inputs.file("index.html")
40 inputs.files("package.json", "tsconfig.json", "tsconfig.base.json", "vite.config.ts")
41 inputs.file(rootProject.file("yarn.lock"))
42 outputs.dir(productionResources) 68 outputs.dir(productionResources)
43} 69}
44 70
@@ -51,10 +77,7 @@ artifacts {
51val typeCheckFrontend by tasks.registering(RunYarn::class) { 77val typeCheckFrontend by tasks.registering(RunYarn::class) {
52 dependsOn(tasks.installFrontend) 78 dependsOn(tasks.installFrontend)
53 dependsOn(generateXStateTypes) 79 dependsOn(generateXStateTypes)
54 inputs.dir("src") 80 inputs.files(lintingFiles)
55 inputs.dir("types")
56 inputs.files("package.json", "tsconfig.json", "tsconfig.base.json", "tsconfig.node.json")
57 inputs.file(rootProject.file("yarn.lock"))
58 outputs.dir("$buildDir/typescript") 81 outputs.dir("$buildDir/typescript")
59 script.set("run typecheck") 82 script.set("run typecheck")
60 group = "verification" 83 group = "verification"
@@ -65,17 +88,9 @@ val lintFrontend by tasks.registering(RunYarn::class) {
65 dependsOn(tasks.installFrontend) 88 dependsOn(tasks.installFrontend)
66 dependsOn(generateXStateTypes) 89 dependsOn(generateXStateTypes)
67 dependsOn(typeCheckFrontend) 90 dependsOn(typeCheckFrontend)
68 inputs.dir("src") 91 inputs.files(lintingFiles)
69 inputs.dir("types") 92 outputs.file("$buildDir/eslint.json")
70 inputs.files(".eslintrc.cjs", "prettier.config.cjs") 93 script.set("run lint")
71 inputs.files("package.json", "tsconfig.json", "tsconfig.base.json", "tsconfig.node.json")
72 inputs.file(rootProject.file("yarn.lock"))
73 if (project.hasProperty("ci")) {
74 outputs.file("$buildDir/eslint.json")
75 script.set("run lint:ci")
76 } else {
77 script.set("run lint")
78 }
79 group = "verification" 94 group = "verification"
80 description = "Check for TypeScript lint errors and warnings." 95 description = "Check for TypeScript lint errors and warnings."
81} 96}
@@ -84,11 +99,7 @@ val fixFrontend by tasks.registering(RunYarn::class) {
84 dependsOn(tasks.installFrontend) 99 dependsOn(tasks.installFrontend)
85 dependsOn(generateXStateTypes) 100 dependsOn(generateXStateTypes)
86 dependsOn(typeCheckFrontend) 101 dependsOn(typeCheckFrontend)
87 inputs.dir("src") 102 inputs.files(lintingFiles)
88 inputs.dir("types")
89 inputs.files(".eslintrc.cjs", "prettier.config.cjs")
90 inputs.files("package.json", "tsconfig.json", "tsconfig.base.json", "tsconfig.node.json")
91 inputs.file(rootProject.file("yarn.lock"))
92 script.set("run lint:fix") 103 script.set("run lint:fix")
93 group = "verification" 104 group = "verification"
94 description = "Fix TypeScript lint errors and warnings." 105 description = "Fix TypeScript lint errors and warnings."
@@ -102,11 +113,7 @@ tasks.check {
102tasks.register("serveFrontend", RunYarn::class) { 113tasks.register("serveFrontend", RunYarn::class) {
103 dependsOn(tasks.installFrontend) 114 dependsOn(tasks.installFrontend)
104 dependsOn(generateXStateTypes) 115 dependsOn(generateXStateTypes)
105 inputs.dir("public") 116 inputs.files(assembleFiles)
106 inputs.files(sourcesWithoutTypeGen)
107 inputs.file("index.html")
108 inputs.files("package.json", "tsconfig.json", "tsconfig.base.json", "vite.config.ts")
109 inputs.file(rootProject.file("yarn.lock"))
110 outputs.dir("$viteOutputDir/development") 117 outputs.dir("$viteOutputDir/development")
111 script.set("run serve") 118 script.set("run serve")
112 group = "run" 119 group = "run"