npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

babel-plugin-transform-graal-imports

v0.0.3

Published

<h1 align="center">Babel Plugin Transform Graal Imports</h1>

Downloads

5

Readme

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!