1+
12import org.gradle.api.*
23import org.gradle.api.artifacts.dsl.*
34import org.gradle.api.artifacts.repositories.*
45import org.gradle.api.initialization.dsl.*
56import org.gradle.kotlin.dsl.*
67import org.jetbrains.kotlin.gradle.targets.js.nodejs.*
7- import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.*
88import org.jetbrains.kotlin.gradle.targets.js.yarn.*
99import java.net.*
1010
@@ -100,16 +100,28 @@ private fun Project.checkRedirect(repositories: RepositoryHandler, containerName
100100 }
101101}
102102
103- private fun Project.configureYarnAndNodeRedirects () {
103+ private fun Project.configureYarnRedirects () {
104104 if (CacheRedirector .isEnabled) {
105- val yarnRootExtension = extensions.findByType<YarnRootExtension >()
106- yarnRootExtension?.downloadBaseUrl?.let {
107- yarnRootExtension.downloadBaseUrl = CacheRedirector .maybeRedirect(it)
105+ plugins.withType(YarnPlugin ::class ) {
106+ extensions.configure(YarnRootEnvSpec ::class .java) {
107+ // no API to modify the value in-place keeping it lazy: https://github.com/gradle/gradle/issues/27227
108+ downloadBaseUrl.orNull?.let {
109+ downloadBaseUrl = CacheRedirector .maybeRedirect(it)
110+ }
111+ }
108112 }
113+ }
114+ }
109115
110- val nodeJsExtension = rootProject.extensions.findByType<NodeJsRootExtension >()
111- nodeJsExtension?.downloadBaseUrl?.let {
112- nodeJsExtension.downloadBaseUrl = CacheRedirector .maybeRedirect(it)
116+ private fun Project.configureNodeJsRedirects () {
117+ if (CacheRedirector .isEnabled) {
118+ plugins.withType(NodeJsPlugin ::class ) {
119+ extensions.configure(NodeJsEnvSpec ::class .java) {
120+ // no API to modify the value in-place keeping it lazy: https://github.com/gradle/gradle/issues/27227
121+ downloadBaseUrl.orNull?.let {
122+ downloadBaseUrl = CacheRedirector .maybeRedirect(it)
123+ }
124+ }
113125 }
114126 }
115127}
@@ -128,14 +140,16 @@ object CacheRedirector {
128140 @JvmStatic
129141 fun configure (project : Project ) {
130142 project.checkRedirect(project.repositories, project.displayName)
143+ project.configureNodeJsRedirects()
131144 }
132145
133146 /* *
134- * Configures JS-specific extensions to use
147+ * Configures JS-specific extensions defined on the root project to use cache redirector
148+ * For example, KGP provides Yarn configuration only globally for the entire build via the root project.
135149 */
136150 @JvmStatic
137- fun configureJsPackageManagers ( project : Project ) {
138- project.configureYarnAndNodeRedirects ()
151+ fun configureRootJsPackageManagers ( rootProject : Project ) {
152+ rootProject.configureYarnRedirects ()
139153 }
140154
141155 @JvmStatic
0 commit comments