@@ -6,41 +6,31 @@ package util.tasks
66
77import org.gradle.api.GradleException
88import 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
2720import util.other.optionalProperty
2821import util.other.spacePassword
2922import util.other.useProxyRepositories
3023import java.io.File
3124
32- const val PUPPETEER_BROWSERS_DIR = " .puppeteer"
33-
3425private inline fun <
35- reified Plugin : CommonNodeJsRootPlugin ,
36- reified Spec : BaseNodeJsEnvSpec ,
37- reified RootExtension : BaseNodeJsRootExtension ,
26+ reified Plugin : CommonYarnPlugin ,
27+ reified Spec : BaseYarnRootEnvSpec ,
3828> Project.registerCustomNpmTasks (
3929 target : String ,
4030 useProxy : Boolean ,
4131) {
4232 val capitalizedTarget = target.replaceFirstChar { it.titlecase() }
43- val login = tasks.register(" execute${capitalizedTarget} NpmLogin" ) {
33+ tasks.register(" execute${capitalizedTarget} NpmLogin" ) {
4434 if (! useProxyRepositories) {
4535 return @register
4636 }
@@ -91,100 +81,38 @@ private inline fun <
9181 if (useProxy) {
9282 downloadBaseUrl = " https://packages.jetbrains.team/files/p/krpc/build-deps/"
9383 }
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- }
15184 }
15285 }
15386}
15487
15588@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 ) {
15890 ignoreScripts = false // if true - puppeteer won't install browsers
15991
160- packageLockMismatchReport = if (useProxy && ! kotlinMasterBuild) {
161- LockFileMismatchReport .FAIL
92+ yarnLockMismatchReport = if (useProxy && ! kotlinMasterBuild) {
93+ YarnLockMismatchReport .FAIL
16294 } else {
163- LockFileMismatchReport .WARNING
95+ YarnLockMismatchReport .WARNING
16496 }
16597}
16698
16799fun Project.configureNpm () {
168100 val kotlinMasterBuild by optionalProperty()
169101 val useProxy = useProxyRepositories
170102
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)
173105
174106 // 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 > {
177109 configureNpmExtension(useProxy, kotlinMasterBuild)
178110 }
179111 }
180112
181- rootProject.plugins.withType<WasmNodeJsRootPlugin > {
182- rootProject.extensions.configure<WasmNpmExtension > {
113+ rootProject.plugins.withType<WasmYarnPlugin > {
114+ rootProject.extensions.configure<WasmYarnRootEnvSpec > {
183115 configureNpmExtension(useProxy, kotlinMasterBuild)
184116 }
185117 }
186-
187- tasks.named<Delete >(" clean" ) {
188- delete(project.layout.projectDirectory.dir(PUPPETEER_BROWSERS_DIR ))
189- }
190118}
0 commit comments