Update dependencies and compatibility

This commit is contained in:
Alexander Nozik 2023-01-17 18:50:19 +03:00
parent d28873e796
commit 2bdaea2e82
25 changed files with 130 additions and 42 deletions
demo
gdml
build.gradle.kts
src/jsMain/kotlin/space/kscience/visionforge/gdml/demo
js-playground
muon-monitor
build.gradle.kts
src/jsMain/kotlin/ru/mipt/npm/muon/monitor
playground
sat-demo
build.gradle.kts
src/main/kotlin/ru/mipt/npm/sat
gradle.properties
gradle/wrapper
jupyter/visionforge-jupyter-gdml
ui
bootstrap/src/main/kotlin/space/kscience/visionforge/bootstrap
react/src/main/kotlin/space/kscience/visionforge/react
ring
build.gradle.kts
src/main/kotlin/space.kscience.visionforge.ring
visionforge-core/src/jvmMain/kotlin/space/kscience/visionforge/html
visionforge-tables
build.gradle.kts
src/jsMain/kotlin/space/kscience/visionforge/tables
visionforge-threejs
src/main/kotlin/space/kscience/visionforge/solid/three
visionforge-threejs-server/src
jsMain/kotlin/space/kscience/visionforge/three
jvmMain/kotlin/space/kscience/visionforge/three
jvmTest/kotlin/space/kscience/visionforge/three

@ -21,7 +21,9 @@ kotlin {
useCommonJs() useCommonJs()
browser { browser {
commonWebpackConfig { commonWebpackConfig {
cssSupport.enabled = false cssSupport{
enabled.set(false)
}
} }
} }
} }

@ -2,13 +2,13 @@ package space.kscience.visionforge.gdml.demo
import kotlinx.css.* import kotlinx.css.*
import org.w3c.dom.Document import org.w3c.dom.Document
import react.dom.client.createRoot
import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.Context
import space.kscience.dataforge.context.fetch import space.kscience.dataforge.context.fetch
import space.kscience.gdml.GdmlShowCase import space.kscience.gdml.GdmlShowCase
import space.kscience.visionforge.Application import space.kscience.visionforge.Application
import space.kscience.visionforge.Colors import space.kscience.visionforge.Colors
import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.gdml.toVision
import space.kscience.visionforge.react.createRoot
import space.kscience.visionforge.react.render import space.kscience.visionforge.react.render
import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.Solids
import space.kscience.visionforge.solid.ambientLight import space.kscience.visionforge.solid.ambientLight

@ -12,7 +12,9 @@ kotlin{
useCommonJs() useCommonJs()
browser { browser {
commonWebpackConfig { commonWebpackConfig {
cssSupport.enabled = false cssSupport{
enabled.set(false)
}
} }
} }
} }

@ -1,6 +1,5 @@
import kotlinx.css.* import kotlinx.css.*
import org.w3c.dom.Document import org.w3c.dom.Document
import react.dom.client.createRoot
import ringui.SmartTabs import ringui.SmartTabs
import ringui.Tab import ringui.Tab
import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.Context
@ -11,6 +10,7 @@ import space.kscience.visionforge.Application
import space.kscience.visionforge.Colors import space.kscience.visionforge.Colors
import space.kscience.visionforge.VisionClient import space.kscience.visionforge.VisionClient
import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.plotly.PlotlyPlugin
import space.kscience.visionforge.react.createRoot
import space.kscience.visionforge.react.render import space.kscience.visionforge.react.render
import space.kscience.visionforge.ring.ThreeCanvasWithControls import space.kscience.visionforge.ring.ThreeCanvasWithControls
import space.kscience.visionforge.ring.ThreeWithControlsPlugin import space.kscience.visionforge.ring.ThreeWithControlsPlugin

