A babel plugin transformer for GraalVM imports.
Be able to use import { Map } from 'java.util'
instead of const Map = Java.type('java.util.Map')
Using Babel, we can look for certain patterns in the Import
statement and convert those into Java.type
.
import { Map, Array } from 'java.util'
becomes
const Map = Java.type('java.util.Map');
const Array = Java.type('java.util.Array');
npm install --dev babel-plugin-transform-graal-imports
{
"presets": [
...
],
"plugins": [
...
"babel-plugin-transform-graal-imports"
]
}
You can add additional options as well!
{
"presets": [
...
],
"plugins": [
...
["babel-plugin-transform-graal-imports", {
"objectName": "core",
"propertyName": "type"
}]
]
}
This will change Java.type
to core.type
.
Make sure to add the type definitions, add the imports, and build away!
GraalVM is a JDK distribution written in Java and other JVM languages along with support for JavaScript, Ruby, Python, etc. This allows you to write JavaScript code in order to access Java classes during runtime.
Depending on the configuration of the GraalVM environment, you may be limited to only accessing those Java classes by
using Java.type('java.util.Map')
. While it does function, type definitions become a bit of a challenge. If you wanted
to extend the type definitions with additional classes for other Java dependencies, you'll need to import the primary
module, extend it, perform black magic, repeat for each instance, and pray it works. It is painful, but it does build
character!
This plugin was created to solve a problem within the Grakkit ecosystem. Grakkit is a Minecraft Java Plugin that leverages GraalVM, which allows existing JavaScript developers to learn Minecraft Plugin development without having to drink Java.
One of the original developers wrote a JavaDoc parser. This allowed Grakkit developers to leverage intellisense for the first time when working with Java classes while writing JavaScript code. Unfortunately, the type definitions became a bit of a struggle.
In early 2022, folks discovered another GraalVM implementation within Minecraft called
CraftJS and they were able to overcome the typing problem using a tool they
created called java-ts-bind. However, Grakkit doesn't operate in the same
fashion as CraftJS, so we couldn't do the import { Map } from 'java.util'
; we needed to do
core.type('java.util.Map')
. Note: core.type
is a wrapper around Java.type
.
After a little inspiration and experimenting, we ended up creating this plugin!
Feel free to come join us in the Grakkit Discord!