Настройка проекта Kotlin/JS
Проекты Kotlin/JS используют Gradle в качестве системы сборки. Чтобы разработчики могли легко управлять своими проектами Kotlin/JS, мы предлагаем плагин Gradle, который предоставляет инструменты конфигурации проекта вместе с вспомогательными задачами для автоматизации задач, типичных для разработки на JavaScript. Например, плагин загружает менеджер пакетов Yarn для управления зависимостями npm и может сгенерировать JavaScript-сборку из проекта Kotlin, используя webpack. Управление зависимостями и настройку можно в значительной степени выполнять непосредственно из файла Gradle, с возможностью переопределения автоматически сгенерированных конфигураций для полного контроля.
Чтобы создать проект Kotlin/JS в IntelliJ IDEA, перейдите в Файл | Новый | Проект. Затем выберите Kotlin Multiplatform и выберите целевой Kotlin/JS, который вам подходит. Не забудьте выбрать язык для скрипта сборки: Groovy или Kotlin.

В качестве альтернативы, вы можете вручную добавить плагин к проекту Gradle в файле сборки Gradle (build.gradle или build.gradle.kts).
plugins {
kotlin("js") version "1.8.0"
}
plugins {
id 'org.jetbrains.kotlin.js' version '1.8.0'
}
Плагин Kotlin/JS Gradle позволяет управлять аспектами вашего проекта в разделе kotlin скрипта сборки.
kotlin {
//...
}
Внутри раздела kotlin вы можете управлять следующими аспектами:
Целевая среда выполнения: браузер или Node.js
Зависимости проекта: Maven и npm
Сборка и поддержка CSS для браузерных проектов
Целевые среды выполнения
Проекты Kotlin/JS могут быть нацелены на две различные среды выполнения:
Браузер для клиентской работы в браузере
Node.js для выполнения JavaScript-кода вне браузера, например, для серверной разработки.
Для определения целевой среды выполнения для проекта Kotlin/JS добавьте раздел js с browser {} или nodejs {} внутри.
kotlin {
js {
browser {
}
binaries.executable()
}
}
Инструкция binaries.executable() явно указывает компилятору Kotlin на создание исполняемых .js файлов. Это поведение по умолчанию при использовании текущего компилятора Kotlin/JS, но инструкция явно необходима, если вы работаете с компилятором Kotlin/JS IR, или установили kotlin.js.generate.executable.default=false в вашем gradle.properties. В этих случаях пропуск binaries.executable() приведет к тому, что компилятор сгенерирует только внутренние библиотечные файлы Kotlin, которые могут использоваться из других проектов, но не могут быть запущены сами по себе. (Это обычно быстрее, чем создание исполняемых файлов, и может быть оптимизацией при работе с нелистовыми модулями вашего проекта.)
Плагин Kotlin/JS автоматически настраивает свои задачи для работы с выбранной средой. Это включает загрузку и установку необходимой среды и зависимостей для запуска и тестирования приложения. Это позволяет разработчикам создавать, запускать и тестировать простые проекты без дополнительной настройки. Для проектов, нацеленных на Node.js, также есть возможность использовать существующую установку Node.js. Узнайте, как использовать установленный Node.js.
Зависимости
Как и любые другие проекты Gradle, проекты Kotlin/JS поддерживают традиционные объявления зависимостей Gradle в разделе dependencies скрипта сборки.
dependencies {
implementation("org.example.myproject", "1.1.0")
}
dependencies {
implementation 'org.example.myproject:1.1.0'
}
Плагин Kotlin/JS Gradle также поддерживает объявления зависимостей для определенных наборов исходных файлов в разделе kotlin скрипта сборки.
kotlin {
sourceSets["main"].dependencies {
implementation("org.example.myproject", "1.1.0")
}
}
kotlin {
sourceSets {
main {
dependencies {
implementation 'org.example.myproject:1.1.0'
}
}
}
}
Обратите внимание, что не все библиотеки, доступные для языка программирования Kotlin, доступны при использовании Kotlin/JS: могут использоваться только библиотеки, содержащие артефакты для Kotlin/JS.
Если используемая вами библиотека имеет зависимости от пакетов npm, Gradle автоматически разрешит эти транзитивные зависимости.
Стандартные библиотеки Kotlin
Зависимость от стандартной библиотеки Kotlin/JS обязательна для всех проектов Kotlin/JS и как таковая является неявной – не нужно добавлять артефакты.
Если ваш проект содержит тесты на Kotlin, вы должны добавить зависимость от библиотеки kotlin.test:
dependencies {
testImplementation(kotlin("test-js"))
}
dependencies {
testImplementation 'org.jetbrains.kotlin:kotlin-test-js'
}
Зависимости npm
В мире JavaScript наиболее распространённым способом управления зависимостями является npm. Он предлагает самую большую публичную репозиторий JavaScript-модулей.
Плагин Kotlin/JS Gradle позволяет объявлять зависимости npm в скрипте Gradle, аналогично тому, как вы объявляете любые другие зависимости.
Для объявления зависимости npm передайте её имя и версию функции npm() внутри объявления зависимости. Вы также можете указать один или несколько диапазонов версий, используя синтаксис npm semver.
dependencies {
implementation(npm("react", "> 14.0.0 <=16.9.0"))
}
dependencies {
implementation npm('react', '> 14.0.0 <=16.9.0')
}
Плагин использует менеджер пакетов Yarn для загрузки и установки зависимостей NPM. Он работает без дополнительной настройки, но вы можете настроить его под свои нужды. Узнайте, как настроить Yarn в плагине Kotlin/JS Gradle.
Помимо обычных зависимостей, есть ещё три типа зависимостей, которые можно использовать из Gradle DSL. Чтобы узнать больше о том, когда лучше использовать каждый тип зависимости, ознакомьтесь с официальной документацией, ссылка на которую приведена из npm:
devDependencies, через
devNpm(...),optionalDependencies через
optionalNpm(...), иpeerDependencies через
peerNpm(...).
После установки зависимости npm вы можете использовать её API в своём коде, как описано в Вызове JS из Kotlin.
запуск задачи
Плагин Kotlin/JS предоставляет задачу run, которая позволяет запускать чистые проекты Kotlin/JS без дополнительной конфигурации.
Для запуска проектов Kotlin/JS в браузере эта задача является псевдонимом для задачи browserDevelopmentRun (которая также доступна в проектах Kotlin multiplatform). Она использует webpack-dev-server для предоставления ваших JavaScript-артефактов. Если вы хотите настроить конфигурацию, используемую задачей webpack-dev-server, например, изменить порт, на котором работает сервер, используйте файл конфигурации webpack.
Для запуска проектов Kotlin/JS, нацеленных на Node.js, задача run является псевдонимом для задачи nodeRun (которая также доступна в проектах Kotlin multiplatform).
Для запуска проекта выполните стандартную задачу жизненного цикла run или её псевдоним:
./gradlew run
Для автоматического повторного построения вашего приложения после внесения изменений в исходные файлы используйте функцию Gradle непрерывного построения:
./gradlew run --continuous
или
./gradlew run -t
После успешного построения вашего проекта webpack-dev-server автоматически обновит страницу браузера.
задача тестирования
Плагин Kotlin/JS Gradle автоматически настраивает инфраструктуру тестирования для проектов. Для проектов браузера он загружает и устанавливает исполняемый инструмент тестирования Karma с другими необходимыми зависимостями; для проектов Node.js используется фреймворк тестирования Mocha.
Плагин также предоставляет полезные функции тестирования, например:
Генерация карт исходного кода
Генерация отчётов о тестах
Результаты выполнения тестов в консоли
Для запуска тестов браузера плагин по умолчанию использует Headless Chrome. Вы также можете выбрать другой браузер для выполнения тестов, добавив соответствующие записи в раздел useKarma скрипта сборки:
kotlin {
js {
browser {
testTask {
useKarma {
useIe()
useSafari()
useFirefox()
useChrome()
useChromeCanary()
useChromeHeadless()
usePhantomJS()
useOpera()
}
}
}
binaries.executable()
// . . .
}
}
В качестве альтернативы вы можете добавить цели тестов для браузеров в файл gradle.properties:
kotlin.js.browser.karma.browsers=firefox,safari
Этот подход позволяет определить список браузеров для всех модулей, а затем добавить конкретные браузеры в скрипты сборки отдельных модулей.
Обратите внимание, что плагин Kotlin/JS Gradle не автоматически устанавливает эти браузеры, а только использует те, которые доступны в среде его выполнения. Если вы выполняете тесты Kotlin/JS на сервере непрерывной интеграции, например, убедитесь, что браузеры, с которыми вы хотите протестировать, установлены.
Если вы хотите пропустить тесты, добавьте строку enabled = false в testTask.
kotlin {
js {
browser {
testTask {
enabled = false
}
}
binaries.executable()
// . . .
}
}
Для запуска тестов выполните стандартную задачу жизненного цикла check:
./gradlew check
Чтобы указать переменные окружения, используемые вашими исполняемыми файлами тестов Node.js (например, чтобы передать внешнюю информацию вашим тестам или для точной настройки разрешения пакетов), используйте функцию environment с парой «ключ-значение» внутри блока testTask в вашем скрипте сборки:
kotlin {
js {
nodejs {
testTask {
environment("key", "value")
}
}
}
}
Конфигурация Karma
Плагин Kotlin/JS Gradle автоматически генерирует файл конфигурации Karma во время сборки, который включает ваши настройки из блока kotlin.js.browser.testTask.useKarma в вашем build.gradle(.kts). Вы можете найти файл по адресу build/js/packages/projectName-test/karma.conf.js. Чтобы внести изменения в конфигурацию, используемую Karma, поместите ваши дополнительные файлы конфигурации в папку с именем karma.config.d в корне вашего проекта. Все файлы конфигурации .js в этой папке будут взяты и автоматически объединены в сгенерированный файл karma.conf.js во время сборки.
Все возможности конфигурации Karma подробно описаны в документации Karma.
Сборка webpack
Для целей браузера плагин Kotlin/JS использует широко известный инструмент сборки модулей webpack.
Версия webpack
Плагин Kotlin/JS использует webpack 5.
Если у вас есть проекты, созданные с версиями плагина ранее 1.5.0, вы можете временно вернуться к webpack 4, используемому в этих версиях, добавив следующую строку в gradle.properties проекта:
kotlin.js.webpack.major.version=4
Задача webpack
Наиболее распространённые настройки webpack можно выполнить непосредственно в блоке конфигурации kotlin.js.browser.webpackTask файла Gradle:
outputFileName- имя выходного файла webpack. Он будет сгенерирован в<projectDir>/build/distributions/после выполнения задачи webpack. Значение по умолчанию — имя проекта.output.libraryTarget— система модулей для выходного файла webpack. Узнайте больше о доступных системах модулей для проектов Kotlin/JS. Значение по умолчанию —umd.
webpackTask {
outputFileName = "mycustomfilename.js"
output.libraryTarget = "commonjs2"
}
Вы также можете настроить общие параметры webpack, которые будут использоваться в задачах сборки, запуска и тестирования, в блоке commonWebpackConfig.
Файл конфигурации webpack
Плагин Kotlin/JS Gradle автоматически генерирует стандартный файл конфигурации webpack во время сборки. Он расположен в build/js/packages/projectName/webpack.config.js.
Если вы хотите внести дальнейшие коррективы в конфигурацию webpack, поместите ваши дополнительные файлы конфигурации в папку с именем webpack.config.d в корне вашего проекта. При сборке вашего проекта все файлы конфигурации .js будут автоматически объединены в файл build/js/packages/projectName/webpack.config.js. Чтобы добавить новый загрузчик webpack, например, добавьте следующее в файл .js внутри webpack.config.d.
config.module.rules.push({
test: /\.extension$/,
loader: 'loader-name'
});
Все возможности конфигурации webpack подробно описаны в его документации.
Создание исполняемых файлов
Для создания исполняемых JavaScript-артефактов через webpack плагин Kotlin/JS содержит задачи Gradle browserDevelopmentWebpack и browserProductionWebpack.
browserDevelopmentWebpackсоздаёт артефакты разработки, которые больше по размеру, но создаются быстрее. Поэтому используйте задачиbrowserDevelopmentWebpackво время активной разработки.browserProductionWebpackприменяет устранение неиспользуемого кода к сгенерированным артефактам и минифицирует результирующий JavaScript-файл, что занимает больше времени, но создаёт исполняемые файлы меньшего размера. Поэтому используйте задачуbrowserProductionWebpackпри подготовке проекта к использованию в продакшене.
Выполните любую из этих задач, чтобы получить соответствующие артефакты для разработки или продакшена. Сгенерированные файлы будут доступны в build/distributions, если не указано иное.
./gradlew browserProductionWebpack
Обратите внимание, что эти задачи будут доступны только в том случае, если ваша цель настроена на создание исполняемых файлов (через binaries.executable()).
CSS
Плагин Kotlin/JS Gradle также поддерживает загрузчики CSS и стилей webpack'a CSS и стилей. Хотя все параметры можно изменить, напрямую модифицировав файлы конфигурации webpack, используемые для сборки проекта, наиболее часто используемые настройки доступны непосредственно из файла build.gradle(.kts).
Чтобы включить поддержку CSS в вашем проекте, установите параметр cssSupport.enabled в файле сборки Gradle в блоке commonWebpackConfig. Эта настройка также включена по умолчанию при создании нового проекта с помощью мастера.
browser {
commonWebpackConfig {
cssSupport {
enabled.set(true)
}
}
binaries.executable()
}
browser {
commonWebpackConfig {
cssSupport {
it.enabled.set(true)
}
}
binaries.executable()
}
В качестве альтернативы, вы можете добавить поддержку CSS независимо для webpackTask, runTask, и testTask.
browser {
webpackTask {
cssSupport {
enabled.set(true)
}
}
runTask {
cssSupport {
enabled.set(true)
}
}
testTask {
useKarma {
// . . .
webpackConfig.cssSupport {
enabled.set(true)
}
}
}
}
browser {
webpackTask {
cssSupport {
it.enabled.set(true)
}
}
runTask {
cssSupport {
it.enabled.set(true)
}
}
testTask {
useKarma {
// . . .
webpackConfig.cssSupport {
it.enabled.set(true)
}
}
}
}
Включение поддержки CSS в вашем проекте помогает предотвратить распространённые ошибки, возникающие при попытке использовать таблицы стилей из неконфигурированного проекта, такие как Module parse failed: Unexpected character '@' (14:0).
Вы можете использовать cssSupport.mode для указания, как следует обрабатывать встреченные CSS-стили. Доступны следующие значения:
"inline"(по умолчанию): стили добавляются к глобальному тегу<style>."extract": стили извлекаются в отдельный файл. Затем их можно включить с помощью HTML-страницы."import": стили обрабатываются как строки. Это может быть полезно, если вам нужен доступ к CSS из вашего кода (например,val styles = require("main.css")).
Для использования разных режимов в одном проекте используйте cssSupport.rules. Здесь вы можете указать список KotlinWebpackCssRules, каждый из которых определяет режим, а также include и exclude шаблоны.
Node.js
Для проектов Kotlin/JS, нацеленных на Node.js, плагин автоматически загружает и устанавливает среду Node.js на хосте. Также можно использовать существующий экземпляр Node.js, если он у вас есть.
Использование предварительно установленного Node.js
Если Node.js уже установлен на хосте, где вы собираете проекты Kotlin/JS, можно настроить плагин Kotlin/JS Gradle для его использования вместо установки собственного экземпляра Node.js.
Чтобы использовать предварительно установленный экземпляр Node.js, добавьте следующие строки в ваш build.gradle(.kts):
rootProject.plugins.withType<org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin> {
rootProject.the<org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension>().download = false
// or true for default behavior
}
rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin) {
rootProject.extensions.getByType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension).download = false
}
Yarn
Для загрузки и установки объявленных зависимостей во время сборки, плагин управляет собственным экземпляром менеджера пакетов Yarn. Он работает "из коробки" без дополнительной конфигурации, но вы можете настроить его или использовать уже установленный Yarn на вашем хосте.
Дополнительные возможности Yarn: .yarnrc
Для настройки дополнительных возможностей Yarn, поместите файл .yarnrc в корень вашего проекта. Он автоматически подхватывается во время сборки.
Например, чтобы использовать пользовательский реестр для пакетов npm, добавьте следующую строку в файл .yarnrc в корне проекта:
registry "http://my.registry/api/npm/"
Чтобы узнать больше о .yarnrc, посетите официальную документацию Yarn.
Использование предварительно установленного Yarn
Если Yarn уже установлен на хосте, где вы собираете проекты Kotlin/JS, вы можете настроить плагин Kotlin/JS Gradle для использования его вместо установки собственного экземпляра Yarn.
Чтобы использовать предварительно установленный экземпляр Yarn, добавьте следующие строки в ваш build.gradle(.kts):
rootProject.plugins.withType<org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin> {
rootProject.the<org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension>().download = false
// or true for default behavior
}
rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin) {
rootProject.extensions.getByType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension).download = false
}
Фиксация версий через kotlin-js-store
Директория kotlin-js-store в корне проекта автоматически генерируется плагином Kotlin/JS Gradle для хранения файла yarn.lock, необходимого для фиксации версий. Файл блокировки полностью управляется плагином Yarn и обновляется во время выполнения задачи Gradle kotlinNpmInstall.
Чтобы следовать рекомендуемой практике, зафиксируйте kotlin-js-store и его содержимое в вашей системе контроля версий. Это гарантирует, что ваше приложение собирается с точно таким же деревом зависимостей на всех машинах.
Если необходимо, вы можете изменить имя директории и файла блокировки в скрипте сборки:
rootProject.plugins.withType<org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin> {
rootProject.the<org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension>().lockFileDirectory =
project.rootDir.resolve("my-kotlin-js-store")
rootProject.the<org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension>().lockFileName = "my-yarn.lock"
}
rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin) {
rootProject.extensions.getByType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension).lockFileDirectory =
file("my-kotlin-js-store")
rootProject.extensions.getByType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension).lockFileName = 'my-yarn.lock'
}
Чтобы узнать больше о yarn.lock, посетите официальную документацию Yarn.
Сообщения об обновлении файла yarn.lock
Kotlin/JS предоставляет настройки Gradle, которые могут уведомлять вас, если файл yarn.lock был обновлен. Вы можете использовать эти настройки, когда хотите получать уведомления, если yarn.lock был изменён без вашего ведома во время сборки CI:
-
YarnLockMismatchReport, которое определяет, как сообщать об изменениях в файлеyarn.lock. Вы можете использовать следующие значения:FAIL— приведет к ошибке соответствующей задачи Gradle. Это значение по умолчанию.WARNING— запишет информацию об изменениях в журнал предупреждений.NONE— отключает сообщения.
reportNewYarnLock, которое явно сообщает об обновленном файлеyarn.lock. По умолчанию этот параметр отключен: обычно новый файлyarn.lockгенерируется при первом запуске. Вы можете использовать этот параметр для проверки, что файл добавлен в вашу систему управления версиями.yarnLockAutoReplace, который автоматически заменяетyarn.lockкаждый раз, когда запускается задача Gradle.
Чтобы использовать эти параметры, обновите свой файл скрипта сборки build.gradle(.kts) следующим образом:
import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnLockMismatchReport
import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension
rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin::class.java) {
rootProject.the<YarnRootExtension>().yarnLockMismatchReport =
YarnLockMismatchReport.WARNING // NONE | FAIL
rootProject.the<YarnRootExtension>().reportNewYarnLock = false // true
rootProject.the<YarnRootExtension>().yarnLockAutoReplace = false // true
}
import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnLockMismatchReport
import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension
rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin) {
rootProject.extensions.getByType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension).yarnLockMismatchReport =
YarnLockMismatchReport.WARNING // NONE | FAIL
rootProject.extensions.getByType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension).reportNewYarnLock = false // true
rootProject.extensions.getByType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension).yarnLockAutoReplace = false // true
}
Установка зависимостей npm по умолчанию с --ignore-scripts
Для снижения вероятности выполнения вредоносного кода из скомпрометированных пакетов npm, плагин Kotlin/JS Gradle по умолчанию предотвращает выполнение скриптов жизненного цикла во время установки зависимостей npm.
Вы можете явно разрешить выполнение скриптов жизненного цикла, добавив следующие строки в build.gradle(.kts):
rootProject.plugins.withType<org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin> {
rootProject.the<org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension>().ignoreScripts = false
}
rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin) {
rootProject.extensions.getByType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension).ignoreScripts = false
}
Директория назначения дистрибутива
По умолчанию результаты сборки проекта Kotlin/JS находятся в директории /build/distribution в корне проекта.
Чтобы установить другое местоположение для файлов дистрибутива проекта, добавьте блок distribution внутри browser в скрипте сборки и присвойте значение свойству directory. После выполнения задачи сборки проекта Gradle сохранит выходной пакет в этом месте вместе с ресурсами проекта.
kotlin {
js {
browser {
distribution {
directory = File("$projectDir/output/")
}
}
binaries.executable()
// . . .
}
}
kotlin {
js {
browser {
distribution {
directory = file("$projectDir/output/")
}
}
binaries.executable()
// . . .
}
}
Имя модуля
Чтобы изменить имя JavaScript модуля (который генерируется в build/js/packages/myModuleName), включая соответствующие файлы .js и .d.ts, используйте параметр moduleName:
js {
moduleName = "myModuleName"
}
Обратите внимание, что это не повлияет на выходные данные webpacked в build/distributions.
Настройка package.json
Файл package.json содержит метаданные пакета JavaScript. Такие популярные реестры пакетов, как npm, требуют, чтобы все опубликованные пакеты содержали такой файл. Он используется для отслеживания и управления публикациями пакетов.
Плагин Kotlin/JS Gradle автоматически генерирует package.json для проектов Kotlin/JS во время сборки. По умолчанию файл содержит существенные данные: имя, версия, лицензия и зависимости, а также некоторые другие атрибуты пакета.
Помимо базовых атрибутов пакета, package.json может определять, как должен вести себя проект JavaScript, например, идентифицируя доступные для запуска скрипты.
Вы можете добавить пользовательские записи в package.json проекта через Gradle DSL. Для добавления пользовательских полей в ваш package.json, используйте функцию customField в блоке компиляции packageJson:
kotlin {
js {
compilations["main"].packageJson {
customField("hello", mapOf("one" to 1, "two" to 2))
}
}
}
При сборке проекта этот код добавит следующий блок в файл package.json:
"hello": {
"one": 1,
"two": 2
}
Узнайте больше о создании файлов package.json для реестра npm в документации npm.
Устранение неполадок
При сборке проекта Kotlin/JS с помощью Kotlin 1.3.xx вы можете столкнуться с ошибкой Gradle, если одна из ваших зависимостей (или любая транзитивная зависимость) была собрана с помощью Kotlin 1.4 или более поздней версии: Could not determine the dependencies of task ':client:jsTestPackageJson'./Cannot choose between the following variants. Это известная проблема, обходной путь представлен здесь.
© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/js-project-setup.html