@ -22,7 +22,7 @@ kotlin {
browser { browser {
commonWebpackConfig { commonWebpackConfig {
cssSupport { cssSupport {
enabled = false enabled.set(false)
} }
} }
} }

@ -1,11 +1,11 @@
package ru.mipt.npm.muon.monitor package ru.mipt.npm.muon.monitor
import org.w3c.dom.Document import org.w3c.dom.Document
import react.dom.client.createRoot
import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.Context
import space.kscience.dataforge.context.fetch import space.kscience.dataforge.context.fetch
import space.kscience.visionforge.Application import space.kscience.visionforge.Application
import space.kscience.visionforge.VisionManager import space.kscience.visionforge.VisionManager
import space.kscience.visionforge.react.createRoot
import space.kscience.visionforge.react.render import space.kscience.visionforge.react.render
import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.Solids
import space.kscience.visionforge.solid.three.ThreePlugin import space.kscience.visionforge.solid.three.ThreePlugin

@ -16,11 +16,13 @@ kotlin {
useCommonJs() useCommonJs()
browser { browser {
webpackTask { webpackTask {
this.outputFileName = "js/visionforge-playground.js" outputFileName = "js/visionforge-playground.js"
} }
commonWebpackConfig { commonWebpackConfig {
sourceMaps = true sourceMaps = true
cssSupport.enabled = false cssSupport{
enabled.set(false)
}
} }
} }
binaries.executable() binaries.executable()

@ -16,7 +16,11 @@ public fun makeVisionFile(
val actualPath = VisionPage(Global.visionManager, content = content).makeFile(path) { actualPath -> val actualPath = VisionPage(Global.visionManager, content = content).makeFile(path) { actualPath ->
mapOf( mapOf(
"title" to VisionPage.title(title), "title" to VisionPage.title(title),
"playground" to VisionPage.importScriptHeader("js/visionforge-playground.js", resourceLocation, actualPath), "playground" to VisionPage.importScriptHeader(
"js/visionforge-playground.js",
resourceLocation,
actualPath
),
) )
} }
if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI()) if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI())

@ -15,7 +15,7 @@ group = "ru.mipt.npm"
dependencies{ dependencies{
implementation(project(":visionforge-threejs:visionforge-threejs-server")) implementation(project(":visionforge-threejs:visionforge-threejs-server"))
implementation("ch.qos.logback:logback-classic:1.2.11") implementation("ch.qos.logback:logback-classic:1.4.5")
} }
application { application {

@ -0,0 +1,21 @@
package ru.mipt.npm.sat
import space.kscience.dataforge.misc.DFExperimental
import space.kscience.visionforge.html.ResourceLocation
import space.kscience.visionforge.solid.box
import space.kscience.visionforge.solid.material
import space.kscience.visionforge.solid.set
import space.kscience.visionforge.solid.solid
import space.kscience.visionforge.three.makeThreeJsFile
@OptIn(DFExperimental::class)
fun main() = makeThreeJsFile(resourceLocation = ResourceLocation.SYSTEM) {
vision ("canvas") {
solid {
box(100, 100, 100)
material {
emissiveColor.set("red")
}
}
}
}

@ -1,9 +1,8 @@
kotlin.code.style=official kotlin.code.style=official
kotlin.mpp.stability.nowarn=true kotlin.mpp.stability.nowarn=true
kotlin.jupyter.add.scanner=false
kotlin.incremental.js.ir=true kotlin.incremental.js.ir=true
org.gradle.parallel=true org.gradle.parallel=true
org.gradle.jvmargs=-Xmx4G org.gradle.jvmargs=-Xmx4G
toolsVersion=0.13.3-kotlin-1.7.20 toolsVersion=0.13.4-kotlin-1.8.0

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

@ -14,7 +14,9 @@ kotlin {
} }
commonWebpackConfig { commonWebpackConfig {
sourceMaps = false sourceMaps = false
cssSupport.enabled = false cssSupport{
enabled.set(false)
}
} }
} }
binaries.executable() binaries.executable()

