ESM
The ESM filter provides conversion of import and export statements for use with modern ES builders like Webpack and Snowpack.
Examples
import
import "./index.scss"
# => import "./index.scss"
import Something from "./lib/something"
# => import Something from "./lib/something"
import Something, "./lib/something"
# => import Something from "./lib/something"
import [ LitElement, html, css ], from: "lit"
# => import { LitElement, html, css } from "lit"
import React, from: "react"
# => import React from "react"
import React, [ Component ], from: "react"
# => import React, { Component } from "react"
import "*", as: React, from: "react"
# => import * as React from "react"
export
export hash = { ab: 123 }
# => export const hash = {ab: 123};
export func = ->(x) { x * 10 }
# => export const func = x => x * 10;
export def multiply(x, y)
return x * y
end
# => export function multiply(x, y) {
# return x * y
# }
export default class MyClass
end
# => export default class MyClass {
# };
# or final export statement:
export [ one, two, default: three ]
# => export { one, two, three as default }
If the autoexports option is true, all top level modules, classes,
methods and constants will automatically be exported.
If the autoexports option is :default, and there is only one top level
module, class, method or constant it will automatically be exported as
default. If there are multiple, each will be exported with none of them as
default.
Autoimports
The esm filter also provides a way to specify “autoimports” when you run the
conversion. It will add the relevant import statements automatically whenever
a particular class or function name is referenced. These can be either default
or named exports. Simply provide an autoimports hash with one or more keys
to the Ruby2JS.convert method. (NOTE: use camelCase names, not snake_case.) Examples:
require "ruby2js/filter/esm"
puts Ruby2JS.convert('class MyElement < LitElement; end',
eslevel: 2020, autoimports: {[:LitElement] => "lit"})
// JavaScript output:
import { LitElement } from "lit"
class MyElement extends LitElement {}
require "ruby2js/filter/esm"
puts Ruby2JS.convert('AWN.new({position: "top-right"}).success("Hello World")',
eslevel: 2020, autoimports: {:AWN => "awesome-notifications"})
// JavaScript output:
import AWN from "awesome-notifications"
new AWN({position: "top-right"}).success("Hello World")
The value of the autoimports option can be a proc or a lambda function,
in which case it will be invoked with each token eligible for importing. If
this function returns nil, then no imports will be added.
The esm filter is able to recognize if you are defining a class or function within the code itself and it won’t add that import statement accordingly. If for some reason you wish to disable autoimports entirely on a file-by-file basis, you can add a magic comment to the top of the code:
require "ruby2js/filter/esm"
puts Ruby2JS.convert(
"# autoimports: false\n" +
'AWN.new({position: "top-right"}).success("Hello World")',
eslevel: 2020, autoimports: {:AWN => "awesome-notifications"}
)
// autoimports: false
new AWN({position: "top-right"}).success("Hello World")