Skip to content

MercerK/babel-plugin-transform-graal-imports

Repository files navigation

Babel Plugin Transform Graal Imports

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')

How does it work

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');

Getting Started

Add this plugin to your repository:

npm install --dev babel-plugin-transform-graal-imports

Include the plugin in the your babel config (.babelrc)
{
  "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.

Build

Make sure to add the type definitions, add the imports, and build away!

Background

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!

Misc

Feel free to come join us in the Grakkit Discord!

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published