@ -2,7 +2,6 @@ package space.kscience.visionforge.bootstrap
import org.w3c.dom.Element import org.w3c.dom.Element
import react.RBuilder import react.RBuilder
import react.dom.client.createRoot
import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.MetaDescriptor
import space.kscience.dataforge.meta.isEmpty import space.kscience.dataforge.meta.isEmpty
import space.kscience.visionforge.Vision import space.kscience.visionforge.Vision
@ -67,6 +66,6 @@ public fun RBuilder.visionPropertyEditor(
public fun Element.visionPropertyEditor( public fun Element.visionPropertyEditor(
item: Vision, item: Vision,
descriptor: MetaDescriptor? = item.descriptor, descriptor: MetaDescriptor? = item.descriptor,
): Unit = createRoot(this).render { ): Unit = space.kscience.visionforge.react.createRoot(this).render {
visionPropertyEditor(item, descriptor = descriptor) visionPropertyEditor(item, descriptor = descriptor)
} }

@ -0,0 +1,17 @@
@file:JsModule("react-dom/client")
@file:JsNonModule
package space.kscience.visionforge.react
import org.w3c.dom.Element
import react.dom.client.Root
import react.dom.client.RootOptions
/**
* Compatibility method to work with old browser API
*/
public external fun createRoot(
container: Element,
options: RootOptions = definedExternally,
): Root

@ -9,7 +9,9 @@ kotlin{
useCommonJs() useCommonJs()
browser { browser {
commonWebpackConfig { commonWebpackConfig {
cssSupport.enabled = false cssSupport{
enabled.set(false)
}
} }
} }
} }

