@@ -6,41 +6,31 @@ package util.tasks
6
6
7
7
import org.gradle.api.GradleException
8
8
import org.gradle.api.Project
9
- import org.gradle.api.Task
10
- import org.gradle.api.tasks.Delete
11
- import org.gradle.api.tasks.Exec
12
- import org.gradle.api.tasks.TaskProvider
13
- import org.gradle.kotlin.dsl.*
14
- import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsEnvSpec
15
- import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension
16
- import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
17
- import org.jetbrains.kotlin.gradle.targets.js.npm.BaseNpmExtension
18
- import org.jetbrains.kotlin.gradle.targets.js.npm.LockFileMismatchReport
19
- import org.jetbrains.kotlin.gradle.targets.js.npm.NpmExtension
20
- import org.jetbrains.kotlin.gradle.targets.wasm.nodejs.WasmNodeJsEnvSpec
21
- import org.jetbrains.kotlin.gradle.targets.wasm.nodejs.WasmNodeJsRootExtension
22
- import org.jetbrains.kotlin.gradle.targets.wasm.nodejs.WasmNodeJsRootPlugin
23
- import org.jetbrains.kotlin.gradle.targets.wasm.npm.WasmNpmExtension
24
- import org.jetbrains.kotlin.gradle.targets.web.nodejs.BaseNodeJsEnvSpec
25
- import org.jetbrains.kotlin.gradle.targets.web.nodejs.BaseNodeJsRootExtension
26
- import org.jetbrains.kotlin.gradle.targets.web.nodejs.CommonNodeJsRootPlugin
9
+ import org.gradle.kotlin.dsl.assign
10
+ import org.gradle.kotlin.dsl.configure
11
+ import org.gradle.kotlin.dsl.provideDelegate
12
+ import org.gradle.kotlin.dsl.withType
13
+ import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnLockMismatchReport
14
+ import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin
15
+ import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootEnvSpec
16
+ import org.jetbrains.kotlin.gradle.targets.wasm.yarn.WasmYarnPlugin
17
+ import org.jetbrains.kotlin.gradle.targets.wasm.yarn.WasmYarnRootEnvSpec
18
+ import org.jetbrains.kotlin.gradle.targets.web.yarn.BaseYarnRootEnvSpec
19
+ import org.jetbrains.kotlin.gradle.targets.web.yarn.CommonYarnPlugin
27
20
import util.other.optionalProperty
28
21
import util.other.spacePassword
29
22
import util.other.useProxyRepositories
30
23
import java.io.File
31
24
32
- const val PUPPETEER_BROWSERS_DIR = " .puppeteer"
33
-
34
25
private inline fun <
35
- reified Plugin : CommonNodeJsRootPlugin ,
36
- reified Spec : BaseNodeJsEnvSpec ,
37
- reified RootExtension : BaseNodeJsRootExtension ,
26
+ reified Plugin : CommonYarnPlugin ,
27
+ reified Spec : BaseYarnRootEnvSpec ,
38
28
> Project.registerCustomNpmTasks (
39
29
target : String ,
40
30
useProxy : Boolean ,
41
31
) {
42
32
val capitalizedTarget = target.replaceFirstChar { it.titlecase() }
43
- val login = tasks.register(" execute${capitalizedTarget} NpmLogin" ) {
33
+ tasks.register(" execute${capitalizedTarget} NpmLogin" ) {
44
34
if (! useProxyRepositories) {
45
35
return @register
46
36
}
@@ -91,100 +81,38 @@ private inline fun <
91
81
if (useProxy) {
92
82
downloadBaseUrl = " https://packages.jetbrains.team/files/p/krpc/build-deps/"
93
83
}
94
-
95
- val nodeExecutable = executable
96
-
97
- extensions.configure<RootExtension > {
98
- /* *
99
- * Long story short:
100
- * We can use Yarn because of this: https://youtrack.jetbrains.com/issue/KT-78504
101
- * So: `kotlin.js.yarn=false`
102
- *
103
- * When we use `npm` instead, it runs `npm install` task.
104
- * That should install `puppeteer` package, which should run its script `install.mjs`.
105
- * That script installs browsers for tests.
106
- *
107
- * If we pass `--ignore-scripts` to npm, the script won't be executed.
108
- * KGP does it by default.
109
- * So we set `ignoreScripts = false`.
110
- * We set it for `NpmExtension` and `WasmNpmExtension` in `NodeJsRootPlugin` and `WasmNodeJsRootPlugin`
111
- * respectively (and not their common supertype because it will not work)
112
- *
113
- * And this approach worked for Yarn.
114
- * Script was executed, browsers were installed.
115
- *
116
- * For some reason, for `npm` it didn't work.
117
- * Even with a proper flag (which I checked with a --debug flag).
118
- *
119
- * So we need to run the script manually AFTER `kotlinNpmInstall` (or `kotlinWasmNpmInstall`).
120
- * But also, BEFORE every other action that comes after `kotlinNpmInstall` (or `kotlinWasmNpmInstall`),
121
- * as otherwise there will be race in parallel tasks execution.
122
- *
123
- * Hence, all shenanigans.
124
- */
125
- val puppeteerInstall = tasks.register<Exec >(" puppeteerInstall$capitalizedTarget " ) {
126
- commandLine(nodeExecutable.get(), " build/$target /node_modules/puppeteer/install.mjs" )
127
- workingDir = rootProject.projectDir
128
-
129
- // keep in sync with <ROOT>/.puppeteer.cjs
130
- outputs.dir(rootProject.projectDir.resolve(PUPPETEER_BROWSERS_DIR ).resolve(" browsers" ))
131
- }
132
-
133
- npmInstallTaskProvider.configure {
134
- dependsOn(login)
135
- finalizedBy(puppeteerInstall)
136
- }
137
-
138
- tasks.matching { task ->
139
- task.dependsOn.any { dependency ->
140
- when (dependency) {
141
- is Task -> dependency == npmInstallTaskProvider.get()
142
- is TaskProvider <* > -> dependency == npmInstallTaskProvider
143
- is String -> dependency == npmInstallTaskProvider.name
144
- else -> false
145
- }
146
- }
147
- }.configureEach {
148
- dependsOn(puppeteerInstall)
149
- }
150
- }
151
84
}
152
85
}
153
86
}
154
87
155
88
@Suppress(" UnusedReceiverParameter" )
156
- fun BaseNpmExtension.configureNpmExtension (useProxy : Boolean , kotlinMasterBuild : Boolean ) {
157
- // todo it still doesn't work for an unknown reason, see 'puppeteerInstall*' tasks above
89
+ fun BaseYarnRootEnvSpec.configureNpmExtension (useProxy : Boolean , kotlinMasterBuild : Boolean ) {
158
90
ignoreScripts = false // if true - puppeteer won't install browsers
159
91
160
- packageLockMismatchReport = if (useProxy && ! kotlinMasterBuild) {
161
- LockFileMismatchReport .FAIL
92
+ yarnLockMismatchReport = if (useProxy && ! kotlinMasterBuild) {
93
+ YarnLockMismatchReport .FAIL
162
94
} else {
163
- LockFileMismatchReport .WARNING
95
+ YarnLockMismatchReport .WARNING
164
96
}
165
97
}
166
98
167
99
fun Project.configureNpm () {
168
100
val kotlinMasterBuild by optionalProperty()
169
101
val useProxy = useProxyRepositories
170
102
171
- registerCustomNpmTasks<NodeJsRootPlugin , NodeJsEnvSpec , NodeJsRootExtension >(" js" , useProxy)
172
- registerCustomNpmTasks<WasmNodeJsRootPlugin , WasmNodeJsEnvSpec , WasmNodeJsRootExtension >(" wasm" , useProxy)
103
+ registerCustomNpmTasks<YarnPlugin , YarnRootEnvSpec >(" js" , useProxy)
104
+ registerCustomNpmTasks<WasmYarnPlugin , WasmYarnRootEnvSpec >(" wasm" , useProxy)
173
105
174
106
// necessary for CI js tests
175
- rootProject.plugins.withType<NodeJsRootPlugin > {
176
- rootProject.extensions.configure<NpmExtension > {
107
+ rootProject.plugins.withType<YarnPlugin > {
108
+ rootProject.extensions.configure<YarnRootEnvSpec > {
177
109
configureNpmExtension(useProxy, kotlinMasterBuild)
178
110
}
179
111
}
180
112
181
- rootProject.plugins.withType<WasmNodeJsRootPlugin > {
182
- rootProject.extensions.configure<WasmNpmExtension > {
113
+ rootProject.plugins.withType<WasmYarnPlugin > {
114
+ rootProject.extensions.configure<WasmYarnRootEnvSpec > {
183
115
configureNpmExtension(useProxy, kotlinMasterBuild)
184
116
}
185
117
}
186
-
187
- tasks.named<Delete >(" clean" ) {
188
- delete(project.layout.projectDirectory.dir(PUPPETEER_BROWSERS_DIR ))
189
- }
190
118
}
0 commit comments