Erik van Velzen
04/25/2025, 3:42 PMimport js.import.import
suspend fun MyFun(cloudUrl: String) {
import<Unit>(
/* webpackIgnore: true */
"$cloudUrl/assets/js-client-8.5.0/cloud-client.js"
)
}
Unfortunately the magic comment is removed when compiling Kotlin to JS.
In the browser i get the error "Cannot find module 'https://anylogic.zenmo.com/assets/js-client-8.5.0/cloud-client.js'".
import("<https://anylogic.zenmo.com/assets/js-client-8.5.0/cloud-client.js>")
works in plain javascript. How do I get the compiler/webpack to leave this import untouched?turansky
04/25/2025, 4:28 PMErik van Velzen
04/25/2025, 5:11 PMturansky
04/25/2025, 5:13 PMErik van Velzen
04/25/2025, 5:24 PMturansky
04/25/2025, 5:25 PMturansky
04/25/2025, 5:25 PMturansky
04/25/2025, 5:26 PMErik van Velzen
04/25/2025, 5:52 PMval promise: Promise<Unit> = eval("import('<https://anylogic.zenmo.com/assets/js-client-8.5.0/cloud-client.js>')")
promise.then {
console.log(CloudClient)
}
But it's a pretty stupid workaround.turansky
04/25/2025, 6:02 PMErik van Velzen
04/25/2025, 6:02 PMErik van Velzen
04/25/2025, 6:03 PMErik van Velzen
04/25/2025, 6:03 PMturansky
04/25/2025, 6:17 PMimport js.function.JsFunction
import js.function.invoke
import js.promise.Promise
private val loadLibrary = JsFunction<String, Promise<Unit>>(
"cloudUrl",
"return import(cloudUrl + '/assets/js-client-8.5.0/cloud-client.js')",
)
suspend fun MyFun(cloudUrl: String) {
loadLibrary(cloudUrl).await()
}
turansky
04/25/2025, 6:19 PMimport js.function.AsyncFunction
import js.function.invoke
private val loadLibrary = AsyncFunction<String, Unit>(
"cloudUrl",
"return import(cloudUrl + '/assets/js-client-8.5.0/cloud-client.js')",
)
suspend fun MyFun(cloudUrl: String) {
loadLibrary(cloudUrl)
}
Erik van Velzen
04/25/2025, 6:22 PMsuspend fun <T> importLibrary(library: String): T {
return eval("import('$library')")
}
Erik van Velzen
04/25/2025, 6:28 PMErik van Velzen
04/25/2025, 6:29 PMsuspend fun <T> dynamicImport(library: String): T {
val promise: Promise<T> = eval("import('$library')")
return promise.await()
}
turansky
04/25/2025, 6:30 PMinline fun <T> importAsync(
url: String,
comment: String,
): Promise<T> {
return js("/* $comment */ import('$url')")
}
turansky
04/25/2025, 6:30 PMturansky
04/25/2025, 6:32 PMjs
call is better then eval
- eval
is unsafeturansky
04/25/2025, 6:35 PMimport js.import.import
suspend fun MyFun(cloudUrl: String) {
js("/* webpackIgnore: true */)
import<Unit>("$cloudUrl/assets/js-client-8.5.0/cloud-client.js")
}
turansky
04/25/2025, 6:36 PMErik van Velzen
04/25/2025, 6:38 PMimport(/* webpackIgnore: true */
Erik van Velzen
04/25/2025, 6:39 PMturansky
04/25/2025, 6:42 PMimport js.import.import
suspend fun MyFun(cloudUrl: String) {
import<Unit>(js("/* webpackIgnore: true */ cloudUrl + '/assets/js-client-8.5.0/cloud-client.js'"))
}
😉Erik van Velzen
04/25/2025, 6:47 PMErik van Velzen
04/25/2025, 6:51 PMjs("/* testcomment */")
The compiler says "An argument for the js() function must be non-empty JavaScript code"