Skip to content

Commit 5139d27

Browse files
committed
feat(ts-model-api): more node conversion functions
1 parent 8dac554 commit 5139d27

File tree

2 files changed

+21
-18
lines changed

2 files changed

+21
-18
lines changed

model-api/src/jsMain/kotlin/org/modelix/model/api/NodeAdapterCache.kt

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.modelix.model.api
22

3-
import TypedNode
43
import kotlinx.browser.window
54

65
@JsExport
@@ -29,7 +28,7 @@ object NodeAdapterCache {
2928
}, 0)
3029
}
3130

32-
val key = toINode(node)
31+
val key = JSNodeConverter.toINode(node)
3332
var wrapper = caches[0][key]
3433
if (wrapper == null) {
3534
wrapper = caches.asSequence().drop(1).mapNotNull { it.remove(key) }.firstOrNull()
@@ -40,16 +39,4 @@ object NodeAdapterCache {
4039
}
4140
return wrapper as Out
4241
}
43-
44-
private fun toINode(node: Any): INode {
45-
if (node is INode) return node
46-
if (node is NodeAdapterJS) return node.node
47-
if (node is TypedNode) return toINode(node.node)
48-
49-
// Workaround, because ts-model-api is loaded twice by webpack making the instanceof check on TypedNode fail.
50-
val unwrapped = node.asDynamic().node
51-
if (unwrapped != null) return toINode(unwrapped)
52-
53-
throw IllegalArgumentException("Unsupported node type: $node")
54-
}
5542
}

model-api/src/jsMain/kotlin/org/modelix/model/api/NodeAdapterJS.kt

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,42 @@ import IConceptJS
44
import INodeJS
55
import INodeReferenceJS
66
import LanguageRegistry
7+
import TypedNode
78

89
@ExperimentalJsExport
910
@JsExport
1011
object JSNodeConverter {
11-
fun nodeToJs(node: INode): Any {
12+
fun nodeToJs(node: INode?): Any? {
13+
if (node == null) return node
1214
// return type is Any because the import for INodeJS is missing in the generated .d.ts
1315
return NodeAdapterJS(node)
1416
}
1517

16-
fun nodeFromJs(node: Any): Any {
18+
fun nodeFromJs(node: Any?): Any? {
19+
if (node == null) return node
1720
return (node as NodeAdapterJS).node
1821
}
1922

20-
fun unwrapNode(node: Any): Any {
23+
fun unwrapNode(node: Any?): Any? {
24+
if (node == null) return node
2125
return if (node is NodeAdapterJS) node.node else node
2226
}
2327

24-
fun isJsNode(node: Any): Boolean {
28+
fun isJsNode(node: Any?): Boolean {
2529
return node is NodeAdapterJS
2630
}
31+
32+
fun toINode(node: Any): INode {
33+
if (node is INode) return node
34+
if (node is NodeAdapterJS) return node.node
35+
if (node is TypedNode) return toINode(node.node)
36+
37+
// Workaround, because ts-model-api is loaded twice by webpack making the instanceof check on TypedNode fail.
38+
val unwrapped = node.asDynamic().node
39+
if (unwrapped != null) return toINode(unwrapped)
40+
41+
throw IllegalArgumentException("Unsupported node type: $node")
42+
}
2743
}
2844

2945
// workaround: because of the missing import for INodeJS, this intermediate interface prevents it from being generated

0 commit comments

Comments
 (0)