@ -2,7 +2,6 @@ package space.kscience.visionforge.ring
import kotlinx.coroutines.async import kotlinx.coroutines.async
import org.w3c.dom.Element import org.w3c.dom.Element
import react.dom.client.createRoot
import space.kscience.dataforge.context.AbstractPlugin import space.kscience.dataforge.context.AbstractPlugin
import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.Context
import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.context.PluginFactory
@ -26,7 +25,7 @@ public class ThreeWithControlsPlugin : AbstractPlugin(), ElementVisionRenderer {
if (vision is Solid) ElementVisionRenderer.DEFAULT_RATING * 2 else ElementVisionRenderer.ZERO_RATING if (vision is Solid) ElementVisionRenderer.DEFAULT_RATING * 2 else ElementVisionRenderer.ZERO_RATING
override fun render(element: Element, name: Name, vision: Vision, meta: Meta) { override fun render(element: Element, name: Name, vision: Vision, meta: Meta) {
createRoot(element).render { space.kscience.visionforge.react.createRoot(element).render {
child(ThreeCanvasWithControls) { child(ThreeCanvasWithControls) {
attrs { attrs {
this.solids = three.solids this.solids = three.solids

@ -2,7 +2,6 @@ package space.kscience.visionforge.ring
import org.w3c.dom.Element import org.w3c.dom.Element
import react.RBuilder import react.RBuilder
import react.dom.client.createRoot
import react.dom.p import react.dom.p
import ringui.Island import ringui.Island
import ringui.SmartTabs import ringui.SmartTabs

@ -4,12 +4,10 @@ import kotlinx.html.link
import kotlinx.html.script import kotlinx.html.script
import kotlinx.html.unsafe import kotlinx.html.unsafe
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import space.kscience.visionforge.VisionManager
import java.nio.file.Files import java.nio.file.Files
import java.nio.file.Path import java.nio.file.Path
import java.nio.file.StandardOpenOption import java.nio.file.StandardOpenOption
import java.security.MessageDigest import java.security.MessageDigest
import kotlin.io.path.ExperimentalPathApi
import kotlin.io.path.readText import kotlin.io.path.readText
@ -47,15 +45,14 @@ private fun ByteArray.toHexString() = asUByteArray().joinToString("") { it.toStr
* Check if the asset exists in given local location and put it there if it does not * Check if the asset exists in given local location and put it there if it does not
* @param * @param
*/ */
@OptIn(ExperimentalPathApi::class) internal fun checkOrStoreFile(htmlPath: Path, filePath: Path, resource: String, classLoader: ClassLoader): Path {
internal fun checkOrStoreFile(htmlPath: Path, filePath: Path, resource: String): Path {
val logger = LoggerFactory.getLogger("") val logger = LoggerFactory.getLogger("")
logger.info("Resolving or storing resource file $resource") logger.info("Resolving or storing resource file $resource")
val fullPath = htmlPath.resolveSibling(filePath).toAbsolutePath().resolve(resource) val fullPath = htmlPath.resolveSibling(filePath).toAbsolutePath().resolve(resource)
logger.debug("Full path to resource file $resource: $fullPath") logger.debug("Full path to resource file $resource: $fullPath")
val bytes = VisionManager.Companion::class.java.getResourceAsStream("/$resource")?.readAllBytes() val bytes = classLoader.getResourceAsStream(resource)?.readAllBytes()
?: error("Resource $resource not found on classpath") ?: error("Resource $resource not found on classpath")
val md = MessageDigest.getInstance("MD5") val md = MessageDigest.getInstance("MD5")
@ -66,8 +63,20 @@ internal fun checkOrStoreFile(htmlPath: Path, filePath: Path, resource: String):
if (!skip) { if (!skip) {
logger.debug("File $fullPath does not exist or wrong checksum. Writing file") logger.debug("File $fullPath does not exist or wrong checksum. Writing file")
Files.createDirectories(fullPath.parent) Files.createDirectories(fullPath.parent)
Files.write(fullPath, bytes, StandardOpenOption.CREATE,StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE) Files.write(
Files.write(md5File, checksum.encodeToByteArray(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE) fullPath,
bytes,
StandardOpenOption.CREATE,
StandardOpenOption.TRUNCATE_EXISTING,
StandardOpenOption.WRITE
)
Files.write(
md5File,
checksum.encodeToByteArray(),
StandardOpenOption.CREATE,
StandardOpenOption.TRUNCATE_EXISTING,
StandardOpenOption.WRITE
)
} }
return if (htmlPath.isAbsolute && fullPath.startsWith(htmlPath.parent)) { return if (htmlPath.isAbsolute && fullPath.startsWith(htmlPath.parent)) {
@ -89,11 +98,11 @@ internal fun fileScriptHeader(
} }
} }
internal fun embedScriptHeader(resource: String): HtmlFragment = { internal fun embedScriptHeader(resource: String, classLoader: ClassLoader): HtmlFragment = {
script { script {
type = "text/javascript" type = "text/javascript"
unsafe { unsafe {
val bytes = VisionManager::class.java.getResourceAsStream("/$resource")!!.readAllBytes() val bytes = classLoader.getResourceAsStream(resource)!!.readAllBytes()
+bytes.toString(Charsets.UTF_8) +bytes.toString(Charsets.UTF_8)
} }
} }
@ -103,8 +112,9 @@ internal fun fileCssHeader(
basePath: Path, basePath: Path,
cssPath: Path, cssPath: Path,
resource: String, resource: String,
classLoader: ClassLoader,
): HtmlFragment = { ): HtmlFragment = {
val relativePath = checkOrStoreFile(basePath, cssPath, resource) val relativePath = checkOrStoreFile(basePath, cssPath, resource, classLoader)
link { link {
rel = "stylesheet" rel = "stylesheet"
href = relativePath.toString() href = relativePath.toString()
@ -118,22 +128,26 @@ public fun VisionPage.Companion.importScriptHeader(
scriptResource: String, scriptResource: String,
resourceLocation: ResourceLocation, resourceLocation: ResourceLocation,
htmlPath: Path? = null, htmlPath: Path? = null,
classLoader: ClassLoader = Thread.currentThread().contextClassLoader,
): HtmlFragment { ): HtmlFragment {
val targetPath = when (resourceLocation) { val targetPath = when (resourceLocation) {
ResourceLocation.LOCAL -> checkOrStoreFile( ResourceLocation.LOCAL -> checkOrStoreFile(
htmlPath ?: Path.of("."), htmlPath ?: Path.of("."),
Path.of(VISIONFORGE_ASSETS_PATH), Path.of(VISIONFORGE_ASSETS_PATH),
scriptResource scriptResource,
classLoader
) )
ResourceLocation.SYSTEM -> checkOrStoreFile( ResourceLocation.SYSTEM -> checkOrStoreFile(
Path.of("."), Path.of("."),
Path.of(System.getProperty("user.home")).resolve(VISIONFORGE_ASSETS_PATH), Path.of(System.getProperty("user.home")).resolve(VISIONFORGE_ASSETS_PATH),
scriptResource scriptResource, classLoader
) )
ResourceLocation.EMBED -> null ResourceLocation.EMBED -> null
} }
return if (targetPath == null) { return if (targetPath == null) {
embedScriptHeader(scriptResource) embedScriptHeader(scriptResource, classLoader)
} else { } else {
fileScriptHeader(targetPath) fileScriptHeader(targetPath)
} }

@ -14,7 +14,9 @@ kotlin {
binaries.library() binaries.library()
browser{ browser{
commonWebpackConfig{ commonWebpackConfig{
cssSupport.enabled = true cssSupport{
enabled.set(true)
}
} }
} }
} }

@ -1,6 +1,6 @@
package space.kscience.visionforge.tables package space.kscience.visionforge.tables
import kotlinx.js.jso import js.core.jso
import org.w3c.dom.Element import org.w3c.dom.Element
import org.w3c.dom.HTMLElement import org.w3c.dom.HTMLElement
import space.kscience.dataforge.context.AbstractPlugin import space.kscience.dataforge.context.AbstractPlugin

@ -1,7 +1,7 @@
package space.kscience.visionforge.solid.three package space.kscience.visionforge.solid.three
import kotlinx.js.jso import js.core.jso
import space.kscience.dataforge.context.logger import space.kscience.dataforge.context.logger
import space.kscience.dataforge.context.warn import space.kscience.dataforge.context.warn
import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.onPropertyChange

@ -6,8 +6,6 @@ import space.kscience.visionforge.solid.three.ThreePlugin
@DFExperimental @DFExperimental
public fun main(): Unit { public fun main(): Unit = runVisionClient {
runVisionClient { plugin(ThreePlugin)
plugin(ThreePlugin)
}
} }

@ -10,7 +10,6 @@ import java.nio.file.Path
public val VisionPage.Companion.threeJsHeader: HtmlFragment get() = scriptHeader("js/visionforge-three.js") public val VisionPage.Companion.threeJsHeader: HtmlFragment get() = scriptHeader("js/visionforge-three.js")
@DFExperimental @DFExperimental
public fun makeThreeJsFile( public fun makeThreeJsFile(
path: Path? = null, path: Path? = null,
@ -22,7 +21,11 @@ public fun makeThreeJsFile(
val actualPath = VisionPage(Global.visionManager, content = content).makeFile(path) { actualPath -> val actualPath = VisionPage(Global.visionManager, content = content).makeFile(path) { actualPath ->
mapOf( mapOf(
"title" to VisionPage.title(title), "title" to VisionPage.title(title),
"threeJs" to VisionPage.importScriptHeader("js/visionforge-three.js", resourceLocation, actualPath) "threeJs" to VisionPage.importScriptHeader(
"js/visionforge-three.js",
resourceLocation,
actualPath,
)
) )
} }
if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI()) if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI())

@ -0,0 +1,23 @@
package space.kscience.visionforge.three
import kotlinx.html.stream.createHTML
import space.kscience.visionforge.html.ResourceLocation
import space.kscience.visionforge.html.VisionPage
import space.kscience.visionforge.html.importScriptHeader
import kotlin.test.Test
class TestServerExtensions {
@Test
fun testServerHeader(){
val string = createHTML().apply {
VisionPage.importScriptHeader(
"js/visionforge-three.js",
ResourceLocation.SYSTEM
).invoke(this)
}.finalize()
//println(string)
